一文了解:Redis基礎類型
- 2019 年 10 月 3 日
- 筆記
一文了解:Redis基礎類型
Redis特點
開源的,BSD許可高級的key-value存儲系統
可以用來存儲字元串,哈希結構,鏈表,集合
安裝
windows:https://github.com/microsoftarchive/redis/releases
maclinux:http://www.redis.cn/
Redis 數據類型
Redis支援五種數據類型:string(字元串),hash(哈希),list(列表),set(集合)及zset(有序集合)。
string(字元串)
字元串類型是Redis的最基本數據結構。
字元串類型的值實際可以為字元串,數字,二進位,但是值最大不能超過512M。
| key | value |
|---|---|
| hello | world |
| counter | 1 |
| bits | 10000100 |
| json | {"id":1,"name":"xiaocai","age":18} |
string命令
設置
set key value [EX seconds] [PX milliseconds] [NX|XX]
get key
> set name xiaocai OK > get name "xiaocai" 過期
setex key seconds value
> set name1 redis1 ex 10 #10秒後過期 OK > get name1 (nil) > setex name2 10 redis2 #10秒後過期 OK > get name2 "redis2" > get name2 (nil) > set name3 redis3 px 10 #10豪秒後過期 OK > get name3 (nil) 不存在才能設置成功或者必須存在才能設置成功
> set hello world nx #不存在才能設置成功 OK > set hello w nx #存在就設置失敗 (nil) > get hello "world" >set hello w xx #存在才能設置成功 OK > set world hello xx #不存在就設置失敗 (nil) > get hello "w" > get world (nil) 批量設置
mset key value [key value ...] mget key [key ...] > mset name1 redis1 name2 redis2 OK > mget name1 name2 1) "redis1" 2) "redis2" > mget name1 name2 name3 1) "redis1" 2) "redis2" 3) (nil) 計數
incr key
incrby key increment
> set age 18 #value只能為整數 OK > incr age (integer) 19 > incrby age -5 (integer) 14 > incrby age 10 (integer) 24 刪除
del key [key ...]
> del age (integer) 1 > get age (nil) 內部編碼
- int 8個位元組的長整型
- embstr 小於等於39個位元組的字元串
- raw 大於39個位元組的字元串
> set port 6379 OK > object encoding port "int" > set hello world OK > object encoding hello "embstr" > set longString abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz OK > object encoding hello "raw" > strlen longString (integer) 52 list(列表)
list類型是用來存儲多個有序的字元串。每列字元串稱之為元素。一個list的最大存儲為2^32-1個元素。可以對列表進行雙端插入和彈出,也可以指定索引下標獲取元素。

list命令
頭部和尾部添加元素
lpush key value [value ...]
rpush key value [value ...]
lrange key start stop
> lpush letter "a" (integer) 1 > lpush letter "b" (integer) 2 > lpush letter "c" (integer) 3 > lrange letter 0 -1 1) "c" 2) "b" 3) "a" > rpush letter "a" (integer) 4 > rpush letter "b" (integer) 5 > rpush letter "c" > lrange letter 0 -1 1) "c" 2) "b" 3) "a" 4) "a" 5) "b" 6) "c" 頭部和尾部彈出元素
lpop key
rpop key
> lpop letter "c" > lpop letter "b" > lrange letter 0 -1 1) "a" 2) "a" 3) "b" 4) "c" > rpop letter "c" > rpop letter "b" > lrange letter 0 -1 1) "a" 2) "a" 索引操作
索引需要對全部list進行遍歷,性能會隨著元素個數的增大而變差
lrange key start stop
lindex key index
ltrim key start stop
len key
> rpush letter b c (integer) 4 > lrange letter 0 -1 1) "a" 2) "a" 3) "b" 4) "c" > lindex letter 2 "b" > ltrim letter 0 -2 OK > lrange letter 0 -1 1) "a" 2) "a" 3) "b" > llen letter (integer) 3 插入
insert key BEFORE|AFTER pivot value
> linsert letter before b c (integer) 4 > linsert letter after a d (integer) 5 > lrange letter 0 -1 1) "a" 2) "d" 3) "a" 4) "c" 5) "b" 修改
set key index value
> lset letter 2 B OK > lrange letter 0 -1 1) "a" 2) "d" 3) "B" 4) "c" 5) "b" 內部編碼
- ziplist(壓縮列表):小於3.2版本,當元素個數小於list-max-ziplist-entries配置(默認512個),同時每個元素的值長度都小於list-max-ziplist-value配置(默認64位元組)
- linkedlist(鏈表):小於3.2版本,不滿足ziplist的條件
- quicklist:Redis 3.2版本,以一個ziplist為節點的linkedlist
> object encoding letter "quicklist" hash (哈希)
hash是一個string類型的field和value的映射表。 它適合用於存儲對象,它是無序的,不能使用索引操作。

