累了,學點輕松的,參考《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
- "Netty in Action"
- "Java concurrency"
- "thinkin Java"
0 -1表示從第0個開始到倒數第1個,也就是所有.
zrevrange 倒序遍歷
122.51.112.187:7003> zrevrange books 0 -1
- "thinkin Java"
- "Java concurrency"
- "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
- "Netty in Action"
- "Java concurrency"
122.51.112.187:7003> zrangebyscore books -inf 8.91 withscores - "Netty in Action"
- "8.5999999999999996"
- "Java concurrency"
- "8.9000000000000004"
zrem 刪除元素zrem
122.51.112.187:7003> zrem books "Java concurrency"
(integer) 1
122.51.112.187:7003> zrange books 0 -1
- "Netty in Action"
- "thinkin Java"
跳表,zset的底層實現
首先,zset需要支持隨機的插入和刪除,數組隨機讀比較好、插入和刪除有大量的復制開銷,所以不太適合。那只能選鏈表了,如果是普通的鏈表,想象一下一個排序好的鏈表新增一個元素,需要從頭遍歷到合適的插入位置進行插入,效率低,二分法也沒法用、因為是數組用的。所以Redis使用了特殊的數據結構————跳表。
跳躍列表在原來鏈表的基礎上,每隔幾個元素選出來幾個作為“上層”元素,然后用另外的指針鏈接起來形成上層鏈表,然后從上層鏈表里再選幾個元素形成上上層鏈表,等等。查找插入點的時候從最上層鏈表開始定位,逐步縮小查找范圍,最后找到插入點。