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...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
