Redis数据库中Set和ZSet的常用命令,高级语法和应用场景

一.简介


SET

  • Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
  • Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
  • 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

Redis底层:底层使用了intset和hashtable两种数据结构,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。

使用Intset的条件:

  • 结合对象保存的所有元素都是整数值
  • 集合对象保存的元素数量不超过512个

为什么用HashTable不用HashSet:是不是因为HashTable是线程安全的?


ZSET

  • Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
  • 有序集合的成员是唯一的,但分数(score)却可以重复

二.Set的基本语法


赋值语法:

SADD key member1 [member2] 
--向集合添加一个或多个成员

例子:建一个集合叫做students,放入a,b,c,d,e 五个学生

127.0.0.1:6379> sadd students a b c d e
(integer) 5


取值语法:

SCARD key //获取集合的成员数 
SMEMBERS key  //返回集合中的所有成员 不是有序的
SISMEMBER key member  //判断 member 元素是否是集合 key 的成员(开发中:验证是否存在判断) 
SRANDMEMBER key [count] //返回集合中一个或多个随机数

下面用这些指令操作一下刚才的students集合

127.0.0.1:6379> scard students //查看students里面有几个元素
(integer) 5
127.0.0.1:6379> smembers students//全部显示
1) "d"
2) "c"
3) "a"
4) "b"
5) "e"
127.0.0.1:6379> sismember students a //a在不在集合里面?
(integer) 1
127.0.0.1:6379> srandmember students //返回随机元素
"a"


删除语法:

SREM key member1 [member2] //移除集合中一个或多个成员
SPOP key [count]  //移除并返回集合中的一个随机元素
SMOVE source destination member 
//将 member 元素从 source 集合移动到 destination 集合


下面是SET的高级语法,主要是跟数学里面集合操作有关,有三种 交集,并集,差集

差集语法:

SDIFF key1  [key2]   //返回给定所有集合的差集(左侧) 
SDIFFSTORE destination key1 [key2]  //返回给定所有集合的差集并存储在 destination 中

例子:新建一个boys,放入a b e f,求不是男生的学生
注意,差集交换顺序结果是不一样的,想要哪个集合的,就把哪个放前面

127.0.0.1:6379> sdiff students boys
1) "d"
2) "c"

交集语法:

SINTER key1 [key2]  //返回给定所有集合的交集(共有数据) 
SINTERSTORE destination key1 [key2]  //返回给定所有集合的交集并存储在 destination 中

并集语法:

SUNION key1 [key2] //返回所有给定集合的并集 
SUNIONSTORE destination key1 [key2]  //所有给定集合的并集存储在 destination 集合中


三.SET的应用场景

  • 以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中
  • 利用唯一性,可以统计访问网站的所有独立 IP

四.ZSET的基本语法

赋值语法:

ZADD key score1 member1 [score2 member2] 
//向有序集合添加一个或多个成员,或者更新已存在成员的分数

例:有一个学生,java得分88,数学得分59,C语言得分65,中文满分

127.0.0.1:6379> zadd z1 88 java 59 math 65 C 100 chinese 
(integer) 4


取值语法

 ZCARD key  //获取有序集合的成员数
 ZCOUNT key min max //计算在有序集合中指定区间分数的成员数
ZRANK key member //返回有序集合中指定成员的索引
 ZRANGE key start stop [WITHSCORES] 
//通过索引区间返回有序集合成指定区间内的成员(低到高)
ZREVRANGE key start stop [WITHSCORES] 
//返回有序集中指定区间内的成员,通过索引,分数从高到底

用刚才的集合试一下

127.0.0.1:6379> zcard z1
(integer) 4
127.0.0.1:6379> zcount z1 60 100 
(integer) 3
127.0.0.1:6379> zrank z1 java
(integer) 2
127.0.0.1:6379> zrange z1 0 -1 //从低分到高分排序
1) "math"
2) "C"
3) "java"
4) "chinese"
127.0.0.1:6379> zrevrange z1 0 -1//从高分到低分排序
1) "chinese"
2) "java"
3) "C"
4) "math"



删除语法:

ZREM key member [member ...] //移除有序集合中的一个或多个成员
ZREMRANGEBYRANK key start stop //移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序)
ZREMRANGEBYSCORE key min max //移除有序集合中给定的分数区间的所有成员

删除这个大家自己试一下吧


五.ZSET的应用场景

常应用于:排行榜

  • 比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的 时间大的放在前面,所以应该是用zrevrange 0 -1 显示
  • 比如一个存储全班同学成绩的Sorted Set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
  • 还可以用Sorted Set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行

你可能感兴趣的:(Set,ZSet,Redis,Redis)