Redis 命令用於在 redis 服務上執行操作。要在 redis 服務上執行命令需要一個 redis
客戶端。可以使用redis-cli
命令啓動Redis客戶端。完整的啓動命令是redis-cli -h host -p port -a password
。
Redis常用的數據類型有五種:string、hash、list、set及zset(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