高可用Redis(四):列表,集合與有序集合

1.列表類型

1.1 列表數據結構

左邊爲key,是字符串類型
右邊爲value,是一個有序的隊列,與python的列表結構相同
能夠在Redis中對列表的value進行以下操做
    從左邊添加元素
    從右邊添加元素
    從左邊刪除元素
    從右邊刪除元素
    計算列表長度
    刪除列表中指定元素
    從列表中獲取子列表元素
    能夠按照索引來獲取指定元素

1.2 列表類型的特色

有序
能夠重複
左右兩邊插入彈出

1.3 列表類型經常使用的方法

rpush key value1 value2 ... valueN          從列表右端插入值(1-N個)
lpush key value1 value2 ... valueN          從列表左端插入值(1-N個)
linsert key before value newValue           在list指定的值前插入newValue
linsert key after value newValue            在list指定的值後插入newValue
lpop key                                    從列表左側彈出一個item
rpop key                                    從列表右側彈出一個item
lrem key count value                        根據count值,從列表中刪除全部value相等的項
    count > 0,從左到右,刪除最多count個value相等的項
    count < 0,從右到左,刪除最多Math.abs(count)個value相等的項
    count = 0,刪除全部value相等的項
ltrim key start end                         按照索引範圍修剪列表
lrange key start end(包含end)               獲取列表指定索引範圍全部item
lindex key index                            獲取列表指定索引的item
llen key                                    獲取列表長度
lset key index newValue                     設置列表指定索引值爲newValue
blpop key timeout                           lpop阻塞版本,timeout是阻塞超時時間,timeout=0爲永不超時
brpop key timeout                           rpop阻塞版本,timeout是阻塞超時時間,timeout=0爲永不超時

例子:php

127.0.0.1:6379> rpush mylist a b c d
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lpush mylist 0
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> rpop mylist
"d"
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379>

說明:java

lpush加lpop的操做至關於Stack
lpush加rpop的操做至關於Queue
lpush加ltrim的操做至關於Capped Collection
lpush加brpop的操做至關於Message Queue

列表類型API的時間複雜度說明python

rpush,lpush命令的時間複雜度爲O(1)到O(N),由從列表中獲取元素的個數來決定
linsert after/before,lrem,ltrim,lrange,lindex,lset命令的時間複雜度爲O(N)
lpop,rpop,llen,blpop,brpop命令的時間複雜度都是O(1)

2.集合類型

2.1 集合類型數據結構

左邊爲key,是字符串類型
右邊爲value,能夠將一些字符串進行一些組合,是集合類型
能夠向value中添加或者刪除一個元素
Redis中的集合類型還支持集合之間的操做,這與Redis中的其餘數據結構是不一樣的
Redis能夠對兩個集合進行操做,取兩個集合的交集,並集,差集以及對稱差集等等

2.2 集合類型的特色

無序
無重複
支持集合間操做

2.3 集合類型經常使用的方法

sadd key element                向集合key添加element(若是element已經存在,添加失敗)
srem key element                將集合key中的element移除掉
scard user:1:follow             計算集合大小
sismember user:1:follow it      判斷it是否在集合中
srandmember user:1:follow count 從集合中隨機挑count個元素,不破壞集合的結構
spop user:1:follow              從集合中隨機彈出一個元素,彈出後集閤中沒有這個元素了          
smembers user:1:follow          獲取集合全部元素,無序,當心使用

時間複雜度說明:sql

sadd,srem,scard,sismember,srandmember,spop,smember命令的時間複雜度都是O(1)

例子:api

127.0.0.1:6379> sadd user:1:follow it news his sports
(integer) 4
127.0.0.1:6379> smembers user:1:follow
1) "news"
2) "sports"
3) "his"
4) "it"
127.0.0.1:6379> spop user:1:follow
"sports"
127.0.0.1:6379> smembers user:1:follow
1) "news"
2) "his"
3) "it"
127.0.0.1:6379> scard user:1:follow
(integer) 3
127.0.0.1:6379> sismember user:1:follow entertainment
(integer) 0

