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