redis的四大特性和原理
一、redis的過期
A.應用場景
cookie自動過期,限時優惠價格,限制每分鐘的訪問次數
B.實現方式
setex(String key, int seconds, String value)
expire key time #秒
pexpire key time #毫秒
expireat key time #秒
pexpireat key time #毫秒
C.實現原理
定時清理
設置key過期時間的時候,就創建一個定時器,不斷循環,時間一到就刪除掉這個key。
優點:過期key馬上被刪除,內存使用率最高。
缺點:如果有一萬個key設置了過期時間,就需要一萬個定時器,不斷循環,這會造成cpu性能的嚴重損耗。
懶漢式清理
在取key的時候,先判斷key是否有過期,如果過期,就刪除。
優點:過期key,只有在被使用時才被刪除,對cpu的占用是最少的。
缺點:如果一個key過期之后,很長時間都沒有被使用過,那這個key會一直占用內存空間,一直不釋放。
定期清理+懶漢式清理
redis采用的是這種方式。經過前面兩種策略可以很清楚的看到。定時清理和懶漢式清理,都不能達到一個最好的效果。
那現在有第三種,就是隔一段時間進行一次清理,清除掉過期的 key。比如一分鐘或者是十分鐘清理一次。
同時使用懶漢式清理,每次獲取key的時候能判斷一下,是否過期,是否需要清理。
二、redis的發布訂閱
A.應用場景
訂閱新聞頻道(體育,軍事等),關注大V,關注好友,系統消息廣播。
B.實現方式
PUBLISH channel message #發布消息 SUBSCRIBE channel [channel ...] #訂閱一個或多個頻道 PSUBSCRIBE channel #訂閱一組匹配的頻道C.實現原理
pubsub_channels存放頻道信息,pubsub_patterns存放客戶端信息。通過類似觀察者模式,新的消息發送給每個訂閱者。
三、redis的事務
redis事務和mysql對比
| multi | begin |
| exec | commit |
| discard | rollback |
| watch | lock |
A.應用場景
秒殺商品的數量,搶票
B.實現方式
watch multi exec discard
C.實現原理
watch的實現原理:
當一個key被修改后,就會對所有監控該key的客戶端,設置dirty標識。
multi和exec的實現原理:
客戶端的三種狀態
REDIS_MULTI 客戶端進入事務狀態。
REDIS_DIRTY_EXEC 客戶端事務無效狀態。命令隊列中有發生錯誤的命令。
REDIS_DIRTY_CAS 客戶端事務處于非安全狀態。watch的key已經被其他客戶端搶先修改了。
事務執行原理:
1.事務執行成功。
第一步:客戶端設置事務狀態為REDIS_MULTI ;
第二步:將多條命令加入到命令隊列;
第三步:執行exec,依次執行完命令隊列中的所有操作命令;
2.第一種事務執行失敗REDIS_DIRTY_EXEC。
第一步:客戶端設置事務狀態為REDIS_MULTI ;
第二步:將多條命令加入到命令隊列,但是命令隊列中,存在產生錯誤的命令;
第三步:錯誤的操作命令,導致客戶端狀態變成REDIS_DIRTY_EXEC ,事務執行失敗;
3.第二種事務執行失敗REDIS_DIRTY_CAS
第一步:客戶端設置事務狀態為REDIS_MULTI ;
第二步:將多條命令加入到命令隊列;
第三步:正在watch的key被其他的客戶端,搶先修改,導致客戶端狀態變成REDIS_DIRTY_CAS ,事務執行失敗;
四、redis的pipline
A.應用場景
一個客戶端能合并多條命令一起發送時,都推薦使用。例如,取出用戶信息,并且取出該用戶關注的用戶列表。
但是,如果命令過多時(返回時間大于1秒),可以拆分到兩個client分別去發送。
B.實現方式
pipline在命令中是沒有的,可以通過java客戶端(jedis)設置。
Pipeline pipe = jedis.pipelined();
pipe.set
C.實現原理
pipeline通過減少client與redis-server的連接通信的次數,來降低往返延時時間。
如果一次往返的時間是10ms,往返一千次,就是10秒。而通過pipline的方式,往返時間是20ms。
Pipeline 實現的原理是隊列,即先進先出。數據的順序性得到了保證。
總結
以上是生活随笔為你收集整理的redis的四大特性和原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pypthon3精要(16)-enume
- 下一篇: SSM+Maven+Dubbo+Zook