2.4 集合間API

sdiff                                   差集
sinter                                  交集
sunion                                  並集
sdiff|sinter|sunion + store destkey     將差集,交集,並集結果保存在destkey中

2.5 實戰

在一些抽獎活動中,就能夠用Redis的集合來實現,使用spop把已經中獎的用戶彈出
在社交網絡中,經常使用的如點贊,踩等功能也能夠用集合來實現
社交網絡中,共同關注的好友能夠用集合的交集實現

3.有序集合類型

3.1 有序集合的數據結構

key-value結構
左邊爲key,是字符串類型,右邊爲value,由兩部分組成:score和value
score表示分值,表示value在有序集合中的位置

3.2 有序集合類型經常使用的方法

zadd key score element(能夠是多對)           添加score和element
zrem key element(能夠是多個)                 刪除元素                        
zscore key element                          返回元素的分數         
zincrby key increScore element              增長或減小元素的分數       
zcard key                                   返回元素的總個數
zrange key start end [withscores]           返回指定索引範圍內的升序元素[分值]
zrangebyscore key minScore maxScore         返回指定分數範圍內的長序元素[分值]
zcount len minScore maxScore                返回有序集合內在指定分數範圍內的個數
zremrangebyrank key start end               刪除指定排名內的升序元素        
zremrangebyscore key minScore maxScore      刪除指定分數內的升序元素
zrevrank                獲取有序集合中從高到低的排名 
zrevrange               從高到低排名後獲取必定範圍的值
zrevrangebyscore        按score從高到低排名的結果
zinterstore             對兩個有序集合的交集進行運算,並保存
zunionstore             對兩個有序集合的並集進行運算,並保存

3.3 有序集合經常使用方法的時間複雜度

zadd命令的時間複雜度爲log(N),n是有序集合中元素的個數
zrem,zscore,zincrby,zcard命令的時間複雜度爲O(1)
zrange,zremrangebyrank,zrangebyscore,zcount,zremrangebyscore命令的時間複雜度爲log(N) + m,n爲有序集合元素的個數,m爲有序集合中被操做元素的個數

例子:網絡

127.0.0.1:6379> zadd player:rank 1000 python 900 java 800 php 600 sql
(integer) 4
127.0.0.1:6379> zscore player:rank php
"800"
127.0.0.1:6379> zcard player:rank
(integer) 4
127.0.0.1:6379> zrank player:rank python
(integer) 3
127.0.0.1:6379> zrem player:rank java
(integer) 1
127.0.0.1:6379> zrange player:rank 0 -1 withscores
1) "sql"
2) "600"
3) "php"
4) "800"
5) "python"
6) "1000"

127.0.0.1:6379> zadd player:rank 1000 python 900 java 800 php 600 sql
(integer) 1
127.0.0.1:6379> zrange player:rank 0 -1
1) "sql"
2) "php"
3) "java"
4) "python"
127.0.0.1:6379> zcount player:rank 700 901
(integer) 2
127.0.0.1:6379> zrangebyscore player:rank 700 901
1) "php"
2) "java"
127.0.0.1:6379> zremrangebyrank player:rank 0 1
(integer) 2
127.0.0.1:6379> zrange player:rank 0 -1
1) "java"
2) "python"
127.0.0.1:6379> zrange player:rank 0 -1 withscores
1) "java"
2) "900"
3) "python"
4) "1000"

3.4 有序集合實戰

排行榜

4. 集合與有序集合的區別

都沒有重複元素
集合無序,有序集合是有序的
集合中只有element,有序集合中有element+score

5. 列表與有序集合的區別

列表能夠有重複元素,有序集合沒有重複元素
列表有序,有序集合有序
列表中只有element,有序集合中有element+score
相關文章
相關標籤/搜索