redis瘦身版
线程模型
纯内存操作/非阻塞io多路复用/单线程避免多线程频繁上下文切换
基于Reactor模式开发了网络事件处理器:文件事件处理器,单线程的 io多路监听多个socket,据socket事件类型选择对应的处理器,高性能网络通信模型,可其他单线程对接 简单性
文件事件处理器:多个socket io多路复用 文件事件分派器 事件处理器
io多路复用监听多个socket,将socket放入队列排队,每次从队列中取出socket给事件分派器,给对应事件处理器,处理完,io多路复用将队列下一个socket给事件分派器
reactor

synchronous event demultiplexer:同步事件分离器,监听各种事件,调用方调用监听方法的时候会被阻塞 直到有事件发生
handler:文件描述符,简单理解一个一个事件
event handler:事件处理器,回调方法,事件发生 据handler调用对应的回调方法 自己实现方法
步骤:

高可用:
主从
哨兵:sentinel: 集群监控 消息通知 故障转移 配置中心
redis cluster :livu livechat中使用了
人家有槽slot 16384个呢 请求发送任意节点 该节点会将请求发送到正确节点上-相亲相爱
1.哈希的方式,将数据分片 每个节点均分存储一定哈希槽区间的数据
2.每份数据分片会存储在多个互为主从的多节点上
3.先写主节点再同步从节点
4.读取数据,当客户端操作的key没有分配在该节点,返回转向指令,指向正确节点
5.扩容时需要把旧节点的数据迁移一部分到新节点
6.每个redis放开两个端口,6379 16379,16379节点间通信,cluster bus,故障检测/转移
7.cluster bus用gossip二进制协议,节点间高效数据交换,占用更少的网络带宽和处理时间
优缺点:谁还能没点缺
无中心架构,支持动态扩容,对业务透明
自备sentinel监控和自动failover故障转移能力
高性能,直连redis服务 免去proxy损耗
有点缺:人无完人 redis无完美 怎么说:反正有缺点但是值得
运维复杂 数据迁移需要人工 只能使用0号数据库 不支持批量操作 分布式逻辑和存储模块耦合
redis sharding:你可以不看 让我自己卷
多redis实例集群,采用哈希算法将redis的key进行散列,映射到特定的redis节点
简单,服务端redis实例彼此独立,相互无关联,每个redis实例像单服务器一样 线性扩展
不支持动态删增节点,服务器redis实例群拓扑结构变化,每个客户更新调整 连接不共享
三大热门问题:
还行 咱家项目设计稳稳当当 上学的时候遇到过一次
缓存穿透:缓存 数据库都没有的数据,库短时间内承受大量请求
接口层校验,缓存取不到库中也没有,可key-null 短的过期时间,布隆过滤器bitmap中
缓存击穿:缓存中没有库中有,并发查同一条数据
热点永不过期,互斥锁
缓存雪崩:一瞬间大面积失效
设置随机过期时间/新增缓存标记是否失效/缓存预热/互斥锁
一致性:
写不太频繁:
1,操作缓存 设置过期标识 客户端读缓存过期则休眠再查redis
2,先删缓存,看他不顺眼直接删了!再写数据库,休眠 再删缓存
主从同步
1 从节点slaveof masterip port 保存主节点信息
2 从节点定时任务发现主节点,建立和主节点socket连接
3 从发送信号 主返回 互相私通 呸 互相私信,连接建立 主all数据发送给从
runid:每个redis节点启动生成唯一标识uuid
offset:主从各自维护自己的复制偏移量,主也写offset=offset+命令字节长度,从收到主发送命令后,增加自己的offset,把自己的offset发送给主节点,主节点同时保存自己的offset和从的,对比判断主从一致性数据
原理

repl_backlog_size:主节点上固定长度的先进先出队列1M
复制

全量复制:主节点bgsave命令fork子进程 rdb,消耗cpu 内存 硬盘id,主节点通网络rdb给从,从清空老数据 载入rdb(阻塞)
部分复制:执行复制的双方,分别维护offset,主内部维护固长 fifo复制积压缓存区队列,主offset差距大过缓存区长度,全量复制;服务器runid 主把自己的runid发送给从 从存 从重连时 据runid判断同步进度
runid同之前同步过 主尝试部分复制 ;不同全量复制
事务ACISD
单线程 watch监控key的情况
1,multi命令的执行(事务的开始),multi将客户端状态的flags=redis_multi
2,命令multi/exec/watch/discard会立即执行,否则将命令放入事务队列 客户端返回queue
其他命令 先检查格式 如果说来捣乱 服务器把客户端状态flags关闭redis_multi 返回错误 小黑屋了
队列说FIFO 先进先出讲规矩的队列
3,执行:
不支持回滚;
watch乐观锁为redis提供check-and-set(cas)监控多个键,有一个被修改则后面的事务不执行 监控持续到exec命令
multi开启事务,执行后客户端可持续向服务器发送任意多条命令,放入队列 exec被调 all命令执行
exec 执行事务块内命令,按命令执行先后顺序排列,操作被打断 返回空值null
调用discard客户端可清空事务队列,放弃执行事务
unwatch取消watch对所有key对监控

