243_Redis_事務(wù)_內(nèi)存回收_分配算法

      網(wǎng)友投稿 773 2025-04-06

      Redis事務(wù)


      Redis事務(wù)概念

      Redis 事務(wù)的本質(zhì)是一組命令的集合。事務(wù)支持一次執(zhí)行多個(gè)命令,一個(gè)事務(wù)中所有命令都會(huì)被序列化。在事務(wù)執(zhí)行過(guò)程,會(huì)按照順序串行化執(zhí)行隊(duì)列中的命令,其他客戶端提交的命令請(qǐng)求不會(huì)插入到事務(wù)執(zhí)行命令序列中

      綜述redis事務(wù)就是一次性、順序性、排他性的執(zhí)行一個(gè)隊(duì)列中的一系列命令。

      Redis事務(wù)沒(méi)有隔離級(jí)別的概念

      批量操作在發(fā)送 EXEC 命令前被放入隊(duì)列緩存,并不會(huì)被實(shí)際執(zhí)行!

      Redis不保證原子性

      Redis中,單條命令是原子性執(zhí)行的,但事務(wù)不保證原子性,且沒(méi)有回滾。事務(wù)中任意命令執(zhí)行失敗,其余的命令仍會(huì)被執(zhí)行

      Redis事務(wù)的三個(gè)階段

      開(kāi)始事務(wù) Multi

      命令入隊(duì)? 具體命令

      執(zhí)行事務(wù)? exec/discard

      Redis事務(wù)相關(guān)命令

      從輸入Multi命令開(kāi)始,輸入的命令都會(huì)依次進(jìn)入命令隊(duì)列中,但不會(huì)執(zhí)行,直到輸入Exec后,Redis會(huì)將之前的命令隊(duì)列中的命令依次執(zhí)行

      組隊(duì)的過(guò)程中可以通過(guò)discard來(lái)放棄組隊(duì)

      組隊(duì)中某個(gè)命令出現(xiàn)了報(bào)告錯(cuò)誤,執(zhí)行時(shí)整個(gè)的所有隊(duì)列都會(huì)被取消

      如果執(zhí)行階段某個(gè)命令報(bào)出了錯(cuò)誤,則只有報(bào)錯(cuò)的命令不會(huì)被執(zhí)行,而其他的命令都會(huì)執(zhí)行,不會(huì)回滾

      watch key1 key2 ... #監(jiān)視一或多個(gè)key,如果在事務(wù)執(zhí)行之前,被監(jiān)視的key被其他命令改動(dòng),則事務(wù)被打斷(類似樂(lè)觀鎖) multi # 標(biāo)記一個(gè)事務(wù)塊的開(kāi)始( queued ) exec # 執(zhí)行所有事務(wù)塊的命令 ( 一旦執(zhí)行exec后,之前加的監(jiān)控鎖都會(huì)被取消掉 ) discard # 取消事務(wù),放棄事務(wù)塊中的所有命令 unwatch # 取消watch對(duì)所有key的監(jiān)控

      127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set user bob QUEUED 127.0.0.1:6379> incr user QUEUED 127.0.0.1:6379> set user2 alex QUEUED 127.0.0.1:6379> exec / discard #exec后才真正執(zhí)行 1) OK 2) (error) ERR value is not an integer or out of range 3) OK 127.0.0.1:6379> get user2 "alex"

      Watch 監(jiān)控

      悲觀鎖:

      悲觀鎖(Pessimistic Lock), 每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿到這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。 傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)里面就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫(xiě)鎖等,都是在操作之前先上鎖

      樂(lè)觀鎖

      樂(lè)觀鎖(Optimistic Lock) 每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖 但是在更新的時(shí)候會(huì)判斷一下再此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)等機(jī)制, 樂(lè)觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量, 樂(lè)觀鎖策略:提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新

      Watch 本質(zhì)是樂(lè)觀鎖, 但是watch可以用來(lái)解決并發(fā)修改的方法

      會(huì)在事務(wù)開(kāi)始之前 頂住 一個(gè)或多個(gè)變量,

      當(dāng)事務(wù)執(zhí)行時(shí)(服務(wù)收到exec) 就要順序執(zhí)行指令,

      Redis檢查頂住的變量,如果該變量被修改, exec會(huì)返回null 告訴客戶端執(zhí)行失敗

      內(nèi)存回收機(jī)制

      Redis不會(huì)立即回收內(nèi)存給操作系統(tǒng)操作系統(tǒng)是以頁(yè)為單位回收內(nèi)存的, 只要這個(gè)頁(yè)上還有一個(gè)key 這個(gè)頁(yè)就不能回收, 所以無(wú)法立即回收內(nèi)存頁(yè), 但會(huì)重新使用這些尚未回收的空閑內(nèi)存

      內(nèi)存分配算法

      Redis使用jemalloc (facebook)庫(kù)來(lái)管理內(nèi)存, 可以切換tcmalloc(Google)庫(kù)

      通過(guò)info memory 查看內(nèi)存情況

      127.0.0.1:6379> info memory # Memory used_memory:725896 used_memory_human:708.88K used_memory_rss:684880 used_memory_rss_human:668.83K used_memory_peak:743832 used_memory_peak_human:726.40K used_memory_peak_perc:97.59% used_memory_overhead:711694 used_memory_startup:660224 used_memory_dataset:14202 used_memory_dataset_perc:21.63% allocator_allocated:1043496 allocator_active:327155712 allocator_resident:339738624 total_system_memory:0 total_system_memory_human:0B used_memory_lua:37888 used_memory_lua_human:37.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:313.52 allocator_frag_bytes:326112216 allocator_rss_ratio:1.04 allocator_rss_bytes:12582912 rss_overhead_ratio:0.00 rss_overhead_bytes:-339053744 mem_fragmentation_ratio:1.00 mem_fragmentation_bytes:0 mem_not_counted_for_evict:112 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:49950 mem_aof_buffer:112 mem_allocator:jemalloc-5.2.1-redis active_defrag_running:0 lazyfree_pending_objects:0

      指標(biāo)

      含義

      used_memory

      由 Redis 分配器分配的內(nèi)存總量,包含了redis進(jìn)程內(nèi)部的開(kāi)銷和數(shù)據(jù)占用的內(nèi)存,以字節(jié)(byte)為單位,即當(dāng)前redis使用內(nèi)存大小。

      used_memory_human

      已更直觀的單位展示分配的內(nèi)存總量。

      used_memory_rss

      向操作系統(tǒng)申請(qǐng)的內(nèi)存大小,與 top 、 ps等命令的輸出一致,即redis使用的物理內(nèi)存大小。

      used_memory_rss_human

      已更直觀的單位展示向操作系統(tǒng)申請(qǐng)的內(nèi)存大小。

      used_memory_peak

      redis的內(nèi)存消耗峰值(以字節(jié)為單位),即歷史使用記錄中redis使用內(nèi)存峰值。

      used_memory_peak_human

      以更直觀的格式返回redis的內(nèi)存消耗峰值

      used_memory_peak_perc

      使用內(nèi)存達(dá)到峰值內(nèi)存的百分比,used_memory/ used_memory_peak) *100%,即當(dāng)前redis使用內(nèi)存/歷史使用記錄中redis使用內(nèi)存峰值*100%

      used_memory_overhead

      Redis為了維護(hù)數(shù)據(jù)集的內(nèi)部機(jī)制所需的內(nèi)存開(kāi)銷,包括所有客戶端輸出緩沖區(qū)、查詢緩沖區(qū)、AOF重寫(xiě)緩沖區(qū)和主從復(fù)制的backlog。

      used_memory_startup

      Redis服務(wù)器啟動(dòng)時(shí)消耗的內(nèi)存

      used_memory_dataset

      數(shù)據(jù)實(shí)際占用的內(nèi)存大小,即used_memory-used_memory_overhead

      used_memory_dataset_perc

      數(shù)據(jù)占用的內(nèi)存大小的百分比,100%*(used_memory_dataset/(used_memory-used_memory_startup))

      total_system_memory

      整個(gè)系統(tǒng)內(nèi)存

      total_system_memory_human

      以更直觀的格式顯示整個(gè)系統(tǒng)內(nèi)存

      used_memory_lua

      Lua腳本存儲(chǔ)占用的內(nèi)存

      used_memory_lua_human

      以更直觀的格式顯示Lua腳本存儲(chǔ)占用的內(nèi)存

      maxmemory

      Redis實(shí)例的最大內(nèi)存配置

      243_Redis_事務(wù)_內(nèi)存回收_分配算法

      maxmemory_human

      以更直觀的格式顯示Redis實(shí)例的最大內(nèi)存配置

      maxmemory_policy

      當(dāng)達(dá)到maxmemory時(shí)的淘汰策略

      mem_fragmentation_ratio

      碎片率,used_memory_rss/ used_memory。ratio指數(shù)>1表明有內(nèi)存碎片,越大表明越多,<1表明正在使用虛擬內(nèi)存,虛擬內(nèi)存其實(shí)就是硬盤(pán),性能比內(nèi)存低得多,這是應(yīng)該增強(qiáng)機(jī)器的內(nèi)存以提高性能。一般來(lái)說(shuō),mem_fragmentation_ratio的數(shù)值在1 ~ 1.5之間是比較健康的。詳解

      mem_allocator

      內(nèi)存分配器

      active_defrag_running

      表示沒(méi)有活動(dòng)的defrag任務(wù)正在運(yùn)行,1表示有活動(dòng)的defrag任務(wù)正在運(yùn)行(defrag:表示內(nèi)存碎片整理)詳解

      lazyfree_pending_objects

      0表示不存在延遲釋放的掛起對(duì)象

      Redis

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:如何制作簡(jiǎn)單點(diǎn)的PPT 就是平時(shí)公司有簡(jiǎn)單的培訓(xùn)那種,
      下一篇:word怎么為跨頁(yè)表格自動(dòng)生成表頭(word 跨頁(yè)表頭)
      相關(guān)文章
      亚洲高清视频一视频二视频三| 亚洲精品无码日韩国产不卡?V| 最新亚洲成av人免费看| 久久亚洲中文无码咪咪爱| 亚洲人配人种jizz| 亚洲综合校园春色| 在线综合亚洲中文精品| avtt天堂网手机版亚洲| 亚洲乱码一区二区三区国产精品| 亚洲AV无码成人专区| 亚洲an日韩专区在线| 亚洲无人区码一二三码区别图片| 日韩亚洲国产综合高清| 亚洲色大网站WWW永久网站| 亚洲欧美日韩久久精品| 亚洲av永久无码天堂网| 色九月亚洲综合网| 亚洲阿v天堂在线2017免费| 亚洲精品国产综合久久一线| 亚洲伊人久久成综合人影院| 国产亚洲人成网站在线观看| 亚洲男人的天堂www| 亚洲AV成人片色在线观看高潮| 亚洲第一福利视频| 亚洲精品第五页中文字幕| 亚洲伊人色一综合网| 国产亚洲精品bv在线观看| 亚洲狠狠婷婷综合久久蜜芽| 色偷偷尼玛图亚洲综合| 亚洲AⅤ无码一区二区三区在线 | 亚洲麻豆精品国偷自产在线91| 亚洲精品第一国产综合境外资源 | 亚洲一级特黄大片在线观看| 国产亚洲精品影视在线产品| 亚洲AV日韩AV永久无码下载 | 亚洲AV无码乱码在线观看牲色| 亚洲日本在线观看视频| 国产亚洲av片在线观看播放| 亚洲国产美国国产综合一区二区| 亚洲精品在线视频观看| 在线观看日本亚洲一区|