Redis-内存淘汰策略

快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代 随着这一创新工具的推出,我们正见证着Live2D角色创作进入了一个全新的阶段。它不仅极大地简化了角色设计的过程,也为广大创作者提供了一种全新的表达方式。对于那些渴望将脑海中的构思迅速转化为现实的人来说,这无疑是一大福音。现在就访问项目主页,开始探索无限可能吧!t=O83A项目主页https://human3daigc.github.io/Textoon_webpage/ 阅读详情

1. 过期删除策略

  1. 定期删除:在redis当中,默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
  2. 惰性删除:redis在获取某个key的时候就会其进行检查,若这个key设置了过期时间,它就会进行判断是否过期,如果过期了此时就会删除,不会给你返回任何东西。

总结:定期删除是集中处理,惰性删除是零散处理。

2. 几种淘汰机制

  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰。
  • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
  • no-enviction(驱逐):禁止驱逐数据,这也是默认策略。

3. PHP实现lru算法(lru淘汰策略实现)

  • ru算法是什么? 下图很好的解释了这一算法。
    在这里插入图片描述
  • 使用php实现lru策略
class LruNodeService
{
	private $key;
	//key对应的内容
	private $data;
	//结点右指针
	private $next;
	//结点左指针
	private $previous;
	
	/**
	* Node constructor.
	* @param $key
	* @param $data
	*/
	public function __construct($key, $data)
	{
		$this->key = $key;
		$this->data = $data;
	}
	
	/**
	* Sets a new value for the node data
	* @param string the new content of the node
	*/
	public function setData($data)
	{
		$this->data = $data;
	}
	
	/**
	* Sets a node as the next node
	* @param Node $next the next node
	*/
	public function setNext($next)
	{
		$this->next = $next;
	}
	
	/**
	* Sets a node as the previous node
	* @param Node $previous the previous node
	*/
	public function setPrevious($previous)
	{
		$this->previous = $previous;
	}
	
	/**
	* Returns the node key
	* @return string the key of the node
	*/
	public function getKey()
	{
		return $this->key;
	}
	
	/**
	* Returns the node data
	* @return mixed the content of the node
	*/
	public function getData()
	{
		return $this->data;
	}
	
	/**
	* Returns the next node
	* @return Node the next node of the node
	*/
	public function getNext()
	{
		return $this->next;
	}
	
	/**
	* Returns the previous node
	* @return Node the previous node of the node
	*/
	public function getPrevious()
	{
		return $this->previous;
	}
}
class LruService
{
	/*
	* 头部节点
	*/
	private $head;
	/*
	* 尾部节点
	*/
	private $tail;
	/*
	* 最大容量,大于淘汰部位节点指向上一个元素
	*/
	private $capacity;
	/*
	* 存储key对应的节点
	*/
	private $hashmap;
	
	public function __construct($capacity)
	{
		$this->capacity = $capacity;
		$this->hashmap = array();
		$this->head = new LruNodeService(null,null);
		$this->tail = new LruNodeService(null,null);
		$this->head->setNext($this->tail);
		$this->tail->setPrevious($this->head);
	}
	
	/**
	* 获取元素
	* @param $key
	* @return null
	*/
	public function get($key)
	{
		if (!isset($this->hashmap[$key])) {
			return null;
		}
		$node = $this->hashmap[$key];
		if (count($this->hashmap) == 1) {
			return $node->getData();
		}
		//先删除已经存在的结点
		$this->detach($node);
		//重新将新结点插入到头结点之后
		$this->attach($this->head, $node);
		return $node->getData();
	}
	
	/**
	* 设置key value
	* @param $key
	* @param $data
	* @return bool
	*/
	public function put($key, $data)
	{
		if ($this->capacity <= 0) {
			return false;
		}
		if (isset($this->hashmap[$key]) && !empty($this->hashmap[$key])) {
			$node = $this->hashmap[$key];
			//重置结点到头结点之后
			$this->detach($node);
			$this->attach($this->head, $node);
			$node->setData($data);
		} else {
			$node = new LruNodeService($key, $data);
			$this->hashmap[$key] = $node;
			//添加节点到头部节点之后
			$this->attach($this->head, $node);
			//检测容量是否达到最大值
			if (count($this->hashmap) > $this->capacity) {
				//如果达到最大值 删除尾节点左指针指向的元素
				$nodeToRemove = $this->tail->getPrevious();
				$this->detach($nodeToRemove);
				unset($this->hashmap[$nodeToRemove->getKey()]);
			}
		}
		return true;
	}
	
