当前位置: 首页 > news >正文

九、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智能无人仓库管理的主要使用者分为: 管理员的功能有:员工信息的查询管理,可以删除员工信息、修改员工信息、新增员工信息 💕💕作者&#xff1a…...

大厂前端常见的笔试题目

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应用的跟目录。 注: 如果在类名前&#xff0…...

【第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…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...