一、寫在前 知識學了就忘!不用就忘!我太健忘!特此記錄!用於複習打卡!Redis乾就完事了! 二、來辣! Redis做非同步隊列:一般list結構做隊列,rpush生產消息,lpop消費消息,當lpop沒有消息的時候,要適當sleep一會兒;如果不sleep,就用blpop,會阻塞;生產一次消費多次, ...
一、寫在前
知識學了就忘!不用就忘!我太健忘!特此記錄!用於複習打卡!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])咨詢.