(十)redis源码解读
一、redis工作机制
redis是 单线程,所有命令(set,get等)都会加入到队列中,然后一个个执行。
二、为什么redis速度快?
1、基于内存
2、redis协议resp 简单、可读、效率高
三、什么是resp
redis是一个ServerSocket服务器,而Jedis是一个Socket客户端类似redis-cli,用于与redis通讯,而redis和jedis之间通讯用的就是resp,如下图,如果jedis要设置一个值,命令是:set name shyroke,转为resp协议为:
*3 $3 set $4 name $7 shyroke
而如果jedis想要获取一个值,发送指令:get name,转为resp为:
*2 $3 get $4 name
四、redis分表分库
如果数据量太大,一个redis存不下,那么此时就需要分表分库。
最简单的做法编写一个代理服务器,不管是数据库还是客户的缓存都通过代理,然后key进行路由,具体做法是对key长度进行取模,所得的结果就是相应的redis服务器。
案例:
(1)启动3个redis服务器,只要复制3份redis的配置文件(redis.window.conf),修改其中的端口号,然后分别脚本启动启动:redis-serve.exe 配置1.conf redis-serve.exe 配置2.conf redis-serve.exe 配置3.conf
(2)客户端请求代理服务器,代理服务器解析resp协议,并使用代理算法(key长度取模)计算相应的redis服务器,然后进行操作。代理算法:此时有3台服务器,此时执行:set name shyroke ,key的值为name,那么对key长度取模 = 4%3 = 1 ,所以此时会执行第二台redis服务器,也就是会往第二台代理服务器中存数据。
(3)测试如下图,19000是代理服务器的端口,此时jedis连接代理服务器,然后存一个值a=enjoy_a,a的长度是1,此时服务器有3台,所以1%3=1,所以此时会向第二台服务器也就是127.0.0.1:6380这台服务器存一个值。
五、redis之读写分离
如果有读多写少或者读少写多的场景,尤其是电商项目,读多写少,此时可以进行读写分离,也就是说可以用一台服务器用于写操作,多台服务器进行读操作。
案例
以三台服务器为例如下图,关键是数据同步,也就是说写的那台数据库的数据如何同步到其他用于读的数据库里。
1、修改两台读的redis服务器的配置文件,如下图,需要注意的是,加了下图的配置后就不能进行写(set)操作,只能往主节点(即写服务器)中写,只能进行读操作(get)
2、主节点(本例中为写服务器)挂了怎么办?
使用哨兵机制。即设置定时器,定时去ping主节点,如果pign不通则说明主节点(写服务器)挂了,此时就需要从子节点(读服务器)中选一个作为主节点,然后其他子节点作为新主节点的子节点。主节点中执行redis命令:info application 中可以获取主节点中所有子节点。
1、检查主节点状态
2、切换主节点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架