hash命令
設置
hset key field value
> hset user:1 name zhangSan (integer) 1 > hset user:1 age 18 (integer) 1 獲取和獲取所有的field-value
hget key field
hgetall key
> hget user:1 name "zhangSan" > hgetall user:1 1) "name" 2) "zhangSan" 3) "age" 4) "18" 刪除
hdel key field [field ...]
> hdel user:1 age (integer) 1 > hdel user:2 age (integer) 0 長度
hlen key
> hlen user:1 (integer) 1 批量設置
hmset key field value [field value ...]
> hmset user:2 name liSi age 23 OK > hmget user:2 name age 1) "liSi" 2) "23" > hlen user:1 (integer) 1 > hlen user:2 (integer) 2 是否存在
hexists key field
> hexists user:2 name (integer) 1 > hexists user:2 city (integer) 0 所有的field和所有的value
hkeys key
hvals key
> hkeys user:1 1) "name" > hkeys user:2 1) "name" 2) "age" > hvals user:1 1) "zhangSan" > hvals user:2 1) "liSi" 內部編碼
- ziplist(壓縮列表):當元素個數小於hash-max-ziplist-entries配置(默認512個)和每個元素大小小於hash-max-ziplist-value配置(默認64位元組)時
- hashtable(哈希表):不滿足ziplist條件時
> object encoding user:1 "ziplist" 修改配置文件hash-max-ziplist-entries為5
> hmset test t1 v1 t2 v2 t3 v3 t4 v4 t5 v5 t6 v6 OK > object encoding test "hashtable" set(集合)
用來保存多個字元串元素,無序的,不能有重複元素,不能使用索引下標獲取元素。一個集合可以存儲2^32-1個元素。

set命令
增加
add key member [member ...]
> sadd user:1:tag it music news (integer) 3 > sadd user:1:tag bike news (integer) 1 刪除
srem key member [member ...]
> srem user:1:tag bike (integer) 1 個數
scard key
> scard user:1:tag (integer) 3 是否存在
sismember key member
> sismember user:1:tag bike (integer) 0 > sismember user:1:tag it (integer) 1 隨機返回指定個數
srandmember key [count]
> srandmember user:1:tag "news" > srandmember user:1:tag 3 1) "news" 2) "music" 3) "it" 隨機彈出
spop key [count]
> spop user:1:tag "news" > srandmember user:1:tag 3 1) "music" 2) "it" 所有個數
smembers key
> smembers user:1:tag 1) "music" 2) "it" 交集
sinter key [key ...]
> sinter user:1:tag user:2:tag 1) "music" 2) "it" 並集
sunion key [key ...]
> sunion user:1:tag user:2:tag 1) "music" 2) "java" 3) "run" 4) "it" 差集
sdiff key [key ...]
> sdiff user:1:tag user:2:tag (empty list or set) > sadd user:1:tag sleep (integer) 1 > sdiff user:1:tag user:2:tag 1) "sleep" > sdiff user:2:tag user:1:tag 1) "java" 2) "run" 內部編碼
- intset(整數集合):元素都是整數和元素個數小於set-max-intset-entries配置(默認512個)時
- hashtable(哈希表):不滿足intset時
> object encoding user:1:tag "hashtable" > sadd numbers 1 2 3 4 5 (integer) 5 > object encoding numbers "intset" zset(有序集合)
zset保證了元素不能重複,每個元素都有一個分數(score)作為排序的依據。

