高可用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為永不超時

例子:

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> 

說明:

lpush加lpop的操作相當於Stack
lpush加rpop的操作相當於Queue
lpush加ltrim的操作相當於Capped Collection
lpush加brpop的操作相當於Message Queue

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

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			獲取集合所有元素,無序,小心使用

時間復雜度說明:

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

例子:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM