Redis常用數據類型操作指令總結


Redis 命令用於在 redis 服務上執行操作。要在 redis 服務上執行命令需要一個 redis
客戶端。可以使用redis-cli命令啓動Redis客戶端。完整的啓動命令是redis-cli -h host -p port -a password

Redis常用的數據類型有五種:stringhashlistsetzset(sorted set有序集合)。學習這些類型之前還需要學習常用命令Key的管理。下面詳細介紹這些類型:更詳細的API可以參照此處

常用命令Key管理

Key的應用場景:

  • 限時的優惠活動信息。
  • 網站的數據緩存(對於一些需要定時更新的數據,如積分排行榜)
  • 手機驗證碼
  • 限制網站訪客訪問頻率(例如1分鐘最多訪問10次)

Key的命名建議:
key名稱區分大小寫;key不要太長,儘量不超過1024字節,太長會降低查找效率;在一個項目中key最好使用統一的命名模式,如user:id:password

keys pattern           返回滿足給定pattern的所有key,可以模糊匹配,如keys abc*代表abc開頭的key
exists key            判斷一個key是否存在,存在返回1,不存在返回0
expire key second        設定一個key的活動時間(秒)
pexpire key milliseconds    設定一個key的活動時間(毫秒)
del key            刪除一個key
ttl key             返回一個key的剩餘時間,key不存在時返回-2;key存在但未設置剩餘生存時間返回-1
persist key           取消過期時間
select dbindex         選擇數據庫,默認有16個,索引從0開始
move key, dbindex        移動當前數據庫中的key到dbindex數據庫
randomkey            隨機返回一個key
keyrename key, key2      重命名key
dbsize              返回當前數據庫中key的數量
info               查看數據庫信息
config get *           實時存儲收到的請求,返回相關的配置
type(key)             返回值的類型

flushdb             刪除當前選擇數據庫中的所有key
flushall            刪除所有數據庫中的所有key

一、字符串String

String是redis最基本的類型,一個鍵最大能存儲523MB。String類型是二進制安全的。意思是redis的String可以包含任何數據。比如圖片或者序列化的對象 。

String的應用場景:

  • String通常用於保存單個字符串或JSON字符串數據。
  • 因爲String是二進制安全的,可以把圖片文件的內容作爲字符串來存儲。
  • 計數器(常規key-value緩存應用,粉絲數、微博數量,投票等)

INCR 等指令本身就具有原子操作的特性,所以完全可以利用 Redis 的 NCR、INCRBY、DECR、DECRBY 等指令來實現原子計數的效果。假如,在某種場景下有 3 個客戶端同時讀取了 minum 的值(值爲 2),然後對其同時進行了加 1 的操作,那麼,最後 bynum 的值一定是 5。不少網站都利用 reds 的這個特性來實現業務上的統計計數需求。

賦值語法
set key value        爲key賦予值value,多次設置會覆蓋舊值且無視類型
setnx key value       爲key賦予值value,如果key已存在,則不設置並返回0,否則設置並返回1。是解決分佈式鎖的方案之一。
setex key time value    爲key賦予值value並設定過期時間time,到期後key和value都清除。
setrange key start end   設置指定區間範圍內的值,下標從0開始,替換字符串。

取值語法

get key           獲取指定key的value值,key不存在則返回nil
getrange key start end   獲取指定key的value的子字符串,包括start和end角標
getbit key offset      對 key 所儲存的字符串值,獲取指定偏移量的bit(二進制)
getset key value      爲key設新值,同時返回舊值,key不存在返回nil
substr(key, start, end)  返回名稱爲key的string的value的子串
刪值語法
del key                  同Key

批量寫入
mset k1 v1 k2 v2...kn vn        批量設置多個的值

批量讀出

mget k1 k2 ... kn           獲取多個key的值
自增自減
incr key                key的value對應+1
incrby key integer           key的value對應+integer
decr key                key的value對應-1
decrby key integer           key的value對應-integer

字符串拼接
append key value            將value附加到指定key的末尾

msetnx(key1, value1...keyN, valueN)  同時設置多個key和value,僅key之前都不存在時生效
字符串長度
strlen key                返回key的字符長度

二、雙重鍵值對Hash

Hash類型是String類型的field和value的映射表。Hash特別適合用於存儲對象,相比String可以佔用更少的磁盤空間,可以看成具有key和value的map容器。Redis中每個hash可以存儲(2^32)-1個鍵值對。

Hash的應用場景:

  • 通常用來存儲一個用戶信息對象數據。
  • Redis的Hash實際是將內部存儲的value作爲一個HashMap。

賦值語法

hset key field value          爲指定key設置field和value
hsetnx key field value         爲指定key設置field和value,如果key已存在則不生效。
hmset key f1 v1 f2 v2 ... fn vn   同時將多個field-value(域值對)設置到哈希表的key中。

取值語法

hget key field             根據field獲取value值
hmget key f1 f2 ... fn        根據多個field獲取所有的value值
hgetall key              獲取Hash表中所有的字段和值
hkeys key               獲取所有Hash表中的字段
hvals key               獲取所有Hash表中的字段對應的value
hexists key field           查看Hash表Key中,指定的字段是否存在
hlen key                獲取Hash表中字段的數量

刪除語法

hdel key field1 field2 ... fieldn  刪除一個或多個Hash表的字段
del key                 同Key

增減語法

hincrby key field integer       爲Hash表Key中field對應的value增加integer
hincrbyfloat key field increment   爲Hash表Key中field對應的value增加increment

三、雙端鏈表List

List類型是一個鏈表結構的集合,主要功能有push、pop、獲取元素等。更詳細的說,List類型是一個雙端鏈表的結構,可以通過相關的操作進行集合頭部或者尾部元素的添加和刪除,List既可以作爲棧,又可以作爲隊列,能夠滿足絕大多數需求。

  • 如果鍵不存在,創建新的鏈表。
  • 如果鍵已存在,新增內容。
  • 如果值全移除,對應的鍵也就消失了。
  • 鏈表操作無論是頭和尾效率都極高,但中間元素的操作效率很低。

應用場景

  • 對數據量大的集合數據刪減
    列表數據顯示、關注列表、粉絲列表、留言評價等…分頁、熱點新聞(Top10)等。利用lrange可以很方便的實現分頁的功能,在博客系統中,每篇博文的評論也可以存入一個單獨的list中。

  • 任務隊列
    在處理web客戶端發送的命令請求時,某些操作的執行時間可能會比我們預期的更長一些,通過將待執行任務的相關信息放入隊列裏面,並在之後對隊列進行處理,用戶可以推遲執行那些需要一段時間才能完成的操作,這種將工作交給任務處理器來執行的做法被稱爲任務隊列(task queue)。list通常可以用來實現一個消息隊列,而且可以確保先後順序。

賦值語法

lpush key value1 value2 ... valueN    將一個或多個值插入到列表頭部(從左側添加)
rpush key value1 value2 ... valueN     將一個或多個值插入到列表頭部(從右側添加)
lpushx key value              將一個值插入到已存在的列表頭部(最左邊),如果列表不存在,操作無效。
rpushx key value              將一個值插入到已存在的列表尾部(最右邊),如果列表不存在,操作無效。

取值語法

llen key             獲取列表長度
lindex key index         通過索引獲取列表的元素
lrange key start stop      獲取列表指定範圍內的元素

刪除語法

lpop key            移除並獲取列表的第一個元素(從左側移除)
lpop key            移除並獲取列表的最後一個元素(從右側移除)
lrem key count value      刪除count個值爲value的key
blpop key1 key2 timeout    移除並獲取列表的第一個元素,如果列表沒有元素會阻塞列表,直到等待超時或發現可彈出元素爲止
brpop key1 key2 timeout    移除並獲取列表的最後一個元素,如果列表沒有元素會阻塞列表,直到等待超時或發現可彈出元素爲止
ltrim key start stop      對一個列表進行修剪,只保留指定區間內的元素,不在指定區間內的元素都刪除。

修改語法

lset key index value           通過索引設置列表元素的值
linsert key before|after world value   在列表的某個元素world前或者後插入元素value。

高級命令

rpoplpush source destination        移除source列表的最後一個元素,並將該元素添加到destination列表,並返回。(可以對自己本身操作,類似隊列)
brpoplpush source destination timeout   移除source列表的最後一個元素,並將該元素添加到destination列表,並返回;如果source 列表沒有元素會阻塞列表知道等待超時或發現可移除元素爲止。

四、無序集合Set

Set 是 String 類型的無序集合。集合成員是唯一的,集合中不能出現重複的數據。
Redis 中的集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。
集合中最大的成員數爲 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
類似於JAVA中的 Hashtable集合

  • Redis的set的底層存儲結構特別神奇,底層使用了intset和hashtable兩種數據結構存儲的,intset我們可以理解爲數組,hashtable就是普通的哈希表(key爲set的值,value爲null)。
  • intset內部其實是一個數組(int8_t coentents[]數組),而且存儲數據的時候是有序的,因爲在查找數據的時候是通過二分查找來實現的。

應用場景

  • 對兩個集合間的數據[計算]進行交集、並集、差集運算
  • 以非常方便的實現如共同關注、共同喜好、二度好友等功能。對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存儲到一個新的集合中。
  • 利用唯一性,可以統計訪問網站的所有獨立 IP

賦值語法

sadd key member1 member2 ... memberN   向集合添加一個或多個成員

取值語法

scard key                  獲取集合的成員數
smembers key                返回集合中的所有成員
sismember key member           判斷 member 元素是否是集合 key 的成員(開發中:驗證是否存在判斷)
srandmember key count            返回集合中一個或多個隨機數

刪除語法

srem key member1 member2...memberN     移除集合中一個或多個成員
spop kye count               移除並返回集合中的一個或多個隨機元素

smove source destincation member      將member元素從source集合移動到destination集合

差集語法

sdiff key1 key2               返回給定所有集合的差集(左側)
sdiffstore destination key1 key2      返回給定所有集合的差集並存儲在 destination 中(destination中原有的數據清除)

交集語法

sinter key1 key2               返回給定所有集合的交集(共有數據)
sinterstore destination key1 key2     返回給定所有集合的交集並存儲在 destination 中

並集語法
sunion key1 key2               返回所有給定集合的並集
sunionstore destination key1 key2      所有給定集合的並集存儲在 destination 集合中

五、有序集合Zset

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。

  • 之前的set是k1 v1 v2
  • 現在的zset是k1 score1 v1 score2 v2

應用場景

  • 排行榜
    ①twitter 的public timeline可以以發表時間作爲score來存儲,這樣獲取時就是自動按時間排好序的。
    ②一個存儲全班同學成績的Sorted Set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。
    ③用Sorted Set來做帶權重的隊列,比如普通消息的score爲1,重要消息的score爲2,然後工作線程可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。

賦值語法
zadd key score1 member1 score2 member2  向有序集合添加一個或多個成員,或者更新已存在成員的分數

取值語法
zcard key                  獲取有序集合的成員數
zcount key min max             計算在有序集合中指定區間分數的成員數
zrank key member              返回有序集合中指定成員的索引
zrange key start stop [withscores]     通過索引區間返回有序集合成指定區間內的成員(低到高)
zrevrange key start stop [withscores]   通過索引區間返回有序集合成指定區間內的成員(高到低)
zlexcount key,min,max           在有序集合中計算指定字典區間內成員數量

刪除語法
del key                   移除集合
zrem key member [member ...]        移除有序集合中的一個或多個成員
zremrangebyrank key start stop       移除有序集合中給定的排名區間的所有成員(第一名是0)(低到高排序)
zremrangebyscore key min max        移除有序集合中給定的分數區間的所有成員

分數自增
zincrby key ncrement member        有序集合中對指定成員的分數加上增量increment

六、HyperLoglog

Redis在2.8.9版本添加了HyperLoglog結構。該結構是用來做基數統計的算法,

優點:無論輸入元素多少,計算基數所需要的空間總是固定的,並且很小。

缺點:只會根據輸入元素的計算基數,而不會存儲輸入元素本身,索引不能像集合那樣,返回輸入的各個元素。

什麼是基數?
比如數據集{1,2,3,3,4,5,5},那麼這個數據集的基數集爲{1,2,3,4,5},基數爲5。所謂基數估計就是在誤差可接受的範圍內,快速計算基數。
爲什麼要使用HyperLogLog?
傳統的統計一個對象的基數值需要12M內存,如果統計1萬個對象,需要將近120G內存,無法廣泛應用於大數據場景;而使用了HyperLogLog,統計1億個數據的基數值,大約需要12M,內存佔用減少明顯。

在這裏插入圖片描述
pfadd key element1 element2 ... elementN         添加指定元素到HyperLogLog中
pfcount key                        返回給定HyperLogLog的基數估算值
pfmerge destkey sourcekey1 sourcekey2 ...sourcekeyN   將多個HyperLogLog合併爲一個HyperLogLog

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章