set类型结构
list类型也能存储很多数据,为什么还要有set类型呢?因为list是基于双向链表的底层结构,查询时候比较慢。
类似于hash类型,但是没有hash中的value,hash中的field当成set的value
一、set类型数据的基本操作
添加数据 sadd key member1 member2 ...
获取全部数据 smembers key
删除数据 srem key member1 member2 ...
获取集合数据总量 scard key
判断集合中是否包含指定数据 sismember key member #如果存在返回1,不存在返回0
二、set类型数据的扩展操作
1.业务场景:使用set随机操作数据
Redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,应用推荐等等
随机获取集合中指定数量的数据 srandmember key count #count指获取数据的个数 随机获取集合中的某个数据并将该数据移除集合 spop key
2.业务场景:set数据交并差操作
Redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索(显示共同关注,共同好友)
求两个集合的交、并、差集 sinter key1 key2 sunion key1 key2 sdiff key1 key2 求两个集合的交、并、差集合并存储到指定集合中 sinterstore destination key1 key2 #sinterstore u3 u1 u2 将u1,u2的交集放到u3中 sunionstore destination key1 key2 sdiffstore destination key1 key2 将指定数据从原始集合中移动到目标集合中 smove source destination member #smove u2 u1 a 将u2中的a移动到u1中
三、Set类型数据操作的注意事项
四、Set类型应用场景
1.业务场景:多个角色进行权限的去重并集
解决方案
当一个用户存在多个角色,并且每个角色包含多个权限,快速进行权限校验:去除不同角色相同的权限
给角色rid:001设置权限getall/getById 给角色rid:002设置权限getCount/getall/insert 将两个角色相同的权限放进一个新的set中uid:007,求并集
2.业务场景:统计网站的PV(访问量),UV(独立访客,cookie值),IP(独立IP)
解决方案
利用set对同类数据进行去重