一溃肪、什么是redis?
redis是c語言編寫的內(nèi)存型key-value高性能的數(shù)據(jù)庫西剥,遵從BSD協(xié)議
二、redis有哪些優(yōu)點(diǎn)蛙奖?
1潘酗、性能極高?– Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2雁仲、豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作仔夺。
3、原子 – Redis的所有操作都是原子性的攒砖,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行缸兔。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù)吹艇,即原子性惰蜜,通過MULTI和EXEC指令包起來。
4受神、豐富的特性?– Redis還支持 publish/subscribe, 通知, key 過期等等特性抛猖。
三、為什么使用redis?redis的使用場(chǎng)景鼻听?
1.性能
? ??我們?cè)谂龅叫枰獔?zhí)行耗時(shí)特別久财著,且結(jié)果不頻繁變動(dòng)的SQL,就特別適合將運(yùn)行結(jié)果放入緩存精算。
2.并發(fā)
? ??在大并發(fā)的情況下瓢宦,所有的請(qǐng)求直接訪問數(shù)據(jù)庫,數(shù)據(jù)庫會(huì)出現(xiàn)連接異常灰羽。這個(gè)時(shí)候驮履,就需要使用redis做一個(gè)緩沖操作,讓請(qǐng)求先訪問到redis廉嚼,而不是直接訪問數(shù)據(jù)庫玫镐。
四、redis的工作模式及原理
1怠噪、redis是單線程工作模型恐似。
(一)純內(nèi)存操作
(二)單線程操作,避免了頻繁的上下文切換
(三)采用了非阻塞I/O多路復(fù)用機(jī)制
2傍念、redis的線程模型
五矫夷、redis的過期策略以及內(nèi)存淘汰機(jī)制
redis采用的是定期刪除+惰性刪除策略。
定期刪除+惰性刪除是如何工作的呢?
定期刪除憋槐,redis默認(rèn)每個(gè)100ms檢查双藕,是否有過期的key,有過期key則刪除。需要說明的是阳仔,redis不是每個(gè)100ms將所有的key檢查一次忧陪,而是隨機(jī)抽取進(jìn)行檢查(如果每隔100ms,全部key進(jìn)行檢查,redis豈不是卡死)。因此嘶摊,如果只采用定期刪除策略延蟹,會(huì)導(dǎo)致很多key到時(shí)間沒有刪除。
于是叶堆,惰性刪除派上用場(chǎng)阱飘。也就是說在你獲取某個(gè)key的時(shí)候,redis會(huì)檢查一下虱颗,這個(gè)key如果設(shè)置了過期時(shí)間那么是否過期了俯萌?如果過期了此時(shí)就會(huì)刪除。
內(nèi)存淘汰機(jī)制
在redis.conf中有一行配置
# maxmemory-policy volatile-lru
1)noeviction:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)上枕,新寫入操作會(huì)報(bào)錯(cuò)。應(yīng)該沒人用吧弱恒。
2)allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)辨萍,在鍵空間中,移除最近最少使用的key返弹。推薦使用锈玉,目前項(xiàng)目在用這種。
3)allkeys-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)义起,在鍵空間中拉背,隨機(jī)移除某個(gè)key。應(yīng)該也沒人用吧默终,你不刪最少使用Key,去隨機(jī)刪椅棺。
4)volatile-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中齐蔽,移除最近最少使用的key两疚。這種情況一般是把redis既當(dāng)緩存,又做持久化存儲(chǔ)的時(shí)候才用含滴。不推薦
5)volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)诱渤,在設(shè)置了過期時(shí)間的鍵空間中,隨機(jī)移除某個(gè)key谈况。依然不推薦
6)volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)勺美,在設(shè)置了過期時(shí)間的鍵空間中,有更早過期時(shí)間的key優(yōu)先移除碑韵。不推薦
ps:如果沒有設(shè)置 expire 的key, 不滿足先決條件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不刪除) 基本上一致赡茸。
鏈接:https://redis.io/documentation? redis文檔