Redis-内存淘汰策略

音频降采样系数 如果需要把8K, 16K, 32K, 48K采样率的音频数据降为4K的音频数据, 最简单的方法根据降频倍数来取点, 但是线性度不好. 另一种线性度好一点的方法是: 取适当个数的点数, 各点乘以各自点的系数, 然后相加取平均值. 降频倍数与系数的关系如下: 2倍:     {0.3, 0.4, 0.3} 4倍:    {0.15, 0.2, 0.3, 0.2, 0.15} 8倍:   {0 阅读详情

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
2022网安保研经验帖 2022网安保研经验 阅读详情

相关推荐

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

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

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

JAVA成长之路 512

SSCardDriver.dll社会保障卡读写终端接口规范38号文接口

********************获取设备及PSAM卡信息********************//********************获取银行账户信息 ********************//********************获取设备信息********************//********************PIN校验********************//********************通用写卡********************/

广东东信智能科技有限公司的专栏 1744

算法

深度优先搜索(栈),广度优先搜索(队列),最大子序列和(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

避坑指南:在Linux服务器上用Conda安装antiSMASH 5.2.0(解决Jinja2报错和Matplotlib权限问题)

本文详细介绍了在Linux服务器上使用Conda安装antiSMASH 5.2.0的避坑指南,重点解决了Jinja2报错和Matplotlib权限问题。通过创建专用conda环境、安装指定版本依赖包和配置缓存目录,帮助用户顺利完成antiSMASH的本地部署,适用于批量处理基因组分析任务。

weixin_26911099的博客 316

FPGA控制DDR读写(AXI4总线接口)

FPGA控制DDR读写

qq_42712308的博客 1万+

Redis的6种淘汰策略详解

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

qq_45929019的博客 1292

Keil AC6编译器独立安装与配置指南:不升级Keil MDK也能用上新工具链

本文详细介绍了如何在不升级Keil MDK的情况下独立安装和配置Arm Compiler 6(AC6),帮助嵌入式开发者充分利用AC6的编译速度、代码密度和现代语言支持优势。通过零侵入式解决方案,开发者可以在现有环境中灵活切换编译器版本,提升开发效率。

weixin_30872157的博客 552

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

matlab电偶极子源码,电偶极子的MATLAB场模拟

电偶极子周围电场电势分布的MATLAB三维模拟Matlab可以用于模拟四维场的效果,本文以电偶极子的电场和电势场为例展示MATLAB在该方面领域的应用。摘要电偶极子由一个正电荷和一个负电荷组成,其电场和空间电势分布与单电荷相比具有一些重要的特性。本文将给出电场和电势场的近似表达式。这两个量的精确表达式是复杂的,不太常用,因此 MATLAB 被采用来操作精确值和绘制三维分布的远区域, 近区域和一侧区...

weixin_35135480的博客 3150

《Autosar从入门到精通-实战篇》总目录_培训教程持续更新中...

欢迎大家订阅《Autosar从入门到精通-实战篇》,下方整理了相关博文的目录(单击蓝色字体即可跳转),方便大家获取。 本专栏旨在:扫除Autosar工具链配置过程中的障碍,加深对Autosar理论的理解。 温馨提醒: 如有疑问,可在博文的“评论区”给小编留言,进行技术交流(评论区开启了验证功能,审核通过后,会显示); 如有疑问,也可以通过博文中的第一个图片联系小编,获取专栏/博文的实时状态; 由于工作限制,仅做个人技术交流。添加好友时,请备注您的“姓名-公司-职务...

「汽车电子助手」的博客 12万+

【Redis】内存淘汰策略

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

2301_78320637的博客 1951

深入浅出AXI协议(2)——通道及信号

本文我们继续AXI协议的学习,我们将讨论5个通道的具体内容和相对应的信号。这一部分的内容现在对于大家来说可能很难理解,但是没有关系,随着学习的深入,我们会逐步讲解这里面的所有现在,现在只需要把它们当作一个可以查阅的手册,快速阅读有一个基本的印象即可。

apple_53311083的博客 1799

Redis内存淘汰策略

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

weixin_58693169的博客 1564

Statistics and Machine Learning Toolbox

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Redis 内存淘汰策略

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

平平无奇的小甜菜 1182

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Redis的内存淘汰策略

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

Flying_Fish_roe的博客 2791

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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、付费专栏及课程。

余额充值