Redis基本类型之zset

2022/1/6 2:11:48

本文主要是介绍Redis基本类型之zset,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

累了,学点轻松的,参考《Redis深度历险:核心原理与应用实践》。Redis yyds,高学习回报的技术。然后今天感觉我还是想做银行业的技术开发。老这么做外包式的技术没行业业务经验的提高,至于为何弯路如此,那是一言难尽了。

zset有序集合是Redis的特色数据结构,本身是一个集合,里边元素不会重复,而且还可以绑定一个score,可以按照分数进行排序。zset底层使用了跳表这种数据结构实现。

zset基本方法

zadd 向zset添加元素 zadd key score member:
[root@VM_0_11_centos ~]# redis-cli -c -p 7001 -a password
127.0.0.1:7001> zadd books 9.0 "thinkin Java"
-> Redirected to slot [15901] located at 122.51.112.187:7003
(integer) 1
122.51.112.187:7003> zadd books 8.9 "Java concurrency"
(integer) 1
122.51.112.187:7003> zadd books 8.6 "Netty in Action"
(integer) 1

zrange 遍历zset, 分数从小到大返回所有元素, 分数是double类型:
122.51.112.187:7003> zrange books 0 -1

  1. "Netty in Action"
  2. "Java concurrency"
  3. "thinkin Java"
    0 -1表示从第0个开始到倒数第1个,也就是所有.

zrevrange 倒序遍历
122.51.112.187:7003> zrevrange books 0 -1

  1. "thinkin Java"
  2. "Java concurrency"
  3. "Netty in Action"

zcard 集合里有多少个元素zcard:
122.51.112.187:7003> zcard books
(integer) 3

zscore 获取某个元素的分数zscore:
122.51.112.187:7003> zscore books "Netty in Action"
"8.5999999999999996"

zrank 某个元素排名第几,从0开始:
122.51.112.187:7003> zrank books "Netty in Action"
(integer) 0

zrangebyscore 按分数区间返回元素 -inf表示负无穷:
122.51.112.187:7003> zrangebyscore books -inf 8.91

  1. "Netty in Action"
  2. "Java concurrency"
    122.51.112.187:7003> zrangebyscore books -inf 8.91 withscores
  3. "Netty in Action"
  4. "8.5999999999999996"
  5. "Java concurrency"
  6. "8.9000000000000004"

zrem 删除元素zrem
122.51.112.187:7003> zrem books "Java concurrency"
(integer) 1
122.51.112.187:7003> zrange books 0 -1

  1. "Netty in Action"
  2. "thinkin Java"
跳表,zset的底层实现

首先,zset需要支持随机的插入和删除,数组随机读比较好、插入和删除有大量的复制开销,所以不太适合。那只能选链表了,如果是普通的链表,想象一下一个排序好的链表新增一个元素,需要从头遍历到合适的插入位置进行插入,效率低,二分法也没法用、因为是数组用的。所以Redis使用了特殊的数据结构————跳表。

跳跃列表在原来链表的基础上,每隔几个元素选出来几个作为“上层”元素,然后用另外的指针链接起来形成上层链表,然后从上层链表里再选几个元素形成上上层链表,等等。查找插入点的时候从最上层链表开始定位,逐步缩小查找范围,最后找到插入点。



这篇关于Redis基本类型之zset的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程