Redis-源码解析:scan源码实现

​ 由于历史原因,有个项目遗留了个上百G的Redis,通过使用scan最获取后一次访问时间,如果最后一次访问时间超3个月则删除,这样清理和上百G的Redis存储,来看下scan是如何实现的。 ​ keys命令会一次性返回所有的key,如果db中key很多,很阻塞业务请求,生产环境是禁止使用的; scan 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 scan 命令的游标参数, 以此来延续之前的迭代过程; /*...

Redis-源码解析:数据库redisDb实现

服务器中的数据库 Redis 服务器将绝大部分的信息都保存在 server.h/redisServer。redis 的数据是保存在 redisServer 中的 redisDb 结构中。 struct redisServer {...

Redis-集群槽位重分片Key迁移实现

​ ​ Redis提供了辅助脚本redis-trib.rb,以”reshard”参数调用该脚本就可以实现重新分片的操作。但是本质上,该脚本就是通过向迁入节点和迁出节点发送一些命令实现的。 ​ 假设要从A节点迁移slot槽位到B节点 设置迁入节点 ​ 向迁入节点B发送” CLUSTER SETSLOT IMPORTING ”命令,其中是要迁入的槽位号,是当前负责该槽位的节点。在函数clusterCommand中,处理该命令的代码如下。...

Redis-集群故障检测与选新主实现

​ Redis Cluster集群中是如何进行故障检测的,故障检测到后如何进行新主选举的,选举完之后又发生了什么? ​ 如下,ClusterState、ClusterNode中的currentEpoch、configEpoch、fail_reports都是很重的属性,和故障检测与故障后选主有关。 #cluster.h /* This structure represent elements of...

Linux-fork()/vfork()/clone()

​ Redis中通过fork子进程来进行RDB备份,为什么使用fork()呢. ​ Linux中除了fork函数,其实还有vfork()以及clone(),出于好奇心,往深处了解下. Fork() ​ 如下图所示,调用fork()的进程会创建一个子进程,返回的pid是0即为子进程(子进程进程ID不是0),子进程与父进程并发执行,子进程与父进程共享地址空间,内存空间——即子进程能访问到父进程的数据,最初的fork()实现,fork()后子进程会完全拷贝父进程的内存数据,由于很多数据不做修改导致拷贝浪费很多系统资源,后面fork()的实现底层是Copy on write,即子进程修改或者父进程修改数据后,底层操作系统会将数据拷贝一份,让子进程与父进程互不影响. Vfork() ​ vfork()是由于最初fork()底层未实现Copy...