一、寫在前
知識學了就忘!不用就忘!我太健忘!特此記錄!用于復習打卡!Redis干就完事了!
二、來辣!
-
Redis做異步佇列:一般list結構做佇列,rpush生產訊息,lpop消費訊息,當lpop沒有訊息的時候,要適當sleep一會兒;如果不sleep,就用blpop,會阻塞;生產一次消費多次,使用pub/sub主題訂閱模式,可以實作1:N的訊息佇列,缺點:消費者下線的時候,訊息會丟,
-
做延時佇列:使用sortedset,拿時間戳作為score,訊息內容作為key呼叫zadd來生產訊息,消費者用zrangebyscore指令獲取N秒前的資料輪詢處理,
-
Redis分布式鎖:拿setnx來爭搶鎖,搶到之后再用expire給縮加一個過期時間防止鎖忘記釋放,如果在setnx之后,expire之前行程意外crash或者重要維護了,咋辦:鎖永遠得不到釋放,咋辦:set指令有復雜的引數,可以把setnx和expire合成一條指令執行噠,
-
memched與redis區別:redis支持string,list,set,zset,hash,HyperLogLog,Geo,Pub/Sub,memcached支持簡單字串;redis更快;redis支持持久化,
-
redis沒有使用一致性hash,而是引入哈希槽的概念:redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放哪個槽,集群的每一個節點負責一部分hash槽,
-
redis集群方案什么情況下會導致整個集群不可用:三個節點的集群,在沒有復制模型的情況下,如果B節點掛了,整個集群會因為缺少5501-11000這個范圍的槽而不可用,
-
為什么這么快:完全基于記憶體;資料結構簡單,對資料操作簡單;采用單執行緒,避免不必要的背景關系切換和競爭條件,也不存在多行程和多執行緒導致的切換而消耗CPU,不存在加鎖釋放鎖操作,也不會死鎖;使用I/O復用模型,非阻塞IO;自己構建了VM機制,一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求,
-
場景:計數器;快取;session快取;全頁快取(FPC);訊息佇列(發布訂閱);分布式鎖(setnx或RedLock);set交集、并集找共同好友;zset可以實作有序,排行榜等功能,
-
RDB:默認,將記憶體中的資料以快照方式保存到硬碟,產生dump.rdb檔案,優點:只有一個檔案,方便持久化;容災性好,一個檔案可以保存到安全的磁盤,性能最大化,fork子行程完成寫,主行程繼續處理命令,IO最大化,主行程沒有任何IO,高性能,缺點:安全性低,如果持久化之間掛了,丟一部分資料,
-
AOF:append-only file,兩種方式同時開啟,恢復資料會先用AOF,優點:資料安全,可以配置appendfsync屬性,有always,每進行一次命令就記錄一次;通過append模式寫檔案,即時中途宕機,可以通過redis-check-aof工具解決一致性問題;rewrite模式,(檔案過大時會對命令進行合并重寫),沒有rewrite之前,可以洗掉某些命令,(比如誤操作的flushall),缺點:檔案大,恢復慢;資料集大的時候,比rdb啟動效率低,
-
當做快取時如何擴容:使用一致性哈希實作動態的擴容縮容,
-
當做持久化存盤使用,必須使用固定的keys-to-nodes映射關系,節點的數量一旦確定就不能變,
-
過期鍵的洗掉策略:1)定時過期:每個設定過期時間的key都要創建一個定時器,到過期時間就會立即清除,立即清除,對記憶體友好,但會占用大量的cpu資源,影響回應時間和吞吐量,2)惰性過期:當訪問的時候,才去判斷是否已過期,過期就清除,可最大化節省cpu資源,對記憶體不友好;但是極端情況下,可能出現大量過期的key未被清理,占用大量記憶體,3)定期過期:折中方案,每隔一定時間,會掃描一定數量的expires字典中一定數量的key,并清除其中過期的,(expires字典會保存所有設定了過期時間的key的過期時間資料,其中,key是指向鍵空間中某個鍵的指標,value是該鍵的毫秒精度的UNIX時間戳表示的過期時間,鍵空間是指redis中存盤的所有鍵,)默認同時使用了惰性過期和定期過期,
-
expire設定過期時間,persist設定永久有效,
-
記憶體淘汰策略:(用于快取的記憶體不足時,怎么處理新寫入且需要額外申請空間的資料),1)noevication,禁止淘汰,寫入會報錯,2)allkeys-lru:全鍵空間內,移除最近最少使用的(常用),3)allkeys-random:隨機移除,4)volatile-lru:設定了過期的鍵空間中,移除最近最少使用的,5)volatile-random:隨機移除,6)volatile-ttl:設定了過期的鍵空間中,優先移除有更早過期時間的key,
-
記憶體優化:合理利用集合型別,小的k/v可以以更緊湊的方式存放,盡可能使用散串列(hashes),散串列使用的記憶體小,盡可能將資料抽象到一個散串列,比如用戶,的名稱,密碼等所有資訊存盤到一個散串列,
-
事務:事務中的所有命令都會被序列化,就是一次性、順序性、排他性的執行一個佇列中的一系列命令,三個階段:事務開始MULTI-命令入隊-事務執行EXEC,執行程序中,如果服務端收到EXEC、DISCARD、WATCH、MULTI之外的請求,會把請求放入對列中排隊,WATCH命令是一個樂觀鎖,可以為redis事務提供CAS行為,可以監控一個或多個鍵,一旦其中有一個鍵被修改、洗掉,之后的事務不會被執行,監控一直持續到EXEC命令,MULTI用于開啟事務,總是回傳OK,開啟后,可以繼續向服務器發送任意多行命令,不會立即執行,被放佇列,當EXEC被呼叫時才執行,EXEC用于執行事務塊內的命令,回傳所有事務塊中命令的回傳值,按命令執行的先后順序排序,當操作被打斷,回傳空值,DISCARD可以清空事務串列,并放棄執行事務,并且客戶端會從事務狀態中退出,UNWATCH可以取消watch對所有key的監控,
-
redis的事務總是支持ACID中的一致性和隔離性,其他不支持,當運行在_AOF_持久化模式下,且appendfsyn選項為always時,事務也具有 耐久性,
-
單條命令是原子性執行的,基于Lua腳本,可以保證腳本內命令一次性、順序執行完成,但是事務不保證原子性,且沒有回滾,事務的任意命令執行失敗,其余命令也會繼續執行,
三、寫在后
只是簡要知識點概括,看到就能回憶起相關內容為最妙~~直接評論打卡,開整!!!
作者: letscrazy
出處: https://www.cnblogs.com/letscrazy/
關于作者:letscrazy
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出, 原文鏈接 如有問題, 可郵件([email protected])咨詢.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/539192.html
標籤:NoSQL
