1、Redis 基本數據類型
1)全局 Key 操作
命令含義KEYS *查看KEY支持通配符DEL刪除給定的一個或多個keyEXISTS檢查是否存在RENAME變更KEY名SORT鍵值排序,有非數字時報錯TYPE返回鍵所存儲值的類型DUMP RESTORE序例化與反序列化EXPIRE\ PEXPIRE以秒\毫秒設定生存時間TTL\ PTTL以秒\毫秒為單位返回生存時間PERSIST取消生存實現設置RANDOMKEY返回資料庫中的任意鍵2)String(字符串)
string是redis最基本的類型,一個key對應一個value。一個鍵最大能存儲 512MB。
命令描述SET key value設置指定 key 的值GET key獲取指定 key 的值。GETRANGE key start end返回 key 中字符串值的子字符GETSET key value將給定 key 的值設為 value ,並返回 key 的舊值(old value)。GETBIT key offset****對 key所儲存的字符串值,獲取指定偏移量上的位(bit)。MGET key1 [key2..]獲取所有(一個或多個)給定 key 的值。SETBIT key offset value對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。SETEX key seconds value將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)。SETNX key value只有在 key 不存在時設置 key 的值。SETRANGE key offset value用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。STRLEN key返回 key 所儲存的字符串值的長度。MSET key value [key value ...]同時設置一個或多個 key-value 對。MSETNX key value [key value ...]同時設置一個或多個 key-value 對,若且唯若所有給定 key 都不存在。PSETEX key milliseconds value這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。INCR key將 key 中儲存的數字值增一。INCRBY key increment將 key 所儲存的值加上給定的增量值(increment) 。INCRBYFLOAT key increment將 key 所儲存的值加上給定的浮點增量值(increment) 。DECR key將 key 中儲存的數字值減一。DECRBY key decrementkey所儲存的值減去給定的減量值(decrement) 。APPEND key value如果 key 已經存在並且是一個字符串, APPEND 命令將 指定value 追加到改 key 原來的值(value)的末尾。應用場景
常規計數:微博數,粉絲數等。
3)Hash(字典)
我們可以將Redis中的Hashes類型看成具有String Key和String Value的map容器。
所以該類型非常適合於存儲值對象的信息。如Username、Password和Age等。如果Hash中包含很少的欄位,那麼該類型的數據也將僅佔用很少的磁碟空間。每一個Hash可以存儲995701749 個鍵值對。
命令描述HDEL key field1 [field2]刪除一個或多個哈希表欄位HEXISTS key field查看哈希表 key 中,指定的欄位是否存在。HGET key field獲取存儲在哈希表中指定欄位的值。HGETALL key獲取在哈希表中指定 key 的所有欄位和值HINCRBY key field increment為哈希表 key 中的指定欄位的整數值加上增量 increment 。HINCRBYFLOAT key field increment為哈希表 key 中的指定欄位的浮點數值加上增量 increment 。HKEYS key獲取所有哈希表中的欄位HLEN key獲取哈希表中欄位的數量HMGET key field1 [field2]獲取所有給定欄位的值HMSET key field1 value1 [field2 value2 ]同時將多個 field-value (域-值)對設置到哈希表 key 中。HSET key field value將哈希表 key 中的欄位 field 的值設為 value 。HSETNX key field value只有在欄位 field 不存在時,設置哈希表欄位的值。HVALS key獲取哈希表中所有值HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的鍵值對。應用場景:
存儲部分變更的數據,如用戶信息等。
4)LIST(列表)
List類型是按照插入順序排序的字符串鍊表。和數據結構中的普通鍊表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。
在插入時,如果該鍵並不存在,Redis將為該鍵創建一個新的鍊表。與此相反,如果鍊表中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。
List中可以包含的最大元素數量是4294967295。
命令描述BLPOP key1 [key2 ] timeout移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。BRPOP key1 [key2 ] timeout移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。應用場景
消息隊列系統,比如sina微博
在Redis中我們的最新微博ID使用了常駐緩存,這是一直更新的。但是做了限制不能超過5000個ID,因此獲取ID的函數會一直詢問Redis。只有在start/count參數超出了這個範圍的時候,才需要去訪問資料庫。
系統不會像傳統方式那樣「刷新」緩存,Redis實例中的信息永遠是一致的。SQL資料庫(或是硬碟上的其他類型資料庫)只是在用戶需要獲取「很遠」的數據時才會被觸發,而主頁或第一個評論頁是不會麻煩到硬碟上的資料庫了。
5)SET(集合)
Set類型看作為沒有排序的字符集合。Set可包含的最大元素數量是4294967295。如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。
命令描述SADD key member1 [member2]向集合添加一個或多個成員SCARD key獲取集合的成員數SDIFF key1 [key2]返回給定所有集合的差集SDIFFSTORE destination key1 [key2]返回給定所有集合的差集並存儲在 destination 中SINTER key1 [key2]返回給定所有集合的交集SINTERSTORE destination key1 [key2]返回給定所有集合的交集並存儲在 destination 中SISMEMBER key member判斷 member 元素是否是集合 key 的成員SMEMBERS key返回集合中的所有成員SMOVE source destination member將 member 元素從 source 集合移動到 destination 集合SPOP key移除並返回集合中的一個隨機元素SRANDMEMBER key [count]返回集合中一個或多個隨機數SREM key member1 [member2]移除集合中一個或多個成員SUNION key1 [key2]返回所有給定集合的併集SUNIONSTORE destination key1 [key2]所有給定集合的併集存儲在 destination 集合中SSCAN key cursor [MATCH pattern] [COUNT count]迭代集合中的元素應用場景:
在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。
Redis還為集合提供了求交集、併集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
6)SortedSet(有序集合)
Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來為集合中的成員進行從小到大的排序。成員是唯一的,但是分數(score)卻是可以重複的。
集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
命令描述ZADD key score1 member1 [score2 member2]向有序集合添加一個或多個成員,或者更新已存在成員的分數ZCARD key獲取有序集合的成員數ZCOUNT key min max計算在有序集合中指定區間分數的成員數ZINCRBY key increment member有序集合中對指定成員的分數加上增量 incrementZINTERSTORE destination numkeys key [key ...]計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中ZLEXCOUNT key min max在有序集合中計算指定字典區間內成員數量ZRANGE key start stop [WITHSCORES]通過索引區間返回有序集合成指定區間內的成員ZRANGEBYLEX key min max [LIMIT offset count]通過字典區間返回有序集合的成員ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]通過分數返回有序集合指定區間內的成員ZRANK key member返回有序集合中指定成員的索引ZREM key member [member ...]移除有序集合中的一個或多個成員ZREMRANGEBYLEX key min max移除有序集合中給定的字典區間的所有成員ZREMRANGEBYRANK key start stop移除有序集合中給定的排名區間的所有成員ZREMRANGEBYSCORE key min max移除有序集合中給定的分數區間的所有成員ZREVRANGE key start stop [WITHSCORES]返回有序集中指定區間內的成員,通過索引,分數從高到底ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中指定分數區間內的成員,分數從高到低排序ZREVRANK key member返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序ZSCORE key member返回有序集中,成員的分數值ZUNIONSTORE destination numkeys key [key ...]計算給定的一個或多個有序集的併集,並存儲在新的 key 中ZSCAN key cursor [MATCH pattern] [COUNT count]迭代有序集合中的元素(包括元素成員和元素分值)應用場景:
排行榜應用,取TOP N操作這個需求與上面需求的不同之處在於,前面操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,這時候就需要我們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只需要執行一條ZADD命令即可。
2、Redis 消息模式
Redis發布消息通常有兩種模式:
發布-訂閱模式(publish-subscribe)1)任務隊列
顧名思義,就是「傳遞消息的隊列」。與任務隊列進行交互的實體有兩類,一類是生產者(producer),另一類則是消費者(consumer)。生產者將需要處理的任務放入任務隊列中,而消費者則不斷地從任務獨立中讀入任務信息並執行。
1. 任務隊列的好處
鬆耦合
生產者和消費者只需按照約定的任務描述格式,進行編寫代碼。
易於擴展
多消費者模式下,消費者可以分布在多個不同的伺服器中,由此降低單臺伺服器的負載。
3、Redis 發布訂閱
其實從Pub/Sub的機制來看,它更像是一個廣播系統,多個Subscriber可以訂閱多個Channel,多個Publisher可以往多個Channel中發布消息。可以這麼簡單的理解:
Subscriber:收音機,可以收到多個頻道,並以隊列方式顯示
Publisher:電臺,可以往不同的FM頻道中發消息
1)發布訂閱模型
1. 一個Publisher,多個Subscriber模型
如下圖所示,可以作為消息隊列或者消息管道。
主要應用:通知、公告。
ts/1190037-20180203150217281-1667256027.png)
2. 多個Publisher,一個Subscriber模型
可以將PubSub做成獨立的HTTP接口,各應用程式作為Publisher向Channel中發送消息,Subscriber端收到消息後執行相應的業務邏輯,比如寫資料庫,顯示等等。
主要應用:排行榜、投票、計數。
(assets/1190037-20180203150234531-91611195.png)
3. 多個Publisher,多個Subscriber模型
故名思議,就是可以向不同的Channel中發送消息,由不同的Subscriber接收。
主要應用:群聊、聊天。
2)實踐發布訂閱
發布訂閱實踐命令
命令描述PUBLISH channel msg將信息 message 發送到指定的頻道 channelSUBSCRIBE channel [channel ...]訂閱頻道,可以同時訂閱多個頻道UNSUBSCRIBE [channel ...]取消訂閱指定的頻道, 如果不指定頻道,則會取消訂閱所有頻道PSUBSCRIBE pattern [pattern ...]訂閱一個或多個符合給定模式的頻道,每個模式以 * 作為匹配符,比如 it* 匹配所有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類PUNSUBSCRIBE [pattern [pattern ...]]退訂指定的規則, 如果沒有參數則會退訂所有規則PUBSUB subcommand [argument [argument ...]]查看訂閱與發布系統狀態注意:使用發布訂閱模式實現的消息隊列,當有客戶端訂閱 channel 後只能收到後續發布到該頻道的消息,之前發送的不會緩存,必須 Provider 和 Consumer 同時在線。
3)消息隊列系統對比
客戶端在執行訂閱命令之後進入了訂閱狀態,只能接收 SUBSCRIBE 、PSUBSCRIBE、 UNSUBSCRIBE 、PUNSUBSCRIBE 四個命令。
開啟的訂閱客戶端,無法收到該頻道之前的消息,因為 Redis 不會對發布的消息進行持久化。
和很多專業的消息隊列系統(例如Kafka、RocketMQ)相比,Redis的發布訂閱略顯粗糙,例如無法實現消息堆積和回溯。但勝在足夠簡單,如果當前場景可以容忍的這些缺點,也不失為一個不錯的選擇。
4、Redis 事務管理
redis中的事務跟關係型資料庫中的事務是一個相似的概念,但是有不同之處。
關係型資料庫事務執行失敗後面的sql語句不在執行,而redis中的一條命令執行失敗,其餘的命令照常執行。
redis中開啟一個事務是使用multi,相當於begin\start transaction,exec提交事務,discard取消隊列命令(非回滾操作)。
1)Redis 於 MySQL 對比
2)Redis 事務命令
命令描述DISCARD取消事務,放棄執行事務塊內的所有命令。EXEC執行所有事務塊內的命令。MULTI標記一個事務塊的開始。UNWATCH取消 WATCH 命令對所有 key 的監視。WATCH key [key ...]監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。1. 事務執行舉例
ZADD salary 2000 user1
ZADD salary 3000 user2
ZRANGE salary 0 -1 WITHSCORES
MULTI
ZINCRBY salary 1000 user1
ZINCRBY salary -1000 user2
EXEC3)Redis 中事務中的鎖機制
舉例:我正在買票 Ticket -1 , money -100
而票只有1張, 如果在我 multi 之後,和 exec 之前, 票被別人買了,即 ticket 變成0了。
我該如何觀察這種情景,並不再提交:
悲觀的想法:
世界充滿危險,肯定有人和我搶, 給 ticket上鎖, 只有我能操作. [悲觀鎖]
樂觀的想法:
沒有那麼人和我搶,因此,我只需要注意,有沒有人更改 ticket 的值就可以了 [樂觀鎖]
Redis的事務中,啟用的是樂觀鎖,只負責監測 key 沒有被改動.
4)Redis服務管理命令
命令描述BGREWRITEAOF異步執行一個 AOF(AppendOnly File) 文件重寫操作BGSAVE在後臺異步保存當前資料庫的數據到磁碟CLIENT KILL [ip:port] [ID client-id]關閉客戶端連接CLIENT LIST獲取連接到伺服器的客戶端連接列表CLIENT GETNAME獲取連接的名稱CLIENT PAUSE timeout在指定時間內終止運行來自客戶端的命令CLIENT SETNAME connection-name設置當前連接的名稱CLUSTER SLOTS獲取集群節點的映射數組COMMAND獲取 Redis 命令詳情數組COMMAND COUNT獲取 Redis 命令總數COMMAND GETKEYS獲取給定命令的所有鍵TIME返回當前伺服器時間COMMAND INFO command-name [command-name ...]獲取指定 Redis 命令描述的數組CONFIG GET parameter獲取指定配置參數的值CONFIG REWRITE對啟動 Redis 伺服器時所指定的 redis.conf 配置文件進行改寫CONFIG SET parameter value修改 redis 配置參數,無需重啟CONFIG RESETSTAT重置 INFO 命令中的某些統計數據DBSIZE返回當前資料庫的 key 的數量DEBUG OBJECT key獲取 key 的調試信息DEBUG SEGFAULT讓 Redis 服務崩潰FLUSHALL刪除所有資料庫的所有keyFLUSHDB刪除當前資料庫的所有keyINFO [section]獲取 Redis 伺服器的各種信息和統計數值LASTSAVE返回最近一次 Redis 成功將數據保存到磁碟上的時間,以 UNIX 時間戳格式表示MONITOR實時列印出 Redis 伺服器接收到的命令,調試用ROLE返回主從實例所屬的角色SAVE異步保存數據到硬碟SHUTDOWN [NOSAVE] [SAVE]異步保存數據到硬碟,並關閉伺服器SLAVEOF host port將當前伺服器轉變為指定伺服器的從屬伺服器(slave server)SLOWLOG subcommand [argument]管理 redis 的慢日誌SYNC用於複製功能(replication)的內部命令5、Redis 慢日誌查詢
Slow log 是 Redis 用來記錄查詢執行時間的日誌系統。
可以通過改寫 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令對它們動態地進行修改
slowlog-log-slower-than 10000 # 超過多少微秒
CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1000 # 保存多少條慢日誌
CONFIG GET slow*
SLOWLOG GET
SLOWLOG RESET