	/**
	* 删除key
	* @param $key
	* @return bool
	*/
	public function remove($key)
	{
		if (!isset($this->hashmap[$key])) {
			return false;
		}
		$nodeToRemove = $this->hashmap[$key];
		$this->detach($nodeToRemove);
		unset($this->hashmap[$nodeToRemove->getKey()]);
		return true;
	}
	
	/**
	* 添加新结点到头结点之后
	* @param $head
	* @param $node
	*/
	private function attach($head, $node)
	{
		//双向链表插入一个元素到头结点之后
		$node->setPrevious($head);
		$node->setNext($head->getNext());
		$node->getNext()->setPrevious($node);
		$node->getPrevious()->setNext($node);
	}
	
	/**
	* 删除结点
	* @param $node
	*/
	private function detach($node)
	{
		$node->getPrevious()->setNext($node->getNext());
		$node->getNext()->setPrevious($node->getPrevious());
	}
}

4. 多级缓存

4.1 Openresty安装

yum install readline-devel pcre-devel openssl-devel
wget https://openresty.org/download/ngx_openresty-1.9.7.1.tar.gz # 下载
tar xzvf ngx_openresty-1.9.7.1.tar.gz # 解压
cd ngx_openresty-1.9.7.1/
./configure
make
make install

4.2 使用Openresty创建lua脚本

ngx.header.content_type="application/json;charset=utf8"
local cjson = require("cjson") --引入模块
local mysql = require("resty.mysql") --引入mysql模块
local uri_args = ngx.req.get_uri_args()
local product_id = uri_args['product_id']
local db = mysql:new() --初始化数据库
db:set_timeout(1000) --设置超时时间
local props = {
	host = "192.168.59.100", --mysql ip地址
	port = 3306, --mysql 端口
	database = "shop", --mysql 数据库
	user = "root", password = "root" --用户名密码
}
local res = db:connect(props) --获得mysql连接
local select_sql = "select id,store from fm_products where id ='"..product_id.."'"--一条查询语句
res = db:query(select_sql) db:close() --执行
local redis = require("resty.redis") --引入redis
local red = redis:new() red:set_timeout(2000) --初始化 设置超时时间
local ip ="192.168.59.108"
local port = 6379
red:connect(ip,port)
red:auth("root")
red:set("product_"..product_id,cjson.encode(res)) --存储到redis
red:close()
ngx.say("{flag:true}")
ngx.header.content_type="application/json;charset=utf8"
local uri_args = ngx.req.get_uri_args()
local product_id = uri_args['product_id']
local cache_ngx = ngx.shared.dis_cache;
local adCache = cache_ngx:get('productcache'..product_id);
if adCache == "" or adCache == nil then
	local redis = require("resty.redis") --引入redis
	local red = redis:new() red:set_timeout(2000) --初始化 设置超时时间
	local ip ="192.168.59.108"
	local port = 6379
	red:connect(ip,port)
	red:auth("root")
	local rescontent=red:get("product_"..product_id)
	ngx.say(rescontent)
	red:close()
	cache_ngx:set('productcache'..product_id, rescontent, 10*60);
else
	ngx.say(adCache)
end
Linux 4.19、Linux 5.10、Linux 6.1 三个版本详细分析 Linux 4.19发布日期:2018年10月22日LTS 状态:是长期支持版本,官方支持到2024年12月。Linux 5.10发布日期:2020年12月13日LTS 状态:LTS 版本,官方支持到2026年12月。Linux 6.1发布日期:2022年12月11日LTS 状态:不是官方的LTS版本,但通常社区会为新的版本提供一定时间的支持。定位:稳定性和长期支持,广泛应用于多种平台,尤其是嵌入式系统和服务器。主要优势:稳定性高,广泛的硬件支持,核心功能可靠。 阅读详情

相关推荐

西门子PLC新手必看:200SMART与1200/1500的MODBUS RTU通讯实战(附完整配置流程)

本文详细解析了西门子PLC中S7-200 SMART与S7-1200/1500之间实现MODBUS RTU通讯的完整实战流程。内容涵盖硬件接线、软件配置及程序编写,重点讲解了200SMART作为从站、1200/1500作为主站的典型架构,并提供了关键功能块的使用方法和常见问题排查技巧,帮助新手快速打通不同系列PLC间的数据交换。

