Redis指南
一、簡介
redis 和 memcached 都是高性能的鍵值緩存數(shù)據(jù)庫服務(wù),其中 memcached 支持多線程,而 redis 支持豐富的數(shù)據(jù)結(jié)構(gòu)且能內(nèi)置持久化機制。
redis 數(shù)據(jù)都是以鍵值形式存儲的,鍵是字符串類型,值有 7 種類型(本質(zhì)上是5種,其中 HyperLogLog 是 string,而 GEO 是 zset,可以通過 object encoding keyname 查看,但由于功能上的差異較大,這里分為7種):
1、string 字符串
2、list 列表
3、set 集合(所有命令均以 S 開頭)
4、hash 散列(所有命令均以 H 開頭)
5、zset 有序集合(所有命令均以 Z 開頭)
6、HyperLogLog
7、GEO (redis 3.2)
不同的值類型,甚至是同一種值類型,其底層實現(xiàn)也可能是不一樣的(主要是考慮到不同情況下的效率優(yōu)化),具體可以看 redis 源碼。
?
二、常見命令
redis 的命令可以參考官網(wǎng):https://redis.io/commands
對英文不熟練的也可以看國人翻譯的網(wǎng)站:http://redisdoc.com/
以下對常見的命令進(jìn)行列舉
1、鍵操作命令
?
簡單示例:
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> dump age "\x00\xc0\x12\a\x00\xb2\xeb\xab\xbc\x1d\xeb\x911" 127.0.0.1:6379> restore age1 5000 "\x00\xc0\x12\a\x00\xb2\xeb\xab\xbc\x1d\xeb\x911" OK 127.0.0.1:6379> get age1 "18"?
2、值操作命令:String
?
?
3、值操作命令(List)
?
?
4、值操作命令(Set)
?
?
?
5、值操作命令(Hash)
?
?
6、值操作命令(SortedSet)
?
7、值操作命令(HyperLogLog)
?
7、值操作命令(GEO)?
?
?
三、發(fā)布與訂閱
redis 的發(fā)布與訂閱,是以頻道channel為中介,訂閱者訂閱相關(guān)channel,發(fā)布者向channel發(fā)送string類型消息,會通知到該channel相關(guān)的訂閱者。在實際開發(fā)中,會有一些問題,其中一個問題是,客戶端客觀上會存在斷線重連的情況,如果一個客戶端在訂閱了某個channel之后,斷線重連了(已經(jīng)不是原來的訂閱者了),則需要重新訂閱相關(guān)channel,而且會丟失斷線期間的消息通知。另外,訂閱的客戶端會進(jìn)行阻塞模式,一直監(jiān)聽 redis 通知的消息。取消訂閱使用 unsubscribe ch1 [ch2] 命令,如果不帶任何頻道名,則表示退訂所有頻道,退訂操作在官方提供的 redis-cli 中是無法模擬的,因為一旦執(zhí)行訂閱操作窗口就被阻塞了。
基于 redis 發(fā)布與訂閱功能,在 redis2.8后實現(xiàn)了鍵空間通知(keyspace)和鍵事件通知(keyevent)的功能,前者用于當(dāng)指定模式的鍵發(fā)生了變化時進(jìn)行通知,后者用于當(dāng)發(fā)生指定的操作命令時進(jìn)行通知。該功能需要消耗一定的CPU資源,默認(rèn)是關(guān)閉,可通過修改 redis.conf 文件或執(zhí)行 config set notify-keyspace-events AKE 來開啟。命令中的 "AKE" 表示開啟所有類型的通知,更細(xì)化的設(shè)置請參考官方手冊,可以指定具體針對具體類型的鍵進(jìn)行 keyspace 或 keyevent 通知。
監(jiān)視一個 keyspace/keyevent 的格式是?psubscribe __keyspace@<db>__:* 和 psubscribe __keyevent@<db>__:* ,如訂閱 Users: 開頭的鍵發(fā)生變化如下:
psubscribe __keyspace@0__:Users:*而訂閱刪除事件的操作如下:
psubscribe __keyevent@0__:del而如下的操作將會同時訂閱 keyspace 和 keyevent,在執(zhí)行類似 add key value 操作時,會收到兩條通知消息:
psubscribe __key*@0__:*?
?
?
四、事務(wù)
redis 在一定程度上實現(xiàn)了事務(wù)邏輯(不支持回滾),通過 multi/exec 包含的命令集(順序的將其中的命令入隊,如果入隊成功會返回 queued,如果入隊失敗則會導(dǎo)致事務(wù)失敗,即使執(zhí)行exec也會返回事務(wù)錯誤),將以原子操作執(zhí)行(需要注意的是,如果事務(wù)隊列中的某些命令執(zhí)行成功,而某些命令執(zhí)行失敗是存在的,redis 并不會回滾。在事務(wù)命令入隊時,redis只會檢查嚴(yán)重的語法格式錯誤,邏輯錯誤是沒法檢測的,比如對一個string鍵執(zhí)行 lpush 操作)。 multi 命令標(biāo)記著事務(wù)的開始,exec 標(biāo)記事務(wù)的結(jié)束并提交事務(wù),discard 標(biāo)記著事務(wù)的結(jié)束并放棄事務(wù)。與事務(wù)常常一起配合使用的有 watch 命令,該命令用于在事務(wù)開始前監(jiān)視一個 key 的內(nèi)容是否發(fā)生變化。 在執(zhí)行 exec 命令提交事務(wù)時,redis會檢測當(dāng)前的 watch 隊列中的數(shù)據(jù)是否發(fā)生變化,如果發(fā)生變化,則事務(wù)將不被執(zhí)行(程序可以嘗試重試操作,使用樂觀鎖是從效率考慮)。無論提交還是放棄(exec/discard)一個事務(wù),都會清空當(dāng)前的 watch 隊列,如果需要在事務(wù)開始前取消一個之前watch的操作,可以使用 unwatch 命令。
注意,如果 watch 的是一個帶生存時間的鍵,那么即使該鍵過期了,redis 仍然認(rèn)為其是沒有變化的,事務(wù)仍可正常執(zhí)行。
redis 腳本是在 redis2.6 之后引入的另一種處理事務(wù)的方法,使用腳本要更簡單,并且速度更快。redis 官方表示,短時間內(nèi)并不會移除原有的事務(wù)功能,但未來如果腳本被廣泛使用的話并不排除這種可能。
?
?
五、服務(wù)器管理
1、慢日志
通過慢日志,可以記錄執(zhí)行時間較長的命令,從而便于找出項目的效率問題。
通過下面的命令可以設(shè)置當(dāng)命令耗時超過多少微秒時將被記錄:
config set slowlog-log-slower-than 10000這些慢日志會記錄到一個隊列中,可以通過下面的命令設(shè)置隊列的長度:
CONFIG SET slowlog-max-len 1000查看慢日志可以用下面的命令,如果跟上數(shù)字,表示顯示指定數(shù)量的日志:
slowlog get [number]?
查看當(dāng)前慢日志的數(shù)量:
slowlog len清空慢日志:
slowlog reset?
?
?
?
?
六、集群
?
?
七、redis性能測試
http://www.cnblogs.com/silent2012/p/4514901.html
轉(zhuǎn)載于:https://www.cnblogs.com/tianyajuanke/p/6134323.html
總結(jié)
- 上一篇: proc文件(OLD)
- 下一篇: ORM框架通过映射(反射)获取数据库的数