一文了解: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)

內部編碼

  1. int 8個位元組的長整型
  2. embstr 小於等於39個位元組的字元串
  3. 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"

內部編碼

  1. ziplist(壓縮列表):小於3.2版本,當元素個數小於list-max-ziplist-entries配置(默認512個),同時每個元素的值長度都小於list-max-ziplist-value配置(默認64位元組)
  2. linkedlist(鏈表):小於3.2版本,不滿足ziplist的條件
  3. 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"

內部編碼

  1. ziplist(壓縮列表):當元素個數小於hash-max-ziplist-entries配置(默認512個)和每個元素大小小於hash-max-ziplist-value配置(默認64位元組)時
  2. 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"

內部編碼

  1. intset(整數集合):元素都是整數和元素個數小於set-max-intset-entries配置(默認512個)時
  2. 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"
  1. 精度問題:內部 score 使用 double 類型進行存儲,所以存在小數點精度問題
  2. 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"
  1. +inf 正無窮
  2. -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"

內部編碼

  1. ziplist(壓縮列表):元素個數小於zset-max-ziplist-entries配置(默認128個)和元素長度小於zset-max-ziplist-value配置(默認64B)時
  2. skiplist(跳躍表):不滿足ziplist時
> object encoding books  "ziplist"

結語

本人深知水平有限,歡迎指正本文錯誤之處。

參考資料

《Redis 實戰》

《Redis 開發與運維》

《Redis 深度歷險:核心原理與應用實踐》

logo

Tags: