日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis4.0之基于LFU的热点key发现机制

發(fā)布時間:2025/6/16 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis4.0之基于LFU的热点key发现机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

業(yè)務中存在訪問熱點是在所難免的,redis也會遇到這個問題,然而如何發(fā)現(xiàn)熱點key一直困擾著許多用戶,redis4.0為我們帶來了許多新特性,其中便包括基于LFU的熱點key發(fā)現(xiàn)機制。

Least Frequently Used

Least Frequently Used——簡稱LFU,意為最不經(jīng)常使用,是redis4.0新增的一類內(nèi)存逐出策略,關(guān)于內(nèi)存逐出可以參考文章《Redis數(shù)據(jù)過期和淘汰策略詳解》。

從LFU的字面意思我們很容易聯(lián)想到key的訪問頻率,但是4.0最初版本僅用來做內(nèi)存逐出,對于訪問頻率并沒有很好的記錄,那么經(jīng)過一番改造,redis于4.0.3版本開始正式支持基于LFU的熱點key發(fā)現(xiàn)機制。

LFU算法介紹

在redis中每個對象都有24 bits空間來記錄LRU/LFU信息:

typedef struct redisObject {unsigned type:4;unsigned encoding:4;unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or* LFU data (least significant 8 bits frequency* and most significant 16 bits access time). */int refcount;void *ptr; } robj;

當這24 bits用作LFU時,其被分為兩部分:

  • 高16位用來記錄訪問時間(單位為分鐘)
  • 低8位用來記錄訪問頻率,簡稱counter
  • 16 bits 8 bits+------------------+--------++ Last access time | LOG_C |+------------------+--------+

    counter:基于概率的對數(shù)計數(shù)器

    這里讀者可能會有疑問,8 bits最大值也就是255,只用8位來記錄訪問頻率夠用嗎?對于counter,redis用了一個trick的手段,counter并不是一個簡單的線性計數(shù)器,而是用基于概率的對數(shù)計數(shù)器來實現(xiàn),算法如下:

    uint8_t LFULogIncr(uint8_t counter) {if (counter == 255) return 255;double r = (double)rand()/RAND_MAX;double baseval = counter - LFU_INIT_VAL;if (baseval < 0) baseval = 0;double p = 1.0/(baseval*server.lfu_log_factor+1);if (r < p) counter++;return counter;}

    對應的概率分布計算公式為:

    1/((counter-LFU_INIT_VAL)*server.lfu_log_factor+1)

    其中LFU_INIT_VAL為5,我們看下概率分布圖會有一個更直觀的認識,以默認server.lfu_log_factor=10為例:

    從上圖可以看到,counter越大,其增加的概率越小,8 bits也足夠記錄很高的訪問頻率,下表是不同概率因子server.lfu_log_factor與訪問頻率counter的對應關(guān)系:

    # +--------+------------+------------+------------+------------+------------+ # | factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits | # +--------+------------+------------+------------+------------+------------+ # | 0 | 104 | 255 | 255 | 255 | 255 | # +--------+------------+------------+------------+------------+------------+ # | 1 | 18 | 49 | 255 | 255 | 255 | # +--------+------------+------------+------------+------------+------------+ # | 10 | 10 | 18 | 142 | 255 | 255 | # +--------+------------+------------+------------+------------+------------+ # | 100 | 8 | 11 | 49 | 143 | 255 | # +--------+------------+------------+------------+------------+------------+

    也就是說,默認server.lfu_log_factor為10的情況下,8 bits的counter可以表示1百萬的訪問頻率。

    counter的衰減因子

    從上一小節(jié)的counter增長函數(shù)LFULogIncr中我們可以看到,隨著key的訪問量增長,counter最終都會收斂為255,這就帶來一個問題,如果counter只增長不衰減就無法區(qū)分熱點key。

    為了解決這個問題,redis提供了衰減因子server.lfu_decay_time,其單位為分鐘,計算方法也很簡單,如果一個key長時間沒有訪問那么它的計數(shù)器counter就要減少,減少的值由衰減因子來控制:

    unsigned long LFUDecrAndReturn(robj *o) {unsigned long ldt = o->lru >> 8;unsigned long counter = o->lru & 255;unsigned long num_periods = server.lfu_decay_time ? LFUTimeElapsed(ldt) / server.lfu_decay_time : 0;if (num_periods)counter = (num_periods > counter) ? 0 : counter - num_periods;return counter; }

    默認為1的情況下也就是N分鐘內(nèi)沒有訪問,counter就要減N。

    概率因子和衰減因子均可配置,推薦使用redis的默認值即可:

    lfu-log-factor 10 lfu-decay-time 1

    熱點key發(fā)現(xiàn)

    介紹完LFU算法,接下來就是我們關(guān)心的熱點key發(fā)現(xiàn)機制。

    其核心就是在每次對key進行讀寫訪問時,更新LFU的24 bits域代表的訪問時間和counter,這樣每個key就可以獲得正確的LFU值:

    void updateLFU(robj *val) {unsigned long counter = LFUDecrAndReturn(val);counter = LFULogIncr(counter);val->lru = (LFUGetTimeInMinutes()<<8) | counter; }

    那么用戶如何獲取訪問頻率呢?redis提供了OBJECT FREQ子命令來獲取LFU信息,但是要注意需要先把內(nèi)存逐出策略設置為allkeys-lfu或者volatile-lfu,否則會返回錯誤:

    127.0.0.1:6379> config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction" 127.0.0.1:6379> object freq counter:000000006889 (error) ERR An LFU maxmemory policy is not selected, access frequency not tracked. Please note that when switching between policies at runtime LRU and LFU data will take some time to adjust.127.0.0.1:6379> config set maxmemory-policy allkeys-lfu OK 127.0.0.1:6379> object freq counter:000000006889 (integer) 3

    使用scan命令遍歷所有key,再通過OBJECT FREQ獲取訪問頻率并排序,即可得到熱點key。為了方便用戶使用,redis 4.0.3同時也提供了redis-cli的熱點key發(fā)現(xiàn)功能,執(zhí)行redis-cli時加上--hotkeys選項即可,示例如下:

    $./redis-cli --hotkeys# Scanning the entire keyspace to find hot keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed).[00.00%] Hot key 'counter:000000000002' found so far with counter 87 [00.00%] Hot key 'key:000000000001' found so far with counter 254 [00.00%] Hot key 'mylist' found so far with counter 107 [00.00%] Hot key 'key:000000000000' found so far with counter 254 [45.45%] Hot key 'counter:000000000001' found so far with counter 87 [45.45%] Hot key 'key:000000000002' found so far with counter 254 [45.45%] Hot key 'myset' found so far with counter 64 [45.45%] Hot key 'counter:000000000000' found so far with counter 93-------- summary -------Sampled 22 keys in the keyspace! hot key found with counter: 254 keyname: key:000000000001 hot key found with counter: 254 keyname: key:000000000000 hot key found with counter: 254 keyname: key:000000000002 hot key found with counter: 107 keyname: mylist hot key found with counter: 93 keyname: counter:000000000000 hot key found with counter: 87 keyname: counter:000000000002 hot key found with counter: 87 keyname: counter:000000000001 hot key found with counter: 64 keyname: myset

    可以看到,排在前幾位的即是熱點key。

    結(jié)束

    基于4.0的云redis已正式上線,登陸阿里云控制臺即可開通:https://www.aliyun.com/product/kvstore

    總結(jié)

    以上是生活随笔為你收集整理的redis4.0之基于LFU的热点key发现机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 4438激情网| 天天色天天色 | 靠逼视频网站 | 亚洲欧美精品午睡沙发 | 男同毛片 | 免费成人91| 亚洲精品在线视频观看 | av青青草原| 天天干天天操天天爽 | 午夜影院 | 国产第3页 | 国产乱妇无码大片在线观看 | 在线观看免费人成视频 | 欧美人和黑人牲交网站上线 | 国产一区视频在线 | 日本一道在线 | 亚洲国产精品网站 | 免费一级片视频 | 香蕉视频1024 | 尤物av在线 | 亚洲自拍图片 | 国产精品熟女一区二区不卡 | 国产成人欧美 | 欧美最猛黑人xxxx黑人猛交 | 黄色av大片 | 中文字幕亚洲视频 | 一区二区免费 | 国产113页| 国产精品久久久久蜜臀 | 午夜男人的天堂 | 日本视频不卡 | 91精品国产一区二区三区蜜臀 | 日韩有码电影 | 网站免费视频www | 国产精品sm调教免费专区 | 男人与雌宠物交h | 国产三级直播 | 亚洲天堂网一区二区 | 欧亚一级片 | 日本在线看 | 一本一本久久a久久精品综合麻豆 | 麻豆成人精品 | 久久亚洲av成人无码国产电影 | 红杏出墙记| 怡红院成永久免费人全部视频 | 精品女同一区二区 | 成人精品电影 | 中文字幕2018 | 老司机精品视频在线播放 | 人人草在线视频 | 国产在线网站 | 国产欧美一区二区三区四区 | 国产二区三区 | 91小宝寻花一区二区三区 | 婷婷爱五月 | 涩色视频 | 国产福利精品在线观看 | 久草视频在 | 伊人久久五月 | 国产精品自在线 | 任你操精品 | 国产又爽又猛又粗的视频a片 | 久艹在线 | 国产精品白嫩极品美女视频 | 长篇高h肉爽文丝袜 | 色偷偷欧美 | 一级特黄aa大片欧美 | 秋霞欧美一区二区三区视频免费 | 成人黄网免费观看视频 | 中文字幕无线精品亚洲乱码一区 | 特极毛片| 国产精选网站 | a人片| 少妇媚药按摩中文字幕 | 亚洲男人网 | 自拍偷拍专区 | 岛国大片在线观看 | 久久在线视频 | 成人六区 | 最新三级网站 | 美女极度色诱图片www视频 | 五月综合激情网 | 久久精品偷拍视频 | 欧美视频在线观看 | 国产av一区二区三区传媒 | 五月天激情开心网 | 99re这里只有精品在线观看 | 九一毛片 | 欧美性大战久久久 | 青青草这里只有精品 | 秋霞无码一区二区 | 伊人网综合网 | 日本少妇xxx| 成人黄色免费视频 | 91av欧美| 久久国产三级 | 男女激情大尺度做爰视频 | 亚洲码无人客一区二区三区 | 日韩av中文字幕在线免费观看 |