0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

redis的lru原理

科技綠洲 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2023-12-05 09:56 ? 次閱讀

Redis是一種基于內(nèi)存的鍵值數(shù)據(jù)庫(kù),它使用了LRU(Least Recently Used)算法來(lái)進(jìn)行緩存的數(shù)據(jù)淘汰。LRU算法的核心思想是最近最少使用的數(shù)據(jù)將會(huì)在未來(lái)也不常用,因此應(yīng)該優(yōu)先從緩存中進(jìn)行淘汰。下面將詳細(xì)介紹Redis的LRU原理。

  1. 概述
    Redis使用一個(gè)雙向鏈表來(lái)維護(hù)緩存中的數(shù)據(jù),鏈表的頭部表示最近使用的數(shù)據(jù),而鏈表的尾部表示最久未使用的數(shù)據(jù)。每當(dāng)有新的數(shù)據(jù)被訪問(wèn)時(shí),Redis會(huì)將該數(shù)據(jù)移動(dòng)到鏈表的頭部。當(dāng)緩存達(dá)到了預(yù)設(shè)的容量上限時(shí),Redis會(huì)淘汰鏈表尾部的數(shù)據(jù)。
  2. 雙向鏈表
    在Redis中,雙向鏈表是一個(gè)重要的數(shù)據(jù)結(jié)構(gòu)。每個(gè)節(jié)點(diǎn)除了存儲(chǔ)實(shí)際的數(shù)據(jù)之外,還包含了指向前一個(gè)節(jié)點(diǎn)和后一個(gè)節(jié)點(diǎn)的指針。這使得在鏈表中插入、刪除數(shù)據(jù)成為可能,而且具有較低的時(shí)間復(fù)雜度。
  3. 緩存的數(shù)據(jù)結(jié)構(gòu)
    在Redis中,緩存的數(shù)據(jù)結(jié)構(gòu)是一個(gè)字典(hashmap),字典中的key是用戶定義的鍵,value則存放了與該鍵相關(guān)的信息,其中包括實(shí)際的數(shù)據(jù)、緩存項(xiàng)的訪問(wèn)頻率等。
  4. 訪問(wèn)頻率的更新
    每當(dāng)一個(gè)緩存項(xiàng)被訪問(wèn)時(shí),Redis會(huì)根據(jù)訪問(wèn)頻率的更新規(guī)則來(lái)更新該項(xiàng)的信息。Redis使用了兩種方式來(lái)衡量訪問(wèn)頻率,分別是時(shí)間衰減和固定使用計(jì)數(shù)。

時(shí)間衰減:Redis使用一個(gè)計(jì)時(shí)器來(lái)記錄每個(gè)緩存項(xiàng)最后一次被訪問(wèn)的時(shí)間。當(dāng)一個(gè)緩存項(xiàng)被訪問(wèn)時(shí),Redis會(huì)通過(guò)計(jì)算當(dāng)前時(shí)間和最后一次訪問(wèn)時(shí)間的差值來(lái)更新該項(xiàng)的訪問(wèn)頻率。根據(jù)差值的大小,可以對(duì)訪問(wèn)頻率進(jìn)行加權(quán),權(quán)重越大表示訪問(wèn)頻率越高。

固定使用計(jì)數(shù):在某些場(chǎng)景下,時(shí)間衰減的方式可能無(wú)法滿足需求,例如某些熱門數(shù)據(jù)可能需要更頻繁地被訪問(wèn)。為了解決這個(gè)問(wèn)題,Redis還引入了固定使用計(jì)數(shù)的方式。當(dāng)一個(gè)緩存項(xiàng)被訪問(wèn)時(shí),會(huì)將該項(xiàng)的計(jì)數(shù)器加1。通過(guò)計(jì)數(shù)器的數(shù)值,可以衡量訪問(wèn)頻率的高低。

  1. LRU淘汰策略
    當(dāng)Redis中的數(shù)據(jù)達(dá)到緩存容量的上限時(shí),需要進(jìn)行數(shù)據(jù)的淘汰。LRU算法選擇鏈表中最久未使用的節(jié)點(diǎn)進(jìn)行淘汰。此時(shí),只需要將雙向鏈表的尾部節(jié)點(diǎn)刪除即可。
  2. 惰性淘汰
    Redis并不會(huì)立即進(jìn)行淘汰操作,而是等到有新的數(shù)據(jù)需要插入到緩存中時(shí),才會(huì)進(jìn)行數(shù)據(jù)的淘汰。這是因?yàn)镽edis認(rèn)為,數(shù)據(jù)的訪問(wèn)模式可能存在時(shí)間局部性,即最近訪問(wèn)的數(shù)據(jù)在短時(shí)間內(nèi)可能還會(huì)被再次訪問(wèn)。因此,等到有新的數(shù)據(jù)需要插入時(shí),再進(jìn)行淘汰,可以更準(zhǔn)確地找到最久未使用的數(shù)據(jù)。
  3. 尾部容量控制
    Redis的LRU算法還引入了尾部容量控制的概念。在容量控制中,尾部的節(jié)點(diǎn)相對(duì)頭部的節(jié)點(diǎn)有較低的優(yōu)先級(jí)。當(dāng)鏈表的尾部節(jié)點(diǎn)數(shù)目超過(guò)一定的閾值時(shí),Redis會(huì)從尾部開(kāi)始刪除節(jié)點(diǎn),以確保尾部不會(huì)無(wú)限制地增長(zhǎng)。
  4. 懲罰機(jī)制
    為了進(jìn)一步提高緩存的效率,Redis還引入了懲罰機(jī)制。當(dāng)某個(gè)節(jié)點(diǎn)被淘汰時(shí),Redis會(huì)對(duì)該節(jié)點(diǎn)的訪問(wèn)頻率進(jìn)行懲罰,以降低該節(jié)點(diǎn)再次被訪問(wèn)的概率。懲罰機(jī)制可以使得長(zhǎng)時(shí)間未使用的數(shù)據(jù)更容易被淘汰,從而提高緩存效率。