weixin_29214559的博客 395

(2.3.8)LRU算法四种实现方式介绍

RU全称是LeastRecently Used,即最近最久未使用的意思。 LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。 一、实现LRU 1.用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,将被访问的数据项的时间戳置为0。...

JAVA成长之路 512

顶会新宠!Gate+Attention创新思路发A会

性能提升:在Places2自然场景和CelebA-HQ人脸数据集上,与以往方法相比,该系统在自由形式掩码修复任务中取得了更高的质量和更低的误差(例如,平均ℓ1误差和ℓ2误差显著降低)。硬件效率提升:Griffin和Hawk在TPU-v3上的训练效率与Transformer相当,且在推理时具有更低的延迟和显著更高的吞吐量。门控卷积:提出了一种新的门控卷积机制,通过学习每个通道在每个空间位置的动态特征选择机制,解决了传统卷积将所有输入像素视为有效像素的问题。

2501_92785035的博客 974

算法

深度优先搜索(栈),广度优先搜索(队列),最大子序列和(O(n)),计数排序,基数排序count=(int *)malloc(sizeof(int)*(max+1));与count=(int *)malloc(sizeof(int)*max+1)区别memset(count, 0, sizeof(int)*(max + 1));与memset(count, 0, sizeof(int)*max +...

hueru的博客 340

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

qq_1432825237的博客 3991

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 970

Redis的6种淘汰策略详解

Redis是一种开源的高性能内存数据库,通常被用作缓存、消息队列或短期数据存储。它支持丰富的数据结构,如字符串、哈希、列表、集合等,具有极快的读写性能,能够满足高并发的需求。然而,由于Redis将所有数据存储在内存中,内存资源相对有限。当数据量超过内存容量时,Redis必须采取一定的策略来腾出空间,以存储新数据。这时就需要使用淘汰策略(Eviction Policy)来决定哪些数据会被移除。Redis提供了六种主要的淘汰策略,适用于不同的使用场景,确保在内存不足时能够高效地管理数据存储。

qq_45929019的博客 1292

文华指标源码—区间彩带

这就是当年东方财富软件终端里主打经典的指标、主要揭示主力成本区域。

qq2054129753的博客 888

redis-淘汰策略(8种)

LFU(Least Frequently Used):最少频率使用,统计每个key的访问频率,值越小越先被删除。2 volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,值越小越先被淘汰。1 noeviction(默认):不淘汰任何key,内存满时不写入新的key。6 volatile-lru:对设置了TTL的key基于LRU算法进行淘汰。8 volatile-lfu:对设置了TTL的key基于LFU算法进行淘汰。按照LRU算法对所有key或设置过期时间的key。

hzx790688184的博客 3823

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 740

论文理解【LLM-Clarification】—— 【QDrawer】Asking the Right Question at the Right Time: Human and Model Unce

本文基于 CoDraw 任务对 LLM 澄清提问的触发方式进行探索,发现模型内部不确定性与人类澄清决策相关性弱,使用不确定性阈值触发澄清提问相比模仿人类提问时机,性能和计算效率都更好

佚失的诗篇 770

【Redis】内存淘汰策略

Redis内存淘汰策略是指当Redis的内存使用达到其配置的最大内存限制maxmemory)时,Redis根据预设的策略自动删除一部分键(key)及其对应的值(value,以释放内存空间,从而避免内存溢出(OOM)错误的发生。Redis提供了多种内存淘汰策略,以满足不同应用场景的需求。

2301_78320637的博客 1951

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。

charce_you的专栏 914

Redis内存淘汰策略

Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。注意:逐出数据的过程不是100%能够清理出足够的可使用空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

weixin_58693169的博客 1564

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis 内存淘汰策略

Redis作为内存数据库,通过淘汰策略管理内存空间。当内存不足时,Redis支持两种方式释放空间:设置键过期时间自动删除和主动淘汰策略。淘汰策略分为三类:1)volatile-*系列仅淘汰设置了过期时间的键;2)allkeys-*系列对所有键进行淘汰;3)noeviction禁止淘汰直接报错。

平平无奇的小甜菜 1182

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Redis的内存淘汰策略

