Redis的基本數據型別及運用場景

2020-08-14 21:08:16

Redis的基本數據型別及運用場景

簡介

Redis是一個開源的使用ANSI C語言編寫、遵守BSD協定、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它通常被稱爲數據結構伺服器,因爲值(value)可以是 字串(String), 雜湊(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等型別。

String

String是Redis最基本的數據型別,上面的簡介中也說到Redis是用c語言開發的。但是Redis中的字串和c語言中的字串型別卻是有明顯的區別;
string型別是Redis最基本的數據型別,一個redis中字串value最多可以是512M
基本命令

命令 說明 案例
set 新增key-value set username admin
get 根據key獲取數據 get username
strlen 獲取key的長度 strlen key
exists 判斷key是否存在 exists name 返回1存在 0不存在
del 刪除redis中的key del key
keys 用於查詢符合條件的key keys * 查詢redis中全部的key;keys n?me 使用佔位符獲取數據;keys nam* 獲取nam開頭的數據
mset 賦值多個key-value mset key1 value1 key2 value2 key3 value3
mget 獲取多個key的值 mget key1 key2
append 對某個key的值進行追加 append key value
type 檢查某個key的型別 type key
select 切換redis數據庫 select 0-15 redis中共有16個數據庫
flushdb 清空單個數據庫 flushdb
flushall 清空全部數據庫 flushall
incr 自動加1 incr key
decr 自動減1 decr key
incrby 指定數值新增 incrby 10
decrby 指定數值減 decrby 10
expire 指定key的生效時間 單位秒 expire key 20 key20秒後失效
pexpire 指定key的失效時間 單位毫秒 pexpire key 2000;key 2000毫秒後失效
ttl 檢查key的剩餘存活時間 ttl key
persist 復原key的失效時間 persist key

setex(set with expire)鍵秒值
setex:設定帶過期時間的key,動態設定。
setex 鍵 秒值 真實值
setnx(set if not exist)
setex(set with expire)鍵秒值/setnx(set if not exist)
**應用場景:**保證圖片(Base64);統計粉絲數;包含使用者資訊

List

Redis中的List集合是雙端回圈列表,分別可以從左右兩個方向插入數據.
底層實際是個鏈表
List集合可以當做佇列使用,也可以當做棧使用
佇列:存入數據的方向和獲取數據的方向相反
棧:存入數據的方向和獲取數據的方向相同
基本命令

命令 說明 案例
lpush 從佇列的左邊入隊一個或多個元素 LPUSH key value [value …]
rpush 從佇列的右邊入隊一個或多個元素 RPUSH key value [value …]
lpop 從佇列的左端出隊一個元素 LPOP key
rpop 從佇列的右端出隊一個元素 RPOP key
lpushx 當佇列存在時從佇列的左側入隊一個元素 LPUSHX key value
rpushx 當佇列存在時從佇列的右側入隊一個元素 RPUSHx key value
lrange 從列表中獲取指定返回的元素 LRANGE key start stop
Lrange key 0 -1 獲取全部佇列的數據
lrem 從存於 key 的列表裏移除前 count 次出現的值爲 value 的元素
Lset 設定 index 位置的list元素的值爲 value LSET key index value

效能總結
它是一個字串鏈表,left、right都可以插入新增;
如果鍵不存在,建立新的鏈表;
如果鍵已存在,新增內容;
如果值全移除,對應的鍵也就消失了。
鏈表的操作無論是頭和尾效率都極高,但假如是對中間元素進行操作,效率就很慘淡了。
應用場景:阻塞佇列

Hash

Redis hash 是一個鍵值對集合。
Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
類似Java裏面的Map<String,Object>
Hash物件的實現方式有兩種分別是ziplist、hashtable,其中hashtable的儲存方式key是String型別的,value也是以key value的形式進行儲存。
字典型別的底層就是hashtable實現的,明白了字典的底層實現原理也就是明白了hashtable的實現原理,hashtable的實現原理可以於HashMap的是底層原理相類比
例子:User物件{id:2,name:小明,age:19}
基本命令:

命令 說明 案例
hset 爲物件新增數據 hset key field value
hget 獲取物件的屬性值 hget key field
hexists 判斷物件的屬性是否存在 HEXISTS key field;1表示存在 0表示不存在
hdel 刪除hash中的屬性 hdel user field [field …]
hgetall 獲取hash全部元素和值 HGETALL key
hkyes 獲取hash中的所有欄位 HKEYS key
hlen 獲取hash中所有屬性的數量 hlen key
hmget 獲取hash裏面指定欄位的值 hmget key field [field …]
hmset 爲hash的多個欄位設定值 hmset key field value [field value …]
hsetnx 設定hash的一個欄位,只有當這個欄位不存在時有效 HSETNX key field value
hstrlen 獲取hash中指定key的長度 HSTRLEN key field
hvals 獲取hash的所有值 HVALS user

Set

Set(集合)
Redis的Set是string型別的無序集合。它是通過HashTable實現實現的,
基本命令

命令 說明
sadd key value 向set新增元素
srem key value 從set中移除元素
smembers key 取出所有set元素
sismember key value 檢視value是否存在set中
sunion key1 key2 … keyn 將所有key合併後取出來,相同的值只取一次
scard key 獲取set中元素的個數
srandmember key return a random element from a set, without removing the element.隨機取出一個
sdiff key1 key2 … keyn 獲取第一set中不存在後面幾個set裡的元素。
sdiffstore dstkey key1 key2 … keyn 和sdiff相同,獲取key1中不存在其他key裡的元素,但要儲存到dstkey中。
sinter key1 key2 … keyn 取出這些set的交集
sinterstore dstkey key1 key2 … keyn 取出這些key的交集並儲存到dstkey
smove srckey dstkey member 將元素member從srckey中轉移到dstkey中,這個操作是原子的。

應用場景:去重、抽獎、共同好友、二度好友

Zset

基本命令
zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double型別的分數。
redis正是通過分數來爲集閤中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複
實現原理
與set無順序儲存不同,Zset按score順序進行儲存,這也是爲什麼基本操作都是O(log(N))複雜度。
Redis使用兩種結構儲存zset,在數據個數較少時使用ziplist,數量超出閾值時使用skiplist,閾值通過zset-max-ziplist-entries and zset-max-ziplist-value設定
redis zset內部實現
Redis Zset 實現原理

命令 說明
zadd key score member 向有序set中新增元素member,其中score爲分數,預設升序;
zrange key start end [withscores] 獲取按score從低到高索引範圍內的元素,索引可以是負數,-1表示最後一個,-2表示倒數第二個,即從後往前。withscores可選,表示獲取包括分數。
zrevrange key start end [withscores] 同上,但score從高到低排序。
zcount key min man 獲取score在min和max範圍內的元素的個數
zcard key 獲取集閤中元素的個數。
zincrby key increment member 根據元素,score原子增加increment.
zremrangebyscore key min max 清空集合內的score位於min和max之間的元素。
zrank key member 獲取元素的索引(照score從低到高排列)。
zrem key member 移除集閤中的該元素
zscore key member 獲取該元素的score

應用場景:排行榜前前10名的選手

其他參考

最詳細的redis五種數據結構詳解
https://juejin.im/post/6844904192042074126
Redis 和 I/O 多路複用
https://draveness.me/redis-io-multiplexing/
中文文件
http://www.redis.cn/