ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis 必知概念 [打印本页]

作者: 立山    时间: 2024-10-13 14:41
标题: Redis 必知概念
Redis 为什么快

数据结构

数据类型

stringlisthashsetzset概念1、可以存储任意类型的数据,好比文本、数字、图片大概序列化对象
2、一个 string 类型的键最大可以存储 512 MB 的数据1、一个有序的字符串列表,ta 按照插入顺序排序,而且支持在两端插入或删除元素
2、一个 list 类型的键最多可以存储 2^32-1 个元素1、一个键值对集合,ta 可以存储多个字段和值,雷同于java 的 map 对象
2、一个 hash 类型的键最多可以存储 2^32-1 个字段1、set 是一个无序的字符串集合,ta 不允许元素重复
2、一个 set 类型的键最多可以存储 2^32-1 个元素1、redis 中的 zset 是一种有序集合类型,ta 可以存储不重复的字符串元素,而且给每个元素赋予一个排序权重值(score);redis 通过权重值来为集合中的元素进行从小到大的排序
2、zset 的成员是唯一的,但权重值可以重复
3、一个 zset 类型的键最多可以存储 2^32-1 个元素底层实现string 类型的底层实现是 SDS, ta 是一个动态字符串结构,由长度、空闲空间和字节数据组三部分组成
SDS 有 3 中编码类型:
1、embstr:占用64 Bytes 的空间,存储 44 Bytes 的数据
2、raw:存储大于 44 Bytes 的数据
3、int:存储整数类型
embstr 和 raw 存储字符串数据,int 存储整型数据redis3.2 以后,list 类型的底层实现只有一种结构:quicklist

分析:
1、在 Redis 3.2之前,list 使用的是 linkedlist 和 ziplist;在 Redis3.2-Redis7.0之间,list 使用的是 quickList,是 linkedlist 和 ziplist 的联合;在 Redis7.0 之后,list 使用的也是 quickList ,只不过将 ziplist 转换为 listpack ,ta 是 listpack、linkedlist 联合版
2、ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries  配置,同时列表中每个元素的值都小于 list-max-ziplist-value  配置时使用
3、linkedlist(链表):当列表类型无法满足 ziplist  的条件时,Redis 会使用 linkedlist  作为列表的内部实现hash  类型的底层实现有三种:
1、ziplist :压缩列表,当 hash 到达一定的阈值时,会自动转换为 hashtable  结构
2、listpack :紧凑列表,在 redis7.0 之后,listpack  正式取代 ziplist;同样的,当 hash  到达一定的阈值时,会自动转换为  hashtable 结构
3、hashtable :哈希表,雷同 map

分析:
1、ziplist (压缩表):当哈希类型元素小于 hash-maxx-ziplist-entries 配置,同时所有值都小于 hash-max-ziplist-value 配置时使用;
ziplist  使用更加紧凑的结构实现多个元素的一连存储,在节省内存方面比 hashtable  更有上风
2、hashtable (哈希表):当哈希类型无法满足 ziplist  的条件时,Redis 会使用 hashtable 作为哈希的内部实现;原因是 ziplist  的读写服从下降,而 hashtable 的读写的复杂度为 O(1)set 类型的底层实现有两种:
1、intset,整数集合
2、hashtable 哈希表;哈希表和 hash 类型的哈希表雷同,ta 将元素存储在一个数组中,并通过哈希函数盘算元素在数组中的索引

分析:
1、在 Redis7.2 之前,set 使用的是 intset 和 hashtable;在 Redis7.2 之后,set 使用的是 intset、listpack、hashtable
2、intset(整数集合):当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置时使用
3、hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 使用 hashtable 作为集合的内部实现1、ziplist(redis7.0前)和 listpack(redis7.0后)
2、skiplist

分析:
1、当有序集合的元素个数小于 zset-max-ziplist-entries(默以为 128 个),而且每个元素成员的长度小于 zset-max-ziplist-value(默以为 64 字节)时,使用压缩列表作为有序集合的内部实现;
每个集合元素由两个紧挨在一起的两个压缩列表节点组成,其中第一个节点保存元素成员,第二个节点保存元素的分支;
压缩列表中的元素按照分数从小到大一次紧挨着排列,有效淘汰了内存空间的使用
2、当有序集合的元素大于等于 zset-max-ziplist-entries(默以为 128 个),大概每个元素成员的长度大于等于 zset-max-ziplist-value(默以为 64 字节)时,使用跳跃表作为有序集合的内部实现;
在跳跃表中,所有元素按照从小到大的顺序排序;
跳跃表的节点中的 object 指针指向元素成员的字符串对象,score 保存元素的分数;
通过跳跃表,Redis 可以快速d e 对有序集合进行分数范围、排名等操纵