總結(jié):
Redis的LRU算法通過(guò)雙向鏈表和緩存的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)了高效的緩存淘汰策略。其中,雙向鏈表用于維護(hù)最近訪問(wèn)的數(shù)據(jù)的順序,而緩存的數(shù)據(jù)結(jié)構(gòu)則用于存儲(chǔ)真正的數(shù)據(jù)以及訪問(wèn)頻率的信息。LRU算法通過(guò)不斷更新訪問(wèn)頻率,并根據(jù)時(shí)間衰減或固定使用計(jì)數(shù)的方式來(lái)衡量訪問(wèn)頻率的高低。當(dāng)緩存達(dá)到容量上限時(shí),LRU算法會(huì)選擇鏈表尾部的節(jié)點(diǎn)進(jìn)行淘汰,并在插入新數(shù)據(jù)時(shí)進(jìn)行淘汰操作。此外,LRU算法還引入了尾部容量控制和懲罰機(jī)制,以進(jìn)一步優(yōu)化緩存的效率。通過(guò)這些機(jī)制的相互配合,Redis的LRU算法能夠?qū)崿F(xiàn)高效的數(shù)據(jù)淘汰,從而提高系統(tǒng)的整體性能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    226

    瀏覽量

    26610
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3734

    瀏覽量

    64170
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    369

    瀏覽量

    10810
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用Rust連接Redis

    Redis是一款快速、開(kāi)源、鍵值存儲(chǔ)數(shù)據(jù)庫(kù),被廣泛應(yīng)用于緩存、發(fā)布/訂閱系統(tǒng)、定時(shí)任務(wù)等場(chǎng)景中。Rust提供了很多Redis的客戶端庫(kù),本教程將會(huì)介紹如何使用Rust連接Redis,以及如何通過(guò)
    的頭像 發(fā)表于 09-19 16:22 ?2110次閱讀

    LRU緩存模塊最佳實(shí)踐

    LRU(Least Recently Used)是一種緩存替換算法,它的核心思想是當(dāng)緩存滿時(shí),替換最近最少使用的數(shù)據(jù)。在實(shí)際應(yīng)用中,LRU算法被廣泛應(yīng)用于緩存、頁(yè)面置換等領(lǐng)域。Rust語(yǔ)言提供了一個(gè)
    的頭像 發(fā)表于 09-30 16:47 ?820次閱讀

    RedisLRU實(shí)現(xiàn)和應(yīng)用

    在編程中,計(jì)數(shù)器是一種基本但強(qiáng)大的工具,用于跟蹤和管理數(shù)據(jù)和資源。本文將深入探討不同類型的計(jì)數(shù)器的應(yīng)用,從RedisLRU(最近最少使用)緩存淘汰算法的實(shí)現(xiàn),到如何在內(nèi)存受限的環(huán)境中有效地使用計(jì)數(shù)器,再到普通計(jì)數(shù)器的巧妙應(yīng)用。
    的頭像 發(fā)表于 12-15 09:24 ?529次閱讀

    Redis Stream應(yīng)用案例

    摘要: Redis Stream Redis最新的大版本5.0已經(jīng)RC1了,其中最重要的Feature莫過(guò)于Redis Stream了,關(guān)于Redis Stream的基本使用介紹和設(shè)計(jì)
    發(fā)表于 06-26 17:15

    redis概述

    REmote DIctionary Server(Redis)是一個(gè)基于key-value鍵值對(duì)的持久化數(shù)據(jù)庫(kù)存儲(chǔ)系統(tǒng)。redis和大名鼎鼎的Memcached緩存服務(wù)軟件很像,但是redis支持
    發(fā)表于 07-17 07:38

    如何使得redis中的數(shù)據(jù)不再有

    嵌入式Linux系統(tǒng)重啟后如何使得redis中的數(shù)據(jù)不再有今天在工作中遇到一個(gè)問(wèn)題:網(wǎng)頁(yè)展示redis中的數(shù)據(jù),然而再Linux系統(tǒng)重啟后網(wǎng)頁(yè)還能展示redis中的數(shù)據(jù),感覺(jué)很奇怪,到網(wǎng)上搜了下
    發(fā)表于 11-05 08:50

    基于修正LRU的壓縮Cache替換策略

    以優(yōu)化壓縮cache的替換策略為目標(biāo),提出一種優(yōu)化的基于修正LRU的壓縮cache替換策略MLRU-C。MLRU-C策略能利用壓縮cache中額外的tag資源,形成影子tag機(jī)制來(lái)探測(cè)并修正LRU替換策略的錯(cuò)誤
    發(fā)表于 04-15 09:51 ?36次下載

    什么是 Redis

    ? — ? 1 ?— 什么是 Redis? Redis(REmote DIctionary Service)是一個(gè)開(kāi)源的鍵值對(duì)數(shù)據(jù)庫(kù)服務(wù)器。 Redis 更準(zhǔn)確的描述是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器。Re
    的頭像 發(fā)表于 05-22 15:32 ?1047次閱讀
    什么是 <b class='flag-5'>Redis</b>

    在InnoDB如何選擇從LRU_list

    如果寫(xiě)入redo 速度不變, 那么生成page 速度不變, 如果刷臟能力極其快, 那么理論上LRU_scan_depth 的深度設(shè)置成用戶每秒最大的page IO 生成能力即可, 那么系統(tǒng)最好的狀態(tài)
    的頭像 發(fā)表于 05-29 10:59 ?483次閱讀
    在InnoDB如何選擇從<b class='flag-5'>LRU</b>_list

    設(shè)計(jì)并實(shí)現(xiàn)一個(gè)滿足LRU約束的數(shù)據(jù)結(jié)構(gòu)

    LRUCache(int capacity)` 以 **「正整數(shù)」** 作為容量 `capacity` 初始化 `LRU` 緩存
    的頭像 發(fā)表于 06-07 17:05 ?928次閱讀
    設(shè)計(jì)并實(shí)現(xiàn)一個(gè)滿足<b class='flag-5'>LRU</b>約束的數(shù)據(jù)結(jié)構(gòu)

    Redis的主從、哨兵、Redis Cluster集群

    ? 前言 今天跟小伙伴們一起學(xué)習(xí)Redis的主從、哨兵、Redis Cluster集群。 Redis主從 Redis哨兵 Redis Clu
    的頭像 發(fā)表于 06-12 14:58 ?744次閱讀
    <b class='flag-5'>Redis</b>的主從、哨兵、<b class='flag-5'>Redis</b> Cluster集群

    RedisLRU與LFU算法實(shí)現(xiàn)

    Redis是一款基于內(nèi)存的高性能NoSQL數(shù)據(jù)庫(kù),數(shù)據(jù)都緩存在內(nèi)存里, 這使得Redis可以每秒輕松地處理數(shù)萬(wàn)的讀寫(xiě)請(qǐng)求。
    的頭像 發(fā)表于 07-11 09:48 ?900次閱讀
    <b class='flag-5'>Redis</b>的<b class='flag-5'>LRU</b>與LFU算法實(shí)現(xiàn)

    如何用Springboot整合Redis

    本篇文件我們來(lái)介紹如何用Springboot整合Redis。 1、Docker 安裝 Redis 1.1 下載鏡像 docker pull redis: 6 . 2 . 6 1.2 創(chuàng)建配置文件
    的頭像 發(fā)表于 10-08 14:56 ?525次閱讀
    如何用Springboot整合<b class='flag-5'>Redis</b>

    redis的淘汰策略

    的寫(xiě)入。 Redis的淘汰策略主要有以下幾種: LRU(Least Recently Used,最近最少使用): 這是Redis默認(rèn)的淘汰策略。當(dāng)內(nèi)存空間不足時(shí),Redis會(huì)選擇最近最
    的頭像 發(fā)表于 12-04 16:23 ?495次閱讀

    redis容器內(nèi)怎么查看redis日志

    redis是一款流行的開(kāi)源內(nèi)存數(shù)據(jù)庫(kù),常用于緩存、消息隊(duì)列、任務(wù)管理等場(chǎng)景。在使用redis時(shí),了解如何查看redis日志對(duì)于排查問(wèn)題、監(jiān)控性能和分析應(yīng)用程序行為非常重要。在本文中,我們將介紹在
    的頭像 發(fā)表于 12-05 10:10 ?3205次閱讀