摘要: 同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。 ##1. 同步和异步 同步和异步描述的是消息通信的机制。 ###同步 当一个request发送出去以后,会得到一个response,这整个过程就是一个同步调用的过程。哪怕response为空,或 阅读全文
posted @ 2020-07-12 16:29 PinXiong 阅读(2607) 评论(0) 推荐(0) 编辑
摘要: Redis的发布和订阅功能分为频道订阅和模式订阅两种。每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息。 ##频道订阅 当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系。 #####订阅 每当客户端执行SUBSCR 阅读全文
posted @ 2020-07-12 13:47 PinXiong 阅读(300) 评论(0) 推荐(0) 编辑
摘要: Redis通过MULTI、EXEC、WATCH、DISCARD等命令来实现事务功能。主要有以下三个阶段: ##事务开始 MULTI命令的执行,标识着一个事务的开始。MULTI命令会将客户端状态的flags属性中打开REDIS_MULTI标识来完成的。 ##命令入队 当一个客户端切换到事务状态之后,服 阅读全文
posted @ 2020-07-12 13:42 PinXiong 阅读(2023) 评论(0) 推荐(0) 编辑
摘要: 常见的IO事件处理模型有两种:Reactor和Proactor。Redis中的ae就是采用的Reactor事件处理模型,Proactor需要操作系统的支持,目前暂时还没接触到相关的使用场景,主要是学习模型结构。 ###Reactor模型 Handler:用来标识一个文件描述符 Synchronous 阅读全文
posted @ 2020-07-12 13:40 PinXiong 阅读(1456) 评论(0) 推荐(0) 编辑
摘要: 在深入理解select、poll和epoll之间的区别之前,首先要了解什么是IO多路复用模型。 ###IO多路复用 简单来说,IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程去进行IO操作。 详细的描述可以参考IO模型。select、poll和epoll都是提供I/ 阅读全文
posted @ 2020-07-12 13:38 PinXiong 阅读(1197) 评论(0) 推荐(0) 编辑
摘要: ##什么是IO 在Linux世界里,一切皆文件。文件就是一串二进制流,不管是socket、FIFO、管道还是终端,对我们来说一切都是文件,一切都是流。在信息交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(Input and Output)。 计算机里的所有流都是通过文件描述符(F 阅读全文
posted @ 2020-07-12 13:37 PinXiong 阅读(317) 评论(0) 推荐(0) 编辑
摘要: Redis集群是Redis提供的分布式数据库方案,集群通过分片(Sharding)来进行数据共享,并提供复制和故障转移功能。 ##节点 一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器在启动的时候会根据cluster-enabled配置项来决定是否开启服务器的集群模式。 节点当前 阅读全文
posted @ 2020-07-12 13:28 PinXiong 阅读(429) 评论(0) 推荐(0) 编辑
摘要: Sentinel(哨兵、哨岗)是Redis的高可用(high availability)解决方案:由一个或多个Sentinel实例组成Sentinel系统可以监视任意多个主服务器以及它们属下的所有从服务器,并在监视主服务器进行下线时,将主服务器下属的从服务器升级为新的主服务器,然后由新的主服务器代替 阅读全文
posted @ 2020-07-12 13:26 PinXiong 阅读(510) 评论(0) 推荐(0) 编辑
摘要: Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。 ##同步 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 ###1. 旧版本的执行步骤 从服务器向主服务器发送SYNC命令 主服务器执行BGSAVE命令,生成RDB文件,并使用 阅读全文
posted @ 2020-07-12 13:24 PinXiong 阅读(451) 评论(0) 推荐(0) 编辑
摘要: Redis服务器是一个事件驱动程序,服务器需要处理两类事件:文件事件(file event)和时间事件(time event) ##Redis事件处理流程 aeMain函数通过调用aeProcessEvents函数来进行文件事件和时间事件的调度和执行。aeEventLoop中记录了事件相关的信息。首 阅读全文
posted @ 2020-07-12 13:22 PinXiong 阅读(812) 评论(0) 推荐(0) 编辑
摘要: Redis官方提供了两种数据持久化的方式,分别是:RDB和AOF。今天我们来讨论一下这两种持久化方式的区别。 ##RDB 基本原理:RDB持久化主要是通过SAVE和BGSAVE两个命令对Redis数据库中当前的数据做snapshot并生成rdb文件来实现的。其中SAVE是阻塞的,BGSAVE是非阻塞 阅读全文
posted @ 2020-07-12 13:20 PinXiong 阅读(914) 评论(2) 推荐(0) 编辑
摘要: Redis一共支持5种数据结构,hash是其中的一种,在hash扩容的时候采用的是渐进式rehash的方式。要想深入理解渐进式rehash,首先要了解以下Redis中hash的数据结构。 #####哈希表节点 typedef struct dictEntry { void *key; // 键 un 阅读全文
posted @ 2020-07-12 13:19 PinXiong 阅读(1074) 评论(0) 推荐(0) 编辑
摘要: ##Key的过期策略 Redis的Key有3种过期删除策略,具体如下: ###1. 定时删除 原理:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作 优点:能够很及时的删除过期的Key,能够最大限度的节约内存 缺点:对CPU时间不友好,如果 阅读全文
posted @ 2020-07-12 13:18 PinXiong 阅读(4066) 评论(0) 推荐(0) 编辑
摘要: Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type、encoding和ptr: typedef struct redisObject { unsigned type:4; // 类型 unsigned encoding:4;// 编码 uns 阅读全文
posted @ 2020-07-12 13:16 PinXiong 阅读(208) 评论(0) 推荐(0) 编辑
摘要: ###无锁 无锁是指线程通过无限循环来执行更新操作,如果执行成功就退出循环,如果执行失败(有其他线程更新了值),则继续执行,直到成功为止。CAS操作就属于无锁。如果从性能的角度来看,无锁状态的性能是非常高的。 ###自旋锁 自旋锁是一种通过让线程不释放当前的CPU执行一个忙循环,来尝试获取锁的方式。 阅读全文
posted @ 2020-07-12 13:11 PinXiong 阅读(1973) 评论(0) 推荐(1) 编辑
摘要: 最近阅读了《Java并发编程实践》这本书,总结了一下几个相关的知识点。 线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。可以通过原子性、一致性、不可变对象、 阅读全文
posted @ 2020-07-12 12:26 PinXiong 阅读(621) 评论(2) 推荐(2) 编辑