zset命令
添加
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
> zadd books 8.2 "Redis in Action" (integer) 1 > zadd books 9.3 "Effective Java: Second Edition : Java" (integer) 1 > zadd books 9.1 "Think in Java" (integer) 1 > zadd books 9.3 "Python Cookbook" 9.0 "Effective Python" (integer) 2 個數
zcard key
> zcard books (integer) 5 升序返回範圍的成員
zrange key start stop [WITHSCORES]
> zrange books 0 -1 1) "Redis in Action" 2) "Effective Python" 3) "Think in Java" 4) "Effective Java: Second Edition : Java" 5) "Python Cookbook" > zrange books 2 5 1) "Think in Java" 2) "Effective Java: Second Edition : Java" 3) "Python Cookbook" 升序返回成員時帶上分數
> zrange books 0 -1 withscores 1) "Redis in Action" 2) "8.1999999999999993" 3) "Effective Python" 4) "9" 5) "Think in Java" 6) "9.0999999999999996" 7) "Effective Java: Second Edition : Java" 8) "9.3000000000000007" 9) "Python Cookbook" 10) "9.3000000000000007" > zrange books 2 5 withscores 1) "Think in Java" 2) "9.0999999999999996" 3) "Effective Java: Second Edition : Java" 4) "9.3000000000000007" 5) "Python Cookbook" 6) "9.3000000000000007" - 精度問題:內部 score 使用 double 類型進行存儲,所以存在小數點精度問題
- withscores:帶上分數
降序
zrevrange key start stop [WITHSCORES]
> zrevrange books 0 -1 withscores 1) "Python Cookbook" 2) "9.3000000000000007" 3) "Effective Java: Second Edition : Java" 4) "9.3000000000000007" 5) "Think in Java" 6) "9.0999999999999996" 7) "Effective Python" 8) "9" 9) "Redis in Action" 10) "8.1999999999999993" 指定value的score
zscore key member
> zscore books "Think in Java" "9.0999999999999996" 根據score的數值區間升序
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
> zrangebyscore books 0 9.1 withscores 1) "Redis in Action" 2) "8.1999999999999993" 3) "Effective Python" 4) "9" 5) "Think in Java" 6) "9.0999999999999996" 根據score的數值區間降序
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
> zrevrangebyscore books 9.1 0 withscores 1) "Think in Java" 2) "9.0999999999999996" 3) "Effective Python" 4) "9" 5) "Redis in Action" 6) "8.1999999999999993" 根據score的數值降序輸出所有元素
> zrevrangebyscore books +inf -inf withscores 1) "Python Cookbook" 2) "9.3000000000000007" 3) "Effective Java: Second Edition : Java" 4) "9.3000000000000007" 5) "Think in Java" 6) "9.0999999999999996" 7) "Effective Python" 8) "9" 9) "Redis in Action" 10) "8.1999999999999993" - +inf 正無窮
- -inf 負無窮
刪除
zrem key member [member ...]
> zrem books "Effective Java: Second Edition : Java" (integer) 1 增加分數
zincrby key increment member
> zincrby books 2 "Redis in Action" "10.199999999999999" > zincrby books -1 "Redis in Action" "9.1999999999999993" 交集
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE
> zadd textbooks 8 "chinese" 9 "english" 9.5 "mathematics" (integer) 3 > zadd textbooks 9.2 "Think in Java" (integer) 1 > zrange books 0 -1 1) "Redis in Action" 2) "Effective Python" 3) "Think in Java" 4) "Python Cookbook" > zrange textbooks 0 -1 1) "chinese" 2) "english" 3) "Think in Java" 4) "mathematics" > zinterstore newbooks 2 books textbooks (integer) 1 > zrange newbooks 0 -1 1) "Think in Java" 並集
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE
> zunionstore newUnionbooks 2 books textbooks (integer) 7 > zrange newUnionbooks 0 -1 1) "chinese" 2) "Redis in Action" 3) "Effective Python" 4) "english" 5) "Python Cookbook" 6) "mathematics" 7) "Think in Java" 內部編碼
- ziplist(壓縮列表):元素個數小於zset-max-ziplist-entries配置(默認128個)和元素長度小於zset-max-ziplist-value配置(默認64B)時
- skiplist(跳躍表):不滿足ziplist時
> object encoding books "ziplist" 結語
本人深知水平有限,歡迎指正本文錯誤之處。
參考資料
《Redis 實戰》
《Redis 開發與運維》
《Redis 深度歷險:核心原理與應用實踐》