Redis是一个开源的内存数据存储系统,具有高性能、分布式、持久化等主要特点。主要使用场景是数据库、缓存和消息中间件,支持多种数据结构,比如字符串、列表、集合、有序集合、hash表等。
字符串(String)实现原理:最基本的数据类型,可以存储数字、文本或二进制数据。底层实现是SDS,简称简单动态字符串,Redis自己实现的一种字符串,与原生的C语言字符串相比,具有更多的功能和优势,结构如下:
struct { char buf; //字符串指针 int len; //长度 int free; //剩余长度}
SDS最大的优势是支持动态的增长或缩小。
有序集合(ZSet)实现原理:实现方式有ziplist和skiplist两种,使用ziplist实现需要满足两个条件:
a、有序集合保存的元素数量小于128个。
b、有序集合保存的所有元素的长度小于64字节。
否则就采用skiplist实现,也就是我们俗称的跳跃表。跳跃表其实也是链表的一种,只是在双向链表的基础上增加了多层索引的概念,也就是跳跃功能,无非是空间换时间,至于层高,那就随机实现了。
纯内存操作、kv的存储结构、单线程避免加锁、多路复用、RESP协议
持久化有三种方式:AOF日志、RDB快照、混合持久化。
AOF日志:Append Only File,每次执行一个写命令后,Redis都会采用追加的方式将写命令记录到一个文件中,属于写后日志。这样不会有额外的检查开销、同样也不会阻塞当前的写操作,符合高性能的需要。
RDB快照:Redis Database,即内存快照,记录的是某个瞬间Redis实际存储的数据,一般是定时更新,有丢失的风险,但是恢复的效率较高。
混合持久化:Redis 4.0 开始支持混合使用 AOF 日志和内存快照,也叫混合持久化。简单来说就是,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。
当开启了混合持久化时,在 AOF 重写日志时,重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。
也就是说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。这样的好处在于,重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。