Redis学习_2_数据类型_4_set
set介绍与基本操作
set介绍
前面已经学过了string、hash、list三个数据类型,string是一个基本的数据类型,hash是底层是hash表的一个数据类型,list是双向链表结构,他们都有各自的优点,但也有不足的地方,比如我们要存大量数据,且要有快速查询的能力,这3个数据结构就不一定能排上用场了。
这个时候就要用到这次学习的数据结构:set。set其实底层也是一个hash表,存储结构和hash一样,但是,他的键值对里的值全部为nil,我们只用到键值对里面的值。
基本操作
- 添加数据:
sadd key member1 [member2 ...]
,如sadd users jam tom jack rose
。 - 获取全部数据:
smembers key
,如smembers users
。 - 删除数据:
srem key member1 [member2 ...]
,如srem users jam
。 - 获取集合数据总量:
scard key
,如scard users
,这个命令和之前的数据类型不太一样,要区分开。 - 判断集合中是否包含指定数据:
sismember key member
,如sismember users jam
。
set操作随机数据
- 随机从集合中取出指定数量的数据:
srandmember key [count]
,如srandmember users 2
,如果没有指定数量,则默认取一个。 - 随机取一个数据并移除set集合:
spop key
,如spop users
。
set数据交并差操作
- 求集合的交集:
sinter key1 [key2 ...]
,如sinter users1 users2
,注意,可以只传一个set集合,这样的结果就是这个set集合的所有数据,后面的命令同理。 - 求集合的并集:
sunion key1 [key2 ...]
,如sunion users1 users2
。 - 求集合的差集:
sdiff ke1 [key2 ...]
,如sdiff users1 users2
,得到的结果是users1集合去掉和users2集合公共的数据。 - 求集合的交集并存储到指定集合:
sinterstore destination key1 [key2 ...]
,如sinterstore users3 users1 users2
,把users1和users2的交集存到users3中,如果之后又有其他类似的命令对users3赋值,那么这次保存的数据将被清空。 - 求集合的并集并存储到指定集合:
sunionstore destination key1 [key2 ...]
,如sunionstore users3 users1 users2
。 - 求集合的差集并存储到指定集合:
sdiffstore destination key1 [key2 ...]
,如sdiffstore users3 users1 users2
。 - 将指定数据移动到别的集合:
smove source destination member
,如smove users1 users2 jam
,把jam从users1移动到users2,移动后users1中将没有jam这个数据。
set的相关应用场景
随机信息推荐
现在很多应用都会有内容推荐的功能,如网易云音乐的私人FM,B站、知乎在首页也有推荐的内容,这些都是为了提高用户黏性,不断去推荐、发现用户感兴趣的内容。这其中,因为不知道用户准确的兴趣爱好所在,所以需要多尝试不同的内容,而这个内容可能是根据已有的数据得来的,也可能是在当前热门里随机推荐过来的。
如果是随即推荐的话,set就满足这个数据结构的要求,可以存储大量数据,查询数据快,支持随机取数。
关联信息搜索
像QQ、微信、微博等,都有推荐一些可能认识的用户,这些推荐的用户或多或少都与自己有一定的关联,如有多少个共同好友、有多少共同关注的公众号、有多少共同关注的大V等,他其实就是通过一些数据的交并差得到的,对于数据的交并差处理,set也满足这一要求。
用户的权限校验
现在很多系统,都分有用户和角色,不同的角色有不同的权限,而不同的用户又有不同的角色,可以是单个,也可以是多个。当用户登录系统时,具体这个用户具有哪些权限,可以进行哪些操作,我们都可以通过set的交并差数据处理来得到。当然,现在对于权限的控制,已经有很多很成熟的框架了,不需要单独再用redis来做,这里只是举例。
网站访问量统计
网站的访问量有以下几种
- PV:网站被访问次数,刷新页面就可以提高。
- UV:网站被不同用户访问的次数,可以通过cookie来统计,统一用户切换ip,UV不变。
- IP:网站被不同IP访问的次数,可以通过IP地址来统计,相同IP不同用户访问,IP不变。
对于PV,我们用string的incr
命令就行,对于UV、IP我们可以利用set的不重复的特性,比如对于UV,我们只存用户的cookie,访问多次在set里也只有一个数据。
黑白名单
黑白名单和上面的网站访问量相同,对于同一个加入黑/白名单的用户,我们只记录一次,利用到set的数据不重复以及可以判断数据是否存在的特性。