zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set ,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score ,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。

zset 中最后一个 value 被移除后,数据结构自动删除,内存被回收。

zset 可以用来存粉丝列表, value 值是粉丝的用户 ID score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

zset 还可以用来存储学生的成绩, value 值是学生的 ID score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。

1. sorted set 类型相关命令

命令 说明
zadd key score member 添加元素到集合,元素在集集合中存在则更新应对的score
zrem key member 删除指定元素
zcount key min max 返回分数范围内的成员变量
zincrby key incr member 按照incr幅度增加对应member的score值,返回score值
zrank key member 返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
zrevrank key member 集合中元素是按score从大到小排序的
zrange key start end 从集合中选择指定区间的元素,返回的是有序集合
zrevrange key start end 同上,返回结果是按score逆序的
zcard key 返回集合中元素的个数
zscore key member 返回给定元素对应的score
zremrangebyrank key min max 删除集合中排名在给定区间的元素
zinterstore distination numkeys 相交多个结果集,导致排序的设置存储在一个新的结果集
zunionstore destination numberkeys 添加多个排序集合导致排序的设置存储在一个新的结果集,可以实现取得最大值(max),取得最小值(min)

2. 使用示例

127.0.0.1:6379> flushdb
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> zadd jack 90 english
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
127.0.0.1:6379> zadd tom 80 english
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
2) "tom"
127.0.0.1:6379> zrem tom english		# 删除指定元素 
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
127.0.0.1:6379> zadd tom 80 english
(integer) 1
127.0.0.1:6379> zadd tom 95 math
(integer) 1
127.0.0.1:6379> zadd tom 91 chinese
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
2) "tom"
127.0.0.1:6379> zcount tom 90 100		# 返回分数范围内的成员变量   
(integer) 2
127.0.0.1:6379> zincrby tom 3 chinese
127.0.0.1:6379> zrank tom chinese
(integer) 1
127.0.0.1:6379> zrank tom english
(integer) 0
127.0.0.1:6379> zrank tom math
(integer) 2
127.0.0.1:6379> zrevrank tom math
(integer) 0
127.0.0.1:6379> zrange tom 0 2
1) "english"
2) "chinese"
3) "math"
127.0.0.1:6379> zrevrange tom 0 2
1) "math"
2) "chinese"
3) "english"
127.0.0.1:6379> zcard tom
(integer) 3
127.0.0.1:6379> zscore tom math
127.0.0.1:6379> 

从集合中选择指定区间的元素,返回的是有序集合,如果要加上所携带的分数时,需要使用带有 withscores 字段的语句。

127.0.0.1:6379> zrange tom 0 -1 withscores
1) "english"
2) "80"
3) "chinese"
4) "94"
5) "math"
6) "95"

3. 容器型数据结构的通用规则

list/set/hash/zset 这四种数据结构是容器型数据结构,它们共享下面两条通用规则:

  • create if not exists

如果容器不存在,那就创建一个,再进行操作。比如 rpush 操作刚开始是没有列表的,Redis 就会自动创建一个,然后再 rpush 进去新元素。

  • drop if no elements

如果容器里元素没有了,那么立即删除元素,释放内存。这意味着 lpop 操作到最后一个元素,列表就消失了。

4. 过期时间

Redis 所有的数据结构都可以设置过期时间,时间到了,Redis 会自动删除相应的对象。需要注意的是过期是以对象为单位,比如一个 hash 结构的过期是整个 hash 对象的过期,而不是其中的某个子 key

还有一个需要特别注意的地方是如果一个字符串已经设置了过期时间,然后你调用了 set 方法修改了它,它的过期时间会消失。

127.0.0.1:6379> set str "hello world"
127.0.0.1:6379> expire str 300
(integer) 1
127.0.0.1:6379> ttl str
(integer) 295
127.0.0.1:6379> ttl str
(integer) 294
127.0.0.1:6379> set str "hello"
127.0.0.1:6379> ttl str
(integer) -1
127.0.0.1:6379> 
                    zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。zset 中最后一个 value 被移除后,数据结构自动删除,内存被回收。zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。zset 还可以用来存储学生的成绩,value 值是
				
1、zadd :添加元素,格式是:zadd zset的key score值 项的值, Score和项可以是多对,score可以是整数,也可以是浮点数,还可以是+inf表示无穷大,-inf表示负无穷大 操作如下: java示例代码: import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.Map; * redis中对于ZSet类型的: zadd 操作示例 * zadd :添加...
Redis不支持给set里面的成员设置过期时间,目前只能给顶级key设置过期时间。 换个思路,可以利用有序数组,存的时候将score设置成当时的时间戳。再跑个计划任务,每天晚上12点后将score小于12点时间戳的成员清除掉就行了。 redisTemplate.opsForZSet().add(key,object,System.currentTimeMillis()/1000); sorted setset的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加 修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有 两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。  和set一样sorted  set也是string类型元素集合,不同的是每个元素都会关联一个double docker load 出错 open /var/lib/docker/tmp/docker-import-837327978/bin/json: no such file or directory 24001 Ubuntu 安装 NVIDIA 显卡驱动详细步骤(ERROR: The Nouveau kernel driver is currently in use by your system) 23046