九、Redis 的实际使用与Redis的设计
一、多级缓存架构
在线上系统中,一定不会单纯的只部署一个Redis集群,而是使用Redis结合其他的多级缓存应用进行架构。

使用多级缓存架构的优点就是可以使不同类型的数据分布在不同的应用中,比如redis的热点key可以存储到nginx本地缓存、服务集群的本地缓存,进而分散单应用的服务压力。
二、redisObject
所有value对象在内部定义为redisObject结构体。

三、Redis的单线程
redis的单线程不是真的单线程,在内部执行命令的时候使用单线程,但是其他的操作夜壶开启其他的线程。

1、IO多路复用器
2、文件事件分派器
3、文件事件处理器
4、Redis 6 提供了多线程执行
四、Redis的缓存淘汰机制
当Redis的可用内存占满的时候,就会触发内存和磁盘的swap交换,导致Redis的性能急剧下降。这是绝对不能允许的,为了限制最大内存的使用,Redis使用参数:maxmemory限制Redis缓存的最大容量。当达到Redis缓存的限制,就触发缓存淘汰机制。
修改maxmemory-policy参数可以指定使用哪种缓存淘汰机制。可选项包括:
noeviction,
volatile-lru,
volatile-ttl,
volatile-random,
allkeys-lru,
allkeys-random,
volatile-lfu,
allkeys-lfu
查看当前配置的内存淘汰策略
config get maxmemory-policy
1、noeviction - 默认
不可驱动,当内存中的数据量达到配置的内存时,为了避免数据丢失,不可执行set操作,只能执行读操作、删除操作。
2、volatile-lru
lru - less read use
没设置过期时间的key不淘汰。
针对设置了过期时间的key,执行淘汰。
淘汰的原则是使用次数最少的key优先被淘汰。
3、volatile-ttl
没设置过期时间的key不淘汰。
针对设置了过期时间的key,执行淘汰。
淘汰的原则是哪个key剩余的存活时间最短,就淘汰哪个key。
4、volatile-random
没设置过期时间的key不淘汰。
针对设置了过期时间的key,执行淘汰。
随机淘汰策略。
5、allkeys-lru
针对所有key,使用最少的先淘汰。
6、allkeys-random
针对所有key,随机淘汰。
7、volatile-lfu
针对有过期时间的key,先淘汰访问频次少的key。
8、allkeys-lfu
针对所有key,先淘汰访问频次少的key。
五、缓存淘汰相关算法
1、LRU算法
最近使用原则。
通用的LRU算法是维护一个链表,将最近访问的key放到链表的头部。这样不经常访问的key就会被挤到链表的尾部,当执行淘汰的时候就从链表最尾部开始淘汰。
但是维护这样的链表会造成额外的开销,Redis为了保证响应的效率,没维护这样的链表,而是使用了【近似LRU算法】。
2、近似LRU算法
与LRU算法稍有不同,并不是真正维护了一个访问顺序链表,而是在每一个key上开辟了一块【24bit】的空间,记录着上一次访问的时间戳,通过比较时间戳的大小也能实现访问顺序链表的功能。
默认配置下,通过每次采样5个key,互相比较上次访问的时间戳,淘汰最早访问的key。直到内存数据小于maxmemory配置的大小。
采样数量配置参数:maxmemory-samples

