高并发架构基石【三】——Redis
特点
单线程
原因一:因为采用了非阻塞的异步事件处理机制。
原因二:缓存数据都是内存操作IO时间不会太长,可以避免线程上下文切换的代价。
异步IO
多数据结构
支持持久化
不仅可以做缓存,还可以做NoSQL数据库。
主从模式
提供主从同步机制,以及cluster集群部署能力,能提供高可用服务。
数据结构
string
string 类型是 Redis 中最常使用的类型,内部的实现是通过 SDS(Simple Dynamic String )来存储的。SDS 类似于 Java 中的 ArrayList,可以通过预分配冗余空间的方式来减少内存的频繁分配。
hash
hash 类型在 Redis 中有 ziplist 和 hashtable 两种实现。当 Hash 表中所有的 key 和 value 字符串长度都小于 64 字节且键值对数量小于 512 个时,使用压缩表来节省空间;超过时,转为使用 hashtable。
set
set 类型的内部实现可以是 intset 或者 hashtable,当集合中元素小于 512 且所有的数据都是数值类型时,才会使用 intset,否则会使用 hashtable。
list
list 类型,有 ziplist 压缩列表和 linkedlist 双链表实现。ziplist 是存储在一段连续的内存上,存储效率高,但是它不利于修改操作,适用于数据较少的情况;linkedlist 在插入节点上复杂度很低,但它的内存开销很大,每个节点的地址不连续,容易产生内存碎片。此外在 3.2 版本后增加了 quicklist,结合了两者的优点,quicklist 本身是一个双向无环链表,它的每一个节点都是一个 ziplist。
zset
sorted set 是有序集合,有序集合的实现可以是 ziplist 或者是 skiplist 跳表。有序集合的编码转换条件与 hash 和 list 有些不同,当有序集合中元素数量小于 128 个并且所有元素长度都小于 64 字节时会使用 ziplist,否则会转换成 skiplist。
提示
Redis 的内存分配是使用 jemalloc 进行分配。jemalloc 将内存空间划分为小、大、巨大三个范围,并在范围中划分了小的内存块,当存储数据时,选择大小最合适的内存块进行分配,有利于减小内存碎片。
功能
bitmap
位图是支持按bit位来存储信息,可用来实现BloomFilter。
hyperLogLog
提供不精确的去重计数功能,适合用于做大规模数据去重统计,例如统计UV。
geospatial
可用于保存地理位置,并作位置距离计算或半径计算位置等。
pub/sub
订阅发布功能,可以做简单的消息队列。
pipeline
可以批量执行一组指令,一次性返回全部结果,可以减少频繁的请求应答。
lua脚本
Redis支持提交lua脚本来执行一系列的功能。
事务
Redis提供的不是严格的事务,只保证串行执行命令,并且能保证全部执行,但执行失败并不会回滚,而是继续执行下去。
数据持久化
RDB
是把内存中的数据集以快照形式写入磁盘,实际操作是通过fork子进程执行,采用二进制压缩存储。
优点:把整个Redis的数据保存在单一文件中,比较适合做灾备。
缺点:缺点是快照保存完成之前如果宕机,这段时间的数据将会丢失,另外保存快照时可能导致服务短时间不可用。
AOF
是以文本日志的形式记录Redis处理的每一个写入或删除操作。
优点:对日志文件的写入操作使用的追加模式,有灵活的同步策略,支持每秒同步、每次修改同步和不同步。
缺点:相同规模的数据集,AOF要大于RDB,AOF在运行效率上往往低于RDB。
Redis Cluster
Redis Cluster 使用分片机制,在内部分为 16384 个 slot 插槽,分布在所有 master 节点上,每个 master 节点负责一部分 slot。数据操作时按 key 做 CRC16 来计算在哪个 slot,由哪个 master 进行处理。数据的冗余是通过 slave 节点来保障。
Sentinel
slave的priority设置的越低,优先级越高。
主从同步
master选举策略
同等情况下,slave的复制数据越多,优先级越高。
相同条件下,runid越小,越容易被选中。
key失效机制
Redis 的 key 可以设置过期时间,过期后 Redis 采用主动和被动结合的失效机制,一个是和 MC 一样在访问时触发被动删除,另一种是定期的主动删除。
主动删除
被动删除
淘汰策略(6种)
只针对设置了失效期的 key 做 LRU、最小生存时间和随机剔除。
voltile-lru
voltile-ttl
voltile-random
针对所有 key 做 LRU、随机剔除。
allkeys-lru
allkeys-random
设置不剔除,容量满时再存储对象会返回异常,但是已存在的 key 还可以继续读取
no-eviction
4.0、5.0新特性
Module
4.0 的模块机制等。
Stream
5.0 的 Stream,是一个可以支持多播,也就是一写多读的消息队列。
PSYNC2.0
混合RDB-AOF持久化格式
作者:习惯沉淀
如果文中有误或对本文有不同的见解,欢迎在评论区留言。
如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!