Redis中的内存淘汰策略是用于在内存不足时选择哪些键需要被删除以释放内存空间。noeviction:不删除任何键,当内存不足时,所有写操作都会报错。allkeys-lru:在所有键中,选择最近最少使用(Least Recently Used)的键进行删除。volatile-lru:在设置了过期时间的键中,选择最近最少使用的键进行删除。allkeys-random:在所有键中,随机选择一个键进行删除。volatile-random:在设置了过期时间的键中,随机选择一个键进行删除。

Flying_Fish_roe的博客 2791

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Redis 内存淘汰策略详解

Redis 是一款高性能的非关系型数据库,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合和 HyperLogLog。Redis 可以用于缓存、消息队列、应用程序中的数据结构存储等场景,它的优点是响应速度快、支持丰富的数据结构和扩展性好。

BXA 4858

Redis内存淘汰策略详解

1、为什么需要内存淘汰策略 2、Redis中的max-memory 3、淘汰内存的过程 4、Redis中的内存淘汰策略 5、Redis中实现的LRU算法为近似算法 6、Redis中的LFU算法 7、内存淘汰策略的选择(个人观点) 1、为什么需要内存淘汰策略 我们都知道Redis是一个基于k-v数据库,随着里面键值对的增加,redis内存的使用量也会上升,因此,我们需要对Redis的最大内存使用量进行限制。那么有了Redis的内存容量限制,那么就会有达到这个内存容量限制的时候,这个时候就需要.

henry_yang2018的博客 1万+

Redis 内存淘汰策略 (史上最全)

1.前言 Redis内存淘汰策略,是被很多小伙伴忽略的知识盲区,注意,是盲区。 注意,Redis如果内存淘汰策略配置不合理,可能会导致Redis无法服务。 所以,使用此文,对Redis内存淘汰策略专门进行介绍。 此文内容,将收入电子书《Java面试红宝书》的0.2版本中。看完此书,您一定会Java内力大增。 首先,介绍一下Redis过期删除策略,然后,再介绍Redis淘汰策略. 1 Redis过期删除策略 Redis对于过期的key,有两种删除策略: 定期删除 惰性删除 定期删除 redis 会

架构师尼恩 2万+

Redis 的八大内存淘汰策略

Redis提供8种内存淘汰策略,分为针对所有键(allkeys)和仅针对过期键(volatile)两大类。核心算法包括LRU(最近最少使用)、LFU(最不经常使用)、TTL(过期时间优先)和随机淘汰,各有适用场景。默认策略noeviction拒绝写入操作。配置优化需考虑采样精度、访问模式、数据重要性等因素,并监控内存碎片和淘汰指标。合理选择策略(如热点数据用allkeys-lru,临时数据用volatile-ttl)可有效平衡性能和内存管理。

csdn_tom_168的博客 1080

Redis内存淘汰策略解析

在众多高性能的键值存储系统中,Redis以其卓越的性能和丰富的功能,在互联网领域得到了广泛的应用。然而,随着数据量的不断增长,Redis如何处理内存的动态分配和回收成为一个关键问题。这就引出了本文要介绍的Redis知识点——内存淘汰策略。在现实应用中,我们常常会遇到这样的场景:当Redis服务器中的数据量达到一定阈值时,系统可能会因为内存不足而无法继续存储新的数据。这种情况下,如果不采取相应的措施,系统将面临严重的性能问题,甚至可能导致服务中断。为了解决这个问题,Redis引入了内存淘汰策略。

我是Java程序员廖志伟,感谢朋友们的支持! 1181

Redis 的内存淘汰策略详解

要配置 Redis 的内存淘汰策略,可以通过修改 Redis 配置文件redis.conf或者在运行时通过命令行直接设置。

jkzyx123的博客 2265

Redis的内存淘汰策略?

Redis 采用随机抽样(默认抽取 5 个键),淘汰其中最久未使用的键,而非全局遍历(节省性能)。:基于 Morris 计数器算法,记录键的访问频率(衰减机制避免旧数据长期占据内存)。分钟,计数器值减半,逐步降低历史高频访问数据的影响。:部分数据允许过期,需优先保留高频访问的热点数据。:所有数据允许被淘汰,需优先保留高频访问数据。中,淘汰**最近最少使用(LRU)**的键。中,淘汰**最不经常使用(LFU)**的键。中,淘汰**最近最少使用(LRU)**的键。中,淘汰**最不经常使用(LFU)**的键。

looken1024的博客 1941
上一篇: Redis-分布式锁
下一篇: docker-安装及简单应用
Mossil
博客等级 码龄10年 1粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值