3、当哈希表中,为有序集合创建了一个从元素成员到元素分数的映射:键值对中的键指向元素成员的字符串对象,键值对中的值保存了元素的分数,通过哈希表,Redis 可以快速查找指定元素的分数;
固然有序集合同时使用跳跃表和哈希表,但是着两种数据结构都是用指针共享元素的成员和分数,不会额外的内存浪费应用场景1、缓存数据,进步访问速率和降低数据库压力
2、计数器,利用 incr 和 decr 下令实现原子性的加减操纵
3、分布式锁,利用 setnx 下令实现互斥访问
4、限流,利用 expire 下令实现时间窗口内的访问控制1、消息队列,利用 lpush 和 rpop 下令实现生产者消耗者模式
2、最新消息,利用 lpush 和 ltrim 下令实现固定长度的时间线
3、历史记录,利用 lpush 和 lrange 下令实现浏览记录大概搜索记录hash 类型的应用场景主要是存储对象,好比:
1、用户信息,利用 hset 和 hget 下令实现对象属性的增删改查
2、购物车,利用 hincrby 下令实现商品数量的增减
3、配置信息,利用 hmset 和 hmget 下令实现批量设置和获取配置项1、去重,利用 sadd 和 scard 下令实现元素的添加和计数
2、交集,并集,差集,利用 sinter,sunion 和 sdiff 下令实现集合间的运算
3、随机抽取,利用 srandmember 下令实现随机抽奖大概抽样1、排行榜,利用 zadd 和 zrange 下令实现分数的更新和排名的查询
2、延时队列,利用 zadd 和 zpopmin 下令实现任务的添加和实验,而且可以定期 de 获取已经到期的任务
3、访问统计,可以使用 zset 来存储网站大概文章的访问次数,而且可以按照访问量进行排序和筛选

为什么参加 listpack?

在 redis7.2 之前,sds 类型的数据会直接放入到编码结构为 hashtable 的set 中
在 redis7.2 之后,sds 类型的数据,首先会使用 listpack 结构,当 set 到达一定的阈值时,才会自动转换为 hashtable。添加 listpack 结构是为了进步内存利用率和操纵服从,由于 hashtable 的空间开销和碰撞概率都比较高
内存机制

内存接纳策略

Redis 的内存接纳机制主要体现为以下两方面:
删除逾期对象:Redis 所有的键都可以设置逾期属性,内部保存在逾期字典中
内存溢出策略

当 Redis 所有内存到达 Maxmemory 上限时会触发相应的溢出策略:
namedescribenoeviction默认策略,不会删除任何数据,拒绝所有写入操纵并返回客户端错误信息,此时 Redis 只响应读操纵volatile-lru根据 LRU 算法,删除设置了超时属性的键
假如没有可删除的键对象,回退到 noeviction 策略allkeys-lru根据 lru 算法删除键,不管数据有没有设置超时属性allkeys-random随机删除所有键volatile-random随机删除逾期键volatile-ttl根据键值对象的 ttl 属性,删除最近将要逾期数据,假如没有 ,回退到 noeviction 策略
优先使用 allkeys-lru 策略:业务数据中有明显的冷热数据区分,建议使用 allkeys-lru 策略
业务应用访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略
业务中有置顶的需求,好比置顶视频、新闻,可以使用 volatile-lru 策略
长期化

RDB 长期化

概览

将内存中的数据生成快照保存到磁盘内里,保存的文件后缀是 .rdb
rdb 文件是一个颠末压缩的二进制文件,当 Redis 重新启动时,可以读取 rdb 快照文件恢复数据
其中,包罗 rdbSave 和 rdbLoad 两个函数
RDB 文件是一个单文件的全量数据,适合数据的容灾备份与恢复
RDB 文件生成方式


AOF 长期化

概览

