[redis]基礎數據類型

    在進入正題之前,我們先下載一個工具【redis desktop manager】用於可視化觀察數據結構。
    
    在redis中每一個唯一的key值對應一個value,這裏的key就是數據的名字,而value就是用來存儲的數據,它可以有不同的數據結構。在redis共提供了5中數據類型,接下來我們將逐一介紹每種數據類型的特性及使用方法。
類型
描述
string
字符串
list
列表
hash
字典
set
集合
zset
有序集合
1、string
    string是redis最簡單的數據結構,它就是一個字符數組。當存儲的字符數據小於1MB的時候,每次擴容會翻倍現有空間,如果字
符數據大於1MB,每次擴容會擴1MB,當然string結構的value是有長度上限的,redis把它的上限設置爲了512MB
 
命令
描述
set
新增值
get
獲取值
del
刪除值
mset
批量新增
mget
返回列表
incr
自增 1
incrby
增加指定數值
命令演示:

# 設置value
127.0.0.1:6379> set iphone-name ranen
OK
127.0.0.1:6379> set iphone2-name echo
OK
# 返回列表
127.0.0.1:6379> mget iphone-name iphone2-name
1) "ranen"
2) "echo"
# 批量設置
127.0.0.1:6379> mset ranen-name wangp echo-name qiujy
OK
# 返回列表
127.0.0.1:6379> mget ranen-name echo-name
1) "wangp"
2) "qiujy"
# 刪除
127.0.0.1:6379> del ranen-name
(integer) 1
127.0.0.1:6379> mget ranen-name echo-name
1) (nil)
2) "qiujy"
# value 爲 int 類型可以實現自增功能,通常自增範圍在 signed long 的 [min,max] 之間
127.0.0.1:6379> set ranen-age 26
OK
127.0.0.1:6379> get ranen-age
"26"
# 自增 1
127.0.0.1:6379> incr ranen-age
(integer) 27
127.0.0.1:6379> get ranen-age
"27"
# 增加 10
127.0.0.1:6379> incrby ranen-age 10
(integer) 37
127.0.0.1:6379> get ranen-age
"37"
# 減 10
127.0.0.1:6379> incrby ranen-age -10
(integer) 27
127.0.0.1:6379> get ranen-age
"27"

 

使用場景:
  • 緩存用戶信息,將用戶數據、權限數據、tocken轉爲json字符串,然後存儲在redis。
  • 生成token存放在redis。
2、list
    list我們可以同向類比爲java裏面的LinkedList,意味着插入和刪除都很快,但是索引定位會很慢。一般我們使用list實現隊列、棧操作。
    list的數據結構並非一個簡單的鏈表,而是一個“快速列表”,快速列表每個節點又都爲一個壓縮列表。這樣既保證了內存的使用效率,又便於數據的push和pop。
 
 
    有興趣的可以去看下redis 的ziplist.h、ziplist.c。這裏可知的是ziplist使用的是一整塊連續內存,存儲效率較高。但是每次修改數據都會引發realloc。 若ziplist長度較長的時候,每次修改數據會引發大量的數據拷貝,效率會進一步低下。而“快速列表”就是爲了優化數據存取、修改問題引入的。
命令
描述
rpush
右側添加值
rpop
右側彈出值
lpush
左側添加值
lpop
左側彈出值
llen
獲取列表長度
命令演示:
# 隊列:右進 左出
127.0.0.1:6379> rpush channel msg1 msg2 msg3 msg4
(integer) 4
127.0.0.1:6379> llen channel
(integer) 4
127.0.0.1:6379> lpop channel
"msg1"
127.0.0.1:6379> llen channel
(integer) 3
127.0.0.1:6379> lpop channel
"msg2"
127.0.0.1:6379> lpop channel
"msg3"
127.0.0.1:6379> lpop channel
"msg4"
127.0.0.1:6379> lpop channel
(nil)
# 棧:右進 右出
127.0.0.1:6379> rpush stack value1 value2 value3 value4
(integer) 4
127.0.0.1:6379> llen stack
(integer) 4
127.0.0.1:6379> rpop stack
"value4"
127.0.0.1:6379> rpop stack
"value3"
127.0.0.1:6379> rpop stack
"value2"
127.0.0.1:6379> rpop stack
"value1"
127.0.0.1:6379> rpop stack
(nil)
127.0.0.1:6379> rpush list value1 value2 value3 value4
(integer) 4
# 獲取所有數據
127.0.0.1:6379> lrange list 0 -1
1) "value1"
2) "value2"
3) "value3"
4) “value4”
# 獲取索引爲 0 的數據
127.0.0.1:6379> lindex list 0
"value1"
127.0.0.1:6379> lindex list 1
“value2"
# 截取(保留)list 從索引1 到索引倒數第 1 個
127.0.0.1:6379> ltrim list 1 -1
OK
127.0.0.1:6379> lrange list 0 -1
1) "value2"
2) "value3"
3) “value4"
# 截取索引 1 到 索引 0 的數據,小於 0 則爲清空列表
127.0.0.1:6379> ltrim list 1 0
OK
127.0.0.1:6379> lrange list 0 -1
(empty list or set)
127.0.0.1:6379> llen list
(integer) 0
使用場景:
  • 異步隊列,無ack機制的消息推送。
  • 生產消費模型。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章