分布式锁
setnx+setex 设置超时时间失败,死锁
set(key,value,px)原子操作
redisson解决任务超时 锁自动释放 并发问题
数据结构
string
list
hash
set
sortedSet
bitmap
geohash:sortedSet
hyperLogLog
streams
缓存过期策略
定期过期:定时器清理 占大量CPU处理过期数据 缓存响应时间和吞吐量
惰性过期:先判断是否过期,过期删除,节省CPU资源 消耗内存
定期过期:每隔一段时间,扫描一定数量的数据库中expires字典中一定数量的key
淘汰算法
fifo:被存储时间 最远的先淘汰
LRU:最近最少使用,最近被使用的时间
LFU:最不经常使用,一段时间内 缓存被使用次数最少
缓存方案:
客户端缓存:页面 浏览器缓存 app h5 localStorage sessionStorage
CND缓存:内容存储 数据缓存 内容分发 负载均衡
nginx缓存:静态资源
服务端缓存:本地缓存 外部缓存
数据库缓存:持久层缓存 mybatis。hibernate多级缓存 mysql查询
操作系统缓存:page cache。 buffer cache
redis集群策略
主从:主可写读,和从数据同步,主从宕 客户端手动修改ip
哨兵模式:主库宕 哨兵从 从库选主 哨兵也可以集群 高可用 容量上的限制
cluster:多主多从 按key进行槽位分配 不同key分散不同主节点上
持久化
save命令,redis阻塞 直到rdb完成
bgsave,fork子进程 主进程在fork过程中短暂阻塞,子进程创建完主进程响应客户端请求
save m n:m秒内n隔键改变 自动触发持久化 bgsave进行 设置多个满足其一就触发
flushall:清空redis所有数据,flushdb清空当前redis所在库数据(0号库 rdb文件)
主动同步:全量同步自动触发bgsave命令
一个dump.rdb文件,方便持久化 容灾性好 方便备份 性能最大化 fork子进程完成写操作
数据安全性低,rdb间隔一段时间进行持久化,redis故障,数据丢失
aof:亲这边建议优先使用
日志形式记录服务器处理的每一个写 删除操作
aof缓存区据策略向硬盘同步操作,定期对aof文件重写 压缩的目的
每秒同步:异步完成 效率高,一秒数据会被丢失宕机时
每修改同步:同步持久化,每次发生数据变化 立即记录到磁盘 最多丢一条
不同步:操作系统控制 丢失更多数据
数据安全,redis-check-aof工具解决数据一致性问题
aof文件大 恢复慢 ;数据集大 rdb启动效率低,运行效率无rdb高
相关文章:
redis瘦身版
线程模型 纯内存操作/非阻塞io多路复用/单线程避免多线程频繁上下文切换 基于Reactor模式开发了网络事件处理器:文件事件处理器,单线程的 io多路监听多个socket,据socket事件类型选择对应的处理器,高性能网络通信模型,…...
使用ChatGPT高效完成简历制作[中篇]-有爱AI实战教程(五)
演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 导读:在使用 ChatGPT 时,当你给的指令越精确,它的回答会越到位,举例来说,假如你要请它帮忙写文案,如果没…...
论文阅读——SpectralGPT
SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型,该模型专门用于使用新型3D生成预训练Transformer(GPT)处理光谱RS图像。 重建损失由两个部分组成:令牌到令牌和频谱到频谱 下游任务:...
Redis的过期键是如何处理的?过期键的删除策略有哪些?请解释Redis的内存淘汰策略是什么?有哪些可选的淘汰策略?
Redis的过期键是如何处理的?过期键的删除策略有哪些? Redis的过期键处理是一个重要的内存管理机制,它确保在键过期后能够释放相应的内存空间。Redis对过期键的处理主要依赖于其删除策略,这些策略包括被动删除(惰性删除…...
软件测试方法 -- 等价类边界值
测试用例的定义 测试用例是为了特定的目的而设计的一组测试输入、执行条件和预期的结果,以便测试是否满足某个特定需求。通过大量的测试用例来检验软件的运行效果,他是指导测试工作进行的依据。 下面我们介绍几种常用的黑盒测试方法 等价类划分法 定…...
LeetCode——贪心算法(Java)
贪心算法 简介[简单] 455. 分发饼干[中等] 376. 摆动序列[中等] 53. 最大子数组和[中等] 122. 买卖股票的最佳时机 II[中等] 55. 跳跃游戏 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录的刷题路线。会附上一些个人的思路,如果有错误…...
【MySQL】2. 数据库基础
1. 数据库基础(重点) 1.1 什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 文件保存数据有以下几个缺点: 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 数据库存储介…...
《如何使用C语言去下三子棋?》
目录 一、环境配置 二、功能模块 1.打印菜单 2.初始化并打印棋盘 3、行棋 3.1玩家行棋 3.2电脑行棋 4、判断是否和棋 5.判赢 三、代码实现 1、test.c文件 2、game.c文件 3、game.h文件 一、环境配置 本游戏用到三个文件,分别是两个源文件test.c game.c 和…...
Linux——线程(4)
在上一篇博客中,我讲述了在多执行流并发访问共享资源的情况下,如何 使用互斥的方式来保证线程的安全性,并且介绍了Linux中的互斥使用的是 互斥锁来实现互斥功能,以及它的原理,在文章的结尾我提出了一个问题 用来引出同…...
vite+vue3项目中svg图标组件封装
一、安装插件 npm i vite-plugin-svg-icons -D 二、插件配置 // vite.config.jsimport { createSvgIconsPlugin } from "vite-plugin-svg-icons"; import path from "path";export default defineConfig({plugins: [// svg图标配置项createSvgIconsPlug…...
根据服务器系统选择对应的MySQL版本
1. 根据服务器系统选择对应的MySQL版本 MySQL有多个版本,选择对应的版本,重点信息是Linux的GLIBC版本号,Linux的版本、系统位数。 1.1 查看Linux的GLIBC版本号 通常libc.so会支持多个版本,即向前兼容,查看该文件中…...
【数据结构】栈与队列的“双向奔赴”
目录 前言 1.使用“栈”检查符号是否成对出现 2.使用“栈”实现字符串反转 3.使用“队列”实现“栈” 4.使用“栈”实现“队列” 前言 什么是栈? 栈(stack)是一种特殊的线性数据集合,只允许在栈顶按照后进先出LIFOÿ…...
sqllab第二十七关通关笔记
知识点: union select 关键字过滤 通过<> /**/进行截断处理 un<>ion sel<>ect 没效果uni/**/on sel/**/ect 被过滤了双写绕过 这关对select进行了多重过滤,无法进行双写绕过 大小写绕过 UNion SElect (这关可以用&am…...
助推直播产业升级与经济转型 天府锋巢直播产业基地成都开园
2023年年末,位于成都天府新区兴隆湖板块的天府锋巢直播产业基地正式开园,为成都直播产业注入了新的活力,助推成都经济转型和产业升级。天府锋巢直播产业基地的成立,不仅是成都直播产业的一大盛事,更是对成都经济发展的…...
VSCode+python单步调试库代码
VSCodepython单步调试库代码 随着VSCode版本迭代更新,在最新的1.87.x中,使用Python Debugger扩展进行调试时,扩展的justMyCode默认属性为true,不会进入库中的代码。这对debug而言不太方便,因此需要手动设置一下&#…...
如何使用EMC测试软件执行辐射抗扰度测试?(三)软件检查及手动模式
一、前言 之前的文章为大家介绍了使用EMC测试软件执行辐射抗扰度测试的测试方法、频率变化模式测试方法、校准方法及调制。本期文章继续为大家介绍软件检查和手动模式两部分内容。 前文回顾: 如何使用EMC测试软件执行辐射抗扰度测试?(一&am…...
云手机为电商提供五大出海优势
出海电商行业中,各大电商平台的账号安全是每一个电商运营者的重中之重,账号安全是第一生产力,也是店铺运营的基础。因此多平台多账号的防关联管理工具成了所有电商大卖家的必备工具。云手机最核心的优势就是账户安全体系,本文将对…...
chatgpt大模型基础学习
chatgpt大模型基础学习 1. 吴恩达提示工程2. 大模型说的token是什么 1. 吴恩达提示工程 知乎 https://zhuanlan.zhihu.com/p/626290417?utm_id0 中文版 https://mp.weixin.qq.com/s?__bizMzkwMjQ5MzExMg&mid2247483714&idx1&sn5e905f5ec6196f6dc2187db2a8618f02&…...
代码随想录算法训练营第14天 part01 | 二叉树理论基础篇
代码随想录 二叉树理论基础篇 二叉树的种类 二叉树有两种主要的形式:满二叉树和完全二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 这棵二叉树为满二叉树…...
async与defer的区别
原文解释 async vs defer attributes - Growing with the Web...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
