laravel redis_如何将redis优化
Redis 單線程為什么還能這么快?
因?yàn)樗械臄?shù)據(jù)都在內(nèi)存中,所有的運(yùn)算都是內(nèi)存級(jí)別的運(yùn)算,而且單線程避免了多線程的切換性 能損耗問題。
Redis 單線程如何處理那么多的并發(fā)客戶端連接?
Redis的IO多路復(fù)用:redis利用epoll來實(shí)現(xiàn)IO多路復(fù)用,將連接信息和事件放到隊(duì)列中,依次放到 文件事件分派器,事件分派器將事件分發(fā)給事件處理器。
Redis 單線程為什么還能這么快?
因?yàn)樗械臄?shù)據(jù)都在內(nèi)存中,所有的運(yùn)算都是內(nèi)存級(jí)別的運(yùn)算,而且單線程避免了多線程的切換性 能損耗問題。
700粉絲福利安排一波,工作中準(zhǔn)備的,大家隨便拿
程序猿的生活:【社群福利】30G-PHP進(jìn)階資料,助力大家都能30K?zhuanlan.zhihu.comRedis 單線程如何處理那么多的并發(fā)客戶端連接?
Redis的IO多路復(fù)用:redis利用epoll來實(shí)現(xiàn)IO多路復(fù)用,將連接信息和事件放到隊(duì)列中,依次放到 文件事件分派器,事件分派器將事件分發(fā)給事件處理器。
其實(shí)對(duì)于redis來講,無(wú)論多少并發(fā),到了redis層都會(huì)排隊(duì),一個(gè)一個(gè)的來處理
Info: 查看redis服務(wù)運(yùn)行信息,分為 9 大塊,每個(gè)塊都有非常多的參數(shù),這 9 個(gè)塊分別是:
Server 服務(wù)器運(yùn)行的環(huán)境參數(shù)Clients 客戶端相關(guān)信息Memory 服務(wù)器運(yùn)行內(nèi)存統(tǒng)計(jì)數(shù)據(jù)
Persistence 持久化信息Stats 通用統(tǒng)計(jì)數(shù)據(jù)Replication 主從復(fù)制相關(guān)信息 CPU CPU 使用情況
Cluster 集群信息KeySpace 鍵值對(duì)統(tǒng)計(jì)數(shù)量信息
緩存穿透
緩存穿透是指查詢一個(gè)根本不存在的數(shù)據(jù), 緩存層和存儲(chǔ)層都不會(huì)命中, 通常出于容錯(cuò)的考慮, 如果從存儲(chǔ) 層查不到數(shù)據(jù)則不寫入緩存層。
緩存穿透將導(dǎo)致不存在的數(shù)據(jù)每次請(qǐng)求都要到存儲(chǔ)層去查詢, 失去了緩存保護(hù)后端存儲(chǔ)的意義。
1. 解決:可以將空對(duì)象緩存起來或者設(shè)置一個(gè)特殊意義的字符串來標(biāo)示此記錄數(shù)據(jù)庫(kù)中不存在,直接在緩存層返回
2. 布隆過濾器 對(duì)于惡意攻擊,向服務(wù)器請(qǐng)求大量不存在的數(shù)據(jù)造成的緩存穿透,還可以用布隆過濾器先做一次過濾,對(duì)于不 存在的數(shù)據(jù)布隆過濾器一般都能夠過濾掉,不讓請(qǐng)求再往后端發(fā)送。當(dāng)布隆過濾器說某個(gè)值存在時(shí),這個(gè)值可 能不存在;當(dāng)它說不存在時(shí),那就肯定不存在。
緩存失效
由于大批量緩存在同一時(shí)間失效可能導(dǎo)致大量請(qǐng)求同時(shí)穿透緩存直達(dá)數(shù)據(jù)庫(kù),可能會(huì)造成數(shù)據(jù)庫(kù)瞬間壓力過大 甚至掛掉,對(duì)于這種情況我們?cè)谂吭黾泳彺鏁r(shí)最好將這一批數(shù)據(jù)的緩存過期時(shí)間設(shè)置為一個(gè)時(shí)間段內(nèi)的不同 時(shí)間。
int expireTime = new Random().nextInt(300) + 300;
bigkey
bigkey的壞處:
1. 帶寬固定,千兆網(wǎng)卡(按照字節(jié)來算是 128M/s),假設(shè)一個(gè)key的value大小為1M,有1000個(gè)連接并發(fā),1s所占用的帶寬就是1000M,會(huì)造成網(wǎng)絡(luò)堵塞。
2. redis堵塞,單線程處理bigkey有可能造成其他連接排隊(duì)
在Redis中,一個(gè)字符串最大512MB,一個(gè)二級(jí)數(shù)據(jù)結(jié)構(gòu)(例如hash、list、set、zset)可以存 儲(chǔ)大約40億個(gè)(2^32-1)個(gè)元素,但實(shí)際中如果下面兩種情況,我就會(huì)認(rèn)為它是bigkey。
1. 字符串類型:它的big體現(xiàn)在單個(gè)value值很大,一般認(rèn)為超過10KB就是bigkey。
2. 非字符串類型:哈希、列表、集合、有序集合,它們的big體現(xiàn)在元素個(gè)數(shù)太多。
一般來說,string類型控制在10KB以內(nèi),hash、list、set、zset元素個(gè)數(shù)不要超過5000(超過5000了可以采用分拆思想)
過期鍵清除策略
Redis對(duì)于過期鍵有三種清除策略:
· 被動(dòng)刪除:當(dāng)讀/寫一個(gè)已經(jīng)過期的key時(shí),會(huì)觸發(fā)惰性刪除策略,直接刪除掉這個(gè)過期key
· 主動(dòng)刪除:由于惰性刪除策略無(wú)法保證冷數(shù)據(jù)被及時(shí)刪掉,所以Redis會(huì)定期主動(dòng)淘汰一批已過期的key)
· 當(dāng)前已用內(nèi)存超過maxmemory限定時(shí),觸發(fā)主動(dòng)清理策略
主動(dòng)清理策略又分五種
· allkeys-lru:根據(jù)LRU算法刪除鍵,不管數(shù)據(jù)有沒有設(shè)置超時(shí)屬性,直到騰出足夠空間 為止。
· allkeys-random:隨機(jī)刪除所有鍵,直到騰出足夠空間為止。
· volatile-random: 隨機(jī)刪除過期鍵,直到騰出足夠空間為止。
· volatile-ttl:根據(jù)鍵值對(duì)象的ttl屬性,刪除最近將要過期數(shù)據(jù)。如果沒有,回退到noeviction策略。 (常用)
· noeviction:不會(huì)剔除任何數(shù)據(jù),拒絕所有寫入操作并返回客戶端錯(cuò)誤信息"(error)OOM command not allowed when used memory",此時(shí)Redis只響應(yīng)讀操作。
phper 在進(jìn)階的時(shí)候總會(huì)遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那 里入手去提升,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、
高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql 優(yōu)化、
shell 腳本、Docker、微服務(wù)、Nginx 等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家
這些的話是在下面的直播課中講解過很多期,并且在不斷更新中
大廠必備面試題,來拿吧!
程序猿的生活:PHP經(jīng)典面試題集(含答案)?zhuanlan.zhihu.com以上內(nèi)容希望幫助到大家,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那里入手去提升,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家,需要的可以加入我的官方群點(diǎn)擊此處。
總結(jié)
以上是生活随笔為你收集整理的laravel redis_如何将redis优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js用递归遍历多维数组_js面试题更新之
- 下一篇: git config设置用户名_hexo