Redis 作為一個(gè)內(nèi)存數(shù)據(jù)庫已經(jīng)被許許多多的公司使用,它的性能非常的優(yōu)秀,讀寫速度支持非常快而且支持 10W 的 QPS 。今天我們就來學(xué)習(xí)下它的豐富的數(shù)據(jù)類型。
Redis 數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。
string(字符串)
字符串類型是Redis的最基本數(shù)據(jù)結(jié)構(gòu)。 字符串類型的值實(shí)際可以為字符串,數(shù)字,二進(jìn)制,但是值最大不能超過512M。
key | value |
---|---|
hello | world |
counter | 1 |
bits | 10000100 |
json | {"id":1,"name":"xiaocai","age":18} |
string命令
設(shè)置
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)
不存在才能設(shè)置成功或者必須存在才能設(shè)置成功
> set hello world nx #不存在才能設(shè)置成功
OK
> set hello w nx #存在就設(shè)置失敗
(nil)
> get hello
"world"
>set hello w xx #存在才能設(shè)置成功
OK
> set world hello xx #不存在就設(shè)置失敗
(nil)
> get hello
"w"
> get world
(nil)
批量設(shè)置
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)
計(jì)數(shù)
incr key
incrby key increment
> set age 18 #value只能為整數(shù)
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)
內(nèi)部編碼
- int 8個(gè)字節(jié)的長整型
- embstr 小于等于39個(gè)字節(jié)的字符串
- raw 大于39個(gè)字節(jié)的字符串
> 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類型是用來存儲(chǔ)多個(gè)有序的字符串。每列字符串稱之為元素。一個(gè)list的最大存儲(chǔ)為2^32-1個(gè)元素。可以對(duì)列表進(jìn)行雙端插入和彈出,也可以指定索引下標(biāo)獲取元素。
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"
索引操作 索引需要對(duì)全部list進(jìn)行遍歷,性能會(huì)隨著元素個(gè)數(shù)的增大而變差
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"
內(nèi)部編碼
- ziplist(壓縮列表):小于3.2版本,當(dāng)元素個(gè)數(shù)小于list-max-ziplist-entries配置(默認(rèn)512個(gè)),同時(shí)每個(gè)元素的值長度都小于list-max-ziplist-value配置(默認(rèn)64字節(jié))
- linkedlist(鏈表):小于3.2版本,不滿足ziplist的條件
- quicklist:Redis 3.2版本,以一個(gè)ziplist為節(jié)點(diǎn)的linkedlist
> object encoding letter
"quicklist"
hash (哈希)
hash是一個(gè)string類型的field和value的映射表。 它適合用于存儲(chǔ)對(duì)象,它是無序的,不能使用索引操作。
hash命令
設(shè)置
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
批量設(shè)置
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"
內(nèi)部編碼
- ziplist(壓縮列表):當(dāng)元素個(gè)數(shù)小于hash-max-ziplist-entries配置(默認(rèn)512個(gè))和每個(gè)元素大小小于hash-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí)
- hashtable(哈希表):不滿足ziplist條件時(shí)
> 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(集合)
用來保存多個(gè)字符串元素,無序的,不能有重復(fù)元素,不能使用索引下標(biāo)獲取元素。一個(gè)集合可以存儲(chǔ)2^32-1個(gè)元素。
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
個(gè)數(shù)
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
隨機(jī)返回指定個(gè)數(shù)
srandmember key [count]
> srandmember user:1:tag
"news"
> srandmember user:1:tag 3
1) "news"
2) "music"
3) "it"
隨機(jī)彈出
spop key [count]
> spop user:1:tag
"news"
> srandmember user:1:tag 3
1) "music"
2) "it"
所有個(gè)數(shù)
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"
內(nèi)部編碼
- intset(整數(shù)集合):元素都是整數(shù)和元素個(gè)數(shù)小于set-max-intset-entries配置(默認(rèn)512個(gè))時(shí)
- hashtable(哈希表):不滿足intset時(shí)
> object encoding user:1:tag
"hashtable"
> sadd numbers 1 2 3 4 5
(integer) 5
> object encoding numbers
"intset"
zset(有序集合)
zset保證了元素不能重復(fù),每個(gè)元素都有一個(gè)分?jǐn)?shù)(score)作為排序的依據(jù)。
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
個(gè)數(shù)
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"
升序返回成員時(shí)帶上分?jǐn)?shù)
> 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"
- 精度問題:內(nèi)部 score 使用 double 類型進(jìn)行存儲(chǔ),所以存在小數(shù)點(diǎn)精度問題
- withscores:帶上分?jǐn)?shù)
降序
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"
根據(jù)score的數(shù)值區(qū)間升序
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"
根據(jù)score的數(shù)值區(qū)間降序
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"
根據(jù)score的數(shù)值降序輸出所有元素
> 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 負(fù)無窮
刪除
zrem key member [member ...]
> zrem books "Effective Java: Second Edition : Java"
(integer) 1
增加分?jǐn)?shù)
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"
內(nèi)部編碼
- ziplist(壓縮列表):元素個(gè)數(shù)小于zset-max-ziplist-entries配置(默認(rèn)128個(gè))和元素長度小于zset-max-ziplist-value配置(默認(rèn)64B)時(shí)
- skiplist(跳躍表):不滿足ziplist時(shí)
> object encoding books
"ziplist"
總結(jié)
這篇文章主要是學(xué)會(huì)基礎(chǔ)的 Redis 數(shù)據(jù)類型和基本的 API 以及每個(gè)數(shù)據(jù)類型背后的原理。
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
796瀏覽量
41757 -
編碼
+關(guān)注
關(guān)注
6文章
957瀏覽量
54950 -
數(shù)據(jù)類型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13662 -
Redis
+關(guān)注
關(guān)注
0文章
378瀏覽量
10938
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論