高并发架构基石【三】——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持久化格式

 

posted @ 2020-03-15 12:02  习惯沉淀  阅读(207)  评论(0编辑  收藏  举报