- 完全基于內存,絕大部分請求是純粹的內存操作。
- 數(shù)據(jù)結構簡單,對數(shù)據(jù)操作也簡單,Redis中的數(shù)據(jù)結構是專門進行設計的。
- 采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現(xiàn)死鎖而導致的性能消耗。
- 使用多路I/O復用模型,非阻塞IO。
- 使用底層模型不同,它們之間底層實現(xiàn)方式以及與客戶端之間通信的應用協(xié)議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統(tǒng)調用系統(tǒng)函數(shù)的話,會浪費一定的時間去移動和請求。
Redis 單線程如何處理那么多的并發(fā)客戶端連接?
Redis的IO多路復用:redis利用epoll來實現(xiàn)IO多路復用,將連接信息和事件放到隊列中,依次放到 文件事件分派器,事件分派器將事件分發(fā)給事件處理器。
其實對于redis來講,無論多少并發(fā),到了redis層都會排隊,一個一個的來處理
Info: 查看redis服務運行信息,分為 9 大塊,每個塊都有非常多的參數(shù),這 9 個塊分別是:
Server 服務器運行的環(huán)境參數(shù)
Clients 客戶端相關信息
Memory 服務器運行內存統(tǒng)計數(shù)據(jù)
Persistence 持久化信息
Stats 通用統(tǒng)計數(shù)據(jù)
Replication 主從復制相關信息 CPU CPU 使用情況
Cluster 集群信息
KeySpace 鍵值對統(tǒng)計數(shù)量信息
緩存穿透
緩存穿透是指查詢一個根本不存在的數(shù)據(jù), 緩存層和存儲層都不會命中, 通常出于容錯的考慮, 如果從存儲 層查不到數(shù)據(jù)則不寫入緩存層。
緩存穿透將導致不存在的數(shù)據(jù)每次請求都要到存儲層去查詢, 失去了緩存保護后端存儲的意義。
1. 解決:可以將空對象緩存起來或者設置一個特殊意義的字符串來標示此記錄數(shù)據(jù)庫中不存在,直接在緩存層返回
2. 布隆過濾器 對于惡意攻擊,向服務器請求大量不存在的數(shù)據(jù)造成的緩存穿透,還可以用布隆過濾器先做一次過濾,對于不 存在的數(shù)據(jù)布隆過濾器一般都能夠過濾掉,不讓請求再往后端發(fā)送。當布隆過濾器說某個值存在時,這個值可 能不存在;當它說不存在時,那就肯定不存在。
緩存失效
由于大批量緩存在同一時間失效可能導致大量請求同時穿透緩存直達數(shù)據(jù)庫,可能會造成數(shù)據(jù)庫瞬間壓力過大 甚至掛掉,對于這種情況我們在批量增加緩存時最好將這一批數(shù)據(jù)的緩存過期時間設置為一個時間段內的不同 時間。
int expireTime = new Random().nextInt(300) + 300;
bigkey
bigkey的壞處:
1. 帶寬固定,千兆網(wǎng)卡(按照字節(jié)來算是 128M/s),假設一個key的value大小為1M,有1000個連接并發(fā),1s所占用的帶寬就是1000M,會造成網(wǎng)絡堵塞。
2. redis堵塞,單線程處理bigkey有可能造成其他連接排隊
在Redis中,一個字符串最大512MB,一個二級數(shù)據(jù)結構(例如hash、list、set、zset)可以存 儲大約40億個(2^32-1)個元素,但實際中如果下面兩種情況,我就會認為它是bigkey。
1. 字符串類型:它的big體現(xiàn)在單個value值很大,一般認為超過10KB就是bigkey。
2. 非字符串類型:哈希、列表、集合、有序集合,它們的big體現(xiàn)在元素個數(shù)太多。
一般來說,string類型控制在10KB以內,hash、list、set、zset元素個數(shù)不要超過5000(超過5000了可以采用分拆思想)
過期鍵清除策略
Redis對于過期鍵有三種清除策略:
· 被動刪除:當讀/寫一個已經(jīng)過期的key時,會觸發(fā)惰性刪除策略,直接刪除掉這個過期key
· 主動刪除:由于惰性刪除策略無法保證冷數(shù)據(jù)被及時刪掉,所以Redis會定期主動淘汰一批已過期的key)
· 當前已用內存超過maxmemory限定時,觸發(fā)主動清理策略
主動清理策略又分五種
· allkeys-lru:根據(jù)LRU算法刪除鍵,不管數(shù)據(jù)有沒有設置超時屬性,直到騰出足夠空間 為止。
· allkeys-random:隨機刪除所有鍵,直到騰出足夠空間為止。
· volatile-random: 隨機刪除過期鍵,直到騰出足夠空間為止。
· volatile-ttl:根據(jù)鍵值對象的ttl屬性,刪除最近將要過期數(shù)據(jù)。如果沒有,回退到noeviction策略。 (常用)
· noeviction:不會剔除任何數(shù)據(jù),拒絕所有寫入操作并返回客戶端錯誤信息"(error)OOM command not allowed when used memory",此時Redis只響應讀操作。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/7507/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料