Redis使用与设计原理
文章平均质量分 79
Redis使用与设计原理
拾牙慧者
会点c++、python;
展开
-
缓存一致性解决方法
对于缓存 + 数据库读写,有个经典的Cache Aside Pattern:读取:先读取缓存,缓存里没有,读取数据库,然后返回响应,顺便保存缓存:更新:先更新数据库,然后删除缓存为什么是删除缓存而不是更新缓存?并发情况下更新缓存可能会带来更多问题,直接删除缓存更加稳妥缓存更新消耗更多资源,直接删除,用时再从数据库读取,写进缓存,更省性能一致性问题假设更新数据库成功,接下来还没来得及删除缓存,或者删除缓存失败,此时其他线程进来读的就是脏数据。既然删除缓存失败会导致脏数据,那么就得想办法能让它原创 2021-10-08 22:15:10 · 965 阅读 · 1 评论 -
Redis 缓存击穿、缓存穿透、缓存雪崩的处理方法
常用的分布式缓存Redis单机并发量能达到万级,常用的关系型数据库MySQL一般并发量是千级,他们支持的并发量可能差十倍,所以要尽可能把流量拦截在缓存层。缓存击穿一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。这就叫缓存击穿,这会增大数据库的负载。如何解决缓存击穿?1、加锁更新:查询缓存,发现缓存中不存在,加锁,让其他线程等待,只让一个线程去更新缓存2、异步更新:把缓存设置成永不过期,后台设置一个守护线程定时更新缓存,但这种定时比较难以把控。此机制更适合用于缓存预热缓原创 2021-10-08 16:51:05 · 1220 阅读 · 5 评论 -
Redis一个命令请求从发送到完成的步骤以及初始化服务器步骤
一个命令请求从发送到完成的步骤如下:1、客户端将命令请求发送给服务器当用户在客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。2、服务器读取命令请求,并分析出命令参数读取套接字中协议格式的命令请求,将其保存到客户端状态的输入缓冲区中对输入缓冲区中的命令请求进行解析,提取出命令参数以及命令参数的个数,保存到客户端状态的argv属性与argc属性调用命令执行器,执行指定指令3、命令执行器根据参数查找命令的实现原创 2021-09-06 18:56:38 · 403 阅读 · 0 评论 -
Redis的文件事件与时间事件处理
目录文件事件处理事件类型客户端和服务端的通信过程时间事件处理执行器执行周期性事件作用事件的调度与执行文件事件处理Redis基于Reactor模式开发了文件事件处理器。文件事件处理器以单线程方式运行,通过IO多路复用程序监听多个套接字,实现了高性能网络通信模型,又可以很好的与Redis服务器中同样以单线程运行的模块进行对接,保证了设计的简单性。文件事件处理器的构成:套接字、I/O多路复用程序、文件事件分派器、事件处理器每当一个套接字准备好执行连接应答、写入、读取、关闭操作时就会产生一个文件事件。一.原创 2021-09-06 12:58:20 · 401 阅读 · 0 评论 -
Redis的RDB文件与AOF文件
本笔记参考《Redis设计与实现》 P118 ~ P150RDB文件1、RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据2、SAVE命令由服务器进程直接执行保存操作,该命令会阻塞服务器3、BGSAVE命令由子进程执行保存操作,不会阻塞服务器注意此时服务器的状态:在处理BGSAVE命令时,服务器处理SAVE、BGSAVE、BGREWRITEAOF三个命令方式与平时不同。客户端发送的SAVE命令会被服务器拒绝,服务器禁止SAVE命令与BGSAVE同时执行,是为了避免父进程与子进原创 2021-09-05 18:22:16 · 489 阅读 · 0 评论 -
Redis对象的refcount与lru属性(内存回收、对象共享、空转时长)
本笔记参考《Redis设计与实现》 P84~P88内存回收Redis在对象系统中使用reference counting技术实现了内存回收机制。程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。typedef struct redisObject { // ... // 引用计数 int refcount; // ...} robj;refcount会随着对象的使用状态而不断变化:创建一个新对象时,refcount被初始化为1当对象被一个新程序使用时,re原创 2021-09-03 13:25:29 · 905 阅读 · 0 评论 -
Redis字典实现、Hash键冲突以及渐进式rehash
本笔记参考《Redis设计与实现》 P24~ 37目录Redis字典实现哈希表节点结构哈希表结构字典哈希算法解决hash冲突rehash渐进式hashRedis字典实现哈希表节点结构typedef struct dictEntry{ // 键 void *key; // 值 : 可以是一个指针,或者是一个uint64/int64 的整数 union { void *val; uint64_t u64; int64_t s64 } v; // 指向下一个哈希表节点,形原创 2021-09-01 22:26:15 · 568 阅读 · 0 评论