采样范围:根据maxmemory-policy配置的淘汰策略决定。
3、LFU算法
Redis 4.0 版本之后新增了LFU算法,采样成功后再根据key最近被访问的频次决定淘汰哪些key,访问频次越少的先被淘汰。而不是单纯根据最近访问时间做判断。
为什么要这么做呢?场景一:当redis初始化的时候,所有的key基本都在同一时间加载,且越重要的越早加载,这时候不能盲目地根据最后访问时间决定淘汰哪些缓存。
那么是如何实现记录访问频次的呢?在key上的【24bit】空间的基础上,分成了【16bit】+【8bit】的空间,大的记录着最后访问时间戳(精度下降),小的记录着访问次数。
4、缓存时间戳
Redis在内存中缓存了一个时间戳,并不是用的时候从操作系统中获取当前时间戳,而是执行了一个定时任务,每1ms执行一次,从操作系统获取时间戳更新到Redis缓存中,用的时候直接从缓存中拿。
在redis中执行一条命令大约需要 100ns,所以每1ms是一个相对较大的时间单位。而每一次从操作系统获取时间戳时,上下文切换的时间消耗大约是 10us,所以redis选择了 “间隔一大段时间,才做一次时间戳更新” 。
六、Redis的过期策略
1、过期key的集合
在Redis中,设置了过期时间(ttl)的key,会被放入一个过期key的字典,从这个过期key的字典实现定期删除。
2、定时扫描策略
Redis创建了一个定时任务,每1s执行10次。
每次从过期字典中随机采集20个key,删除其中过期的数据。
如果发现达到 1/4 的key是过期的,就再采集20个key,删除过期数据,循环往复。
是一个贪心算法。
3、惰性删除
为了弥补定时扫描删除可能出现的“漏网之鱼”,当get一个key的时候,发现已经过期了,就不会返回value数据,同时也删除这个key。
4、从库的过期策略
没有定期扫描、惰性删除等功能。只是从主库的AOF文件中读取del命令来删除数据。
5、lazyFree
在删除数据或内存淘汰时,删除String数据基本会很快,但是在删除大的list,set,hash等数据时,有可能会很慢,造成阻塞。
为了缩短阻塞时间,Redis会将大体量的数据删除操作放到后台去做。
① 工作原理
Redis主线程进仅对key做个逻辑删除,标识某个key需要启用异步删除。lazyFree拿到这个key后,启动一个异步线程,对这个key做物理删除。从而避免主线程阻塞。
② 配置参数
| 参数 | 作用 |
|---|---|
| replica-lazy-flush | 集群启动 lazyFree 删除数据 |
| slave-lazy-flush | 从节点启用 lazyFree 删除数据 |
| lazyfree-lazy-user-flush | 用户输入 flush 命令删除 |
| lazyfree-lazy-user-del | 用户输入 del 命令删除 |
| lazyfree-lazy-server-del | 针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。 如rename命令,当目标键已存在,Redis会先删除目标键 |
| lazyfree-lazy-eviction | 内存达到 maxmemory 的时候,触发缓存淘汰 |
| lazyfree-lazy-expire | 针对 key 过期的删除 |
相关文章:
九、Redis 的实际使用与Redis的设计
一、多级缓存架构 在线上系统中,一定不会单纯的只部署一个Redis集群,而是使用Redis结合其他的多级缓存应用进行架构。 使用多级缓存架构的优点就是可以使不同类型的数据分布在不同的应用中,比如redis的热点key可以存储到nginx本地缓存、服务…...
乔拓云模板助力,微信小程序快速上线无需愁备案
想要快速打造并上线自己的微信小程序吗?乔拓云平台是您的不二之选!无需担心复杂的备案流程,乔拓云提供免费服务,远程协助您轻松完成微信小程序的备案工作。 只需简单几步,您的小程序就能闪亮登场:首先&…...
Android命令行查看CPU频率和温度
在 Android 设备上,你可以通过命令行工具 adb 来查看 CPU 温度和 CPU 频率,并确定是否有降频情况。以下是具体步骤: 1. 查看 CPU 频率 你可以使用以下命令来查看 CPU 各个核心的当前频率: adb shell cat /sys/devices/system/c…...
力扣: 翻转字符串里的单词
文章目录 需求分析代码结尾 需求 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意:输入字符…...
Wophp靶场寻找漏洞练习
1.命令执行漏洞 打开网站划到最下,此处的输入框存在任意命令执行漏洞 输入命令whoami 2.SQL注入 搜索框存在SQL注入,类型为整数型 最终结果可以找到管理员账户和密码 3.任意文件上传漏洞 在进入管理员后台后,上传木马文件 访问该文件&…...
国内智能运维厂商月度动态 202408
作为市场人员,虽然也添加了各类行业媒体、同行厂商的关注,但被同事问起业内动向时,常常也是记忆模糊、拍破脑袋也说不完整一件事。 所以找机会翻看了一下各大厂商的公号,先做个简单的8月汇总。 格式暂时是这样的: 整…...
C++ 左值与右值浅谈
左值与右值 序言概念左值和右值的划分理解右值引用常量左值引用与右值引用 移动语义引用折叠完美转发 参考资料 序言 虽然平常都算是了解左值,右值的用法,但是好记性不如烂笔头,记下来供大家评鉴,有错改错,有善赞善&a…...
oracle 如何查死锁
在Oracle中查看死锁通常涉及查询数据字典视图和动态性能视图。以下是一个基本的查询示例,用于检测和显示最近的死锁: SELECT dd.inst_id, dd.name, o.object_id, o.object_type, s.sid, s.serial#, s.username, p.spid, s.program,d.xidusn,d.xidslot,d…...
如何编写ChatGPT提示词
为ChatGPT编写有效的提示需要实施几个关键策略,以使文本到文本生成 AI 工具产生所需的输出。您可以使用 ChatGPT 提示(也称为 ChatGPT 命令)来增强您的工作或提高您在各个行业的表现。例如,营销人员可以提示 ChatGPT 为社交媒体帖…...
java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)
项目简介 智能无人仓库管理实现了以下功能: 基于Spring Boot智能无人仓库管理的主要使用者分为: 管理员的功能有:员工信息的查询管理,可以删除员工信息、修改员工信息、新增员工信息 💕💕作者:…...
大厂前端常见的笔试题目
https://zhuanlan.zhihu.com/p/488383397前端面试手写题目总结-CSDN博客 大厂前端面试中常见的手写代码题目涵盖了多个方面,包括但不限于算法、数据结构、JavaScript 基础知识、DOM 操作、异步编程等。以下是一些常见的手写代码题目及其简要说明: 1. 排…...
网络插件 Cilium 更换 Calico
网络插件 Cilium 更换 Calico 集群使用 submariner ,通过网络检测发现 Cilium 插件可能兼容性不太好 subctl diagnose allCilium 彻底卸载 helm uninstall cilium -n kube-system# 检查集群中的所有 CNI 插件(集群的每个节点都需要删除) s…...
SpringSecurity原理解析(二):认证流程
1、SpringSecurity认证流程包含哪几个子流程? 1)账号验证 2)密码验证 3)记住我—>Cookie记录 4)登录成功—>页面跳转 2、UsernamePasswordAuthenticationFilter 在SpringSecurity中处理认证逻辑是在UsernamePas…...
数据中台 | 数据资源管理平台介绍
01 产品概述 数据资源的盘查、集成、存储、组织、共享等全方位管理能力,无论对于企业的数字化转型,还是对企业数据资产的开发、运营、交易及入表,都具有极为关键的作用。今天,小兵就来为大家介绍我们自研数据智能平台中的核心产品…...
智慧环保平台建设方案
智慧环保平台建设方案摘要 政策导向与建设背景 背景:全国生态环境保护大会提出坚决打好污染防治攻坚战,推动生态文明建设,目标是在2035年实现生态环境质量根本好转。构建生态文明体系,包括生态文化、生态经济、目标责任、生态文明…...
SpringMVC映射请求;SpringMVC返回值类型;SpringMVC参数绑定;
一,SpringMVC映射请求 SpringMVC 使用 RequestMapping 注解为控制器指定可以处理哪些URL请求 1.1RequestMapping修饰类 注解RequestMapping修饰类,提供初步的请求映射信息,相对于WEB应用的跟目录。 注: 如果在类名前࿰…...
【第28章】Spring Cloud之Sentinel注解支持
文章目录 前言一、注解埋点支持二、SentinelResource 注解三、实战1. 准备2. 纯资源定义3. 添加资源配置 四、熔断(fallback)1. 业务代码1.1 Controller1.2 Service1.3 ServiceImpl 2. 熔断配置3. 熔断测试 总结 前言 上一章我们已经完成了对Sentinel的适配工作,这…...
鼎捷新一代PLM 荣膺维科杯 “2023年度行业优秀产品奖”
近日,由中国高科技行业门户OFweek维科网主办的“全数会2024(第五届)中国智能制造数字化转型大会暨维科杯工业自动化及数字化行业年度评选颁奖典礼”在深圳隆重举办。这不仅是中国工业自动化及数字化行业的一大品牌盛会,亦是高科技…...
如何升级用 Helm 安装的极狐GitLab Runner?
本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步:1、确定 Runner 最新版本或者想要升级的版本是否存在;2、用 Helm upgrade 命令进行升级;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版,中文版本对中国用户更…...
08 vue3之认识bem架构及less sass 和scoped
bem架构 他是一种css架构 oocss 实现的一种 (面向对象css) ,BEM实际上是block、element、modifier的缩写,分别为块层、元素层、修饰符层,element UI 也使用的是这种架构 1. BEM架构 1. 介绍 1. BEM是Block Element M…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

