累了,学点轻松的,参考《Redis深度历险:核心原理与应用实践》。Redis yyds,高学习回报的技术。然后今天感觉我还是想做银行业的技术开发。老这么做外包式的技术没行业业务经验的提高,至于为何弯路如此,那是一言难尽了。
zset有序集合是Redis的特色数据结构,本身是一个集合,里边元素不会重复,而且还可以绑定一个score,可以按照分数进行排序。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
zrevrange 倒序遍历
122.51.112.187:7003> zrevrange books 0 -1
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
zrem 删除元素zrem
122.51.112.187:7003> zrem books "Java concurrency"
(integer) 1
122.51.112.187:7003> zrange books 0 -1
首先,zset需要支持随机的插入和删除,数组随机读比较好、插入和删除有大量的复制开销,所以不太适合。那只能选链表了,如果是普通的链表,想象一下一个排序好的链表新增一个元素,需要从头遍历到合适的插入位置进行插入,效率低,二分法也没法用、因为是数组用的。所以Redis使用了特殊的数据结构————跳表。
跳跃列表在原来链表的基础上,每隔几个元素选出来几个作为“上层”元素,然后用另外的指针链接起来形成上层链表,然后从上层链表里再选几个元素形成上上层链表,等等。查找插入点的时候从最上层链表开始定位,逐步缩小查找范围,最后找到插入点。