AOF  会把 Redis 服务器每次实验的写下令记录到一个日志文件中,当服务器重启时,再次实验 AOF 文件中的下令来恢复数据
假如 Redis 服务器开启了 AOF 长期化,会优先使用 AOF 文件来还原数据库状态
只有在 AOF 的长期化功能处于关闭状态时,服务器才会使用 RDB 文件还原数据库状态
AOF 优先级大于 RDB
实验流程

AOF 不需要设置任何触发条件,对 Redis 服务器的所有写下令都会自动记录到 AOF 文件中
AOF 文件的写入流程可以分为 3个 步骤:
AOF 缓存区的文件同步策略

文件同步策略write 阻塞fsync 阻塞宕机时的数据丢失量always阻塞阻塞最多只丢失一个下令的数据no阻塞不阻塞操纵系统最后一次对 AOF 文爱你 fsync 后的数据everysec阻塞不阻塞一般不凌驾 1s 的数据文件重写

把对 AOF 文件中的写下令进行合并,压缩文件体积,同步到新的 AOF 文件中,然后使用新的 AOF 文件覆盖旧的 AOF 文件
触发机制
重写流程
RDB&AOF

RDB的优缺点

AOF 的优缺点

RDB&AOF 混合长期化

Redis 4.0 版本提供了一套基于 AOF-RDB 的混合长期化机制,保留了两种长期化机制的优点
然后,重写的 AOF 文件由两部分组成,一部分是 RDB 格式的头数据,另一部分是 AOF 格式的尾部下令
在 Redis 服务器启动的时间:
基本原理

redis 协议

RESP,是一种简单的文本协议,用于在客户端和服务器之间操纵和传输数据
RESP 协议描述了不同类型数据结构,而且定义了请求和响应之间怎样以这些数据结构进行交互
单线程模式

Redis 的网络 IO 和键值对读写是由一个线程来完成的
Redis 在处理客户端请求时包罗获取(读)、解析、实验、内容返回(写)等都由一个顺序串行的主线程处理
由于 Redis 在处理下令的时间是单线程作业的,以是会有一个 Socket 队列

Redis 的其他功能,好比长期化、异步删除、集群数据同步等,都是交由额外线程实验的
哨兵模式

概览

Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要手动将从节点晋升为主节点,同时还需要关照客户端更新主节点地址
Redis 2.8 以后提供了 Redis Sentinel 哨兵机制来解决这个问题
(注册中心 心跳机制)
Redis Sentinel 的主要功能

Sentinel 是一个管理多个 Redis 实例的工具,ta 可以实现对 Redis 的监控、关照、自动故障转移
主观下线和客观下线

默认环境下,每个 Sentinel 节点会以每秒一次的频率对 Redis 节点和其 ta 的 Sentinel 节点发送 PING 下令,并通过节点的回复来判断节点是否在线
主观下线

客观下线

工作原理


脑裂问题

在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断。此时,哨兵就会误以为主节点已宕机,就会 在从节点中选举出一个新的主节点,此时 Redis 的集群中就会出现了两个主节点的问题。
脑裂问题影响

Redis 脑裂问题会导致数据丢失
当旧的 Master 变为 Slave 之后 de 实验流程如下:
在实验到第三步时,原客户端在旧 Master 写入的数据就丢失了
解决脑裂问题

Redis 提供了一下两个配置,通过一下两个配置可以尽可能的避免脑裂导致数据丢失的问题:
这两个配置项必须同时满足,不然主节点拒绝写入
集群

概览

Redis 3.0 之前,使用哨兵(Sentinel)机制来监控各个节点之间的状态
在 3.0 版本正式推出,解决了 Redis 在分布式方面的需求
数据分区

Redis Cluster 接纳虚拟槽分区,所有的键根据哈希函数映射到 0~16383 整数槽内
为什么 Redis 集群的最大槽数是 16384 个

2^14 = 16384、 2^16 = 65536
由于 Redis 每秒都会发送一定命据量的心跳包,假如消息头是 8k,有些太大了,浪费网络资源
Redis 的集群主节点数量一般不会凌驾 1000 个
so,Redis Cluster 的节点建议不凌驾 1000 个,对于节点数在 1000 个以内的 Redis Cluster,16384 个槽位完全够用
集群的功能限制


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4