摘要:
Sentinel(哨兵、哨岗)是Redis的高可用(high availability)解决方案:由一个或多个Sentinel实例组成Sentinel系统可以监视任意多个主服务器以及它们属下的所有从服务器,并在监视主服务器进行下线时,将主服务器下属的从服务器升级为新的主服务器,然后由新的主服务器代替 阅读全文
摘要:
Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。 ##同步 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 ###1. 旧版本的执行步骤 从服务器向主服务器发送SYNC命令 主服务器执行BGSAVE命令,生成RDB文件,并使用 阅读全文
摘要:
Redis服务器是一个事件驱动程序,服务器需要处理两类事件:文件事件(file event)和时间事件(time event) ##Redis事件处理流程 aeMain函数通过调用aeProcessEvents函数来进行文件事件和时间事件的调度和执行。aeEventLoop中记录了事件相关的信息。首 阅读全文
摘要:
Redis官方提供了两种数据持久化的方式,分别是:RDB和AOF。今天我们来讨论一下这两种持久化方式的区别。 ##RDB 基本原理:RDB持久化主要是通过SAVE和BGSAVE两个命令对Redis数据库中当前的数据做snapshot并生成rdb文件来实现的。其中SAVE是阻塞的,BGSAVE是非阻塞 阅读全文
摘要:
Redis一共支持5种数据结构,hash是其中的一种,在hash扩容的时候采用的是渐进式rehash的方式。要想深入理解渐进式rehash,首先要了解以下Redis中hash的数据结构。 #####哈希表节点 typedef struct dictEntry { void *key; // 键 un 阅读全文
摘要:
##Key的过期策略 Redis的Key有3种过期删除策略,具体如下: ###1. 定时删除 原理:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作 优点:能够很及时的删除过期的Key,能够最大限度的节约内存 缺点:对CPU时间不友好,如果 阅读全文
摘要:
Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type、encoding和ptr: typedef struct redisObject { unsigned type:4; // 类型 unsigned encoding:4;// 编码 uns 阅读全文
摘要:
###无锁 无锁是指线程通过无限循环来执行更新操作,如果执行成功就退出循环,如果执行失败(有其他线程更新了值),则继续执行,直到成功为止。CAS操作就属于无锁。如果从性能的角度来看,无锁状态的性能是非常高的。 ###自旋锁 自旋锁是一种通过让线程不释放当前的CPU执行一个忙循环,来尝试获取锁的方式。 阅读全文
摘要:
最近阅读了《Java并发编程实践》这本书,总结了一下几个相关的知识点。 线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。可以通过原子性、一致性、不可变对象、 阅读全文