REDIS
2020-04-27 11:32:09 0 举报
AI智能生成
redis
作者其他创作
大纲/内容
持久化
RDB持久化
通过保存数据完成持久化
RDB文件结构
save
阻塞redis进程,直到RDB文件创建完毕为止,阻塞期间,服务器不能处理任何请求
bgsave
派生出一个子进程(fork),由子进程负责创建RDB文件,主进程继续处理命令
执行bgsave期间,客户端发来save会被拒绝
配置自动保存
使用save设置,执行bgsave命令
AOF持久化
通过保存所执行的写命令来记录数据库状态的
写入与同步
always
将aof_buf缓冲区所有内容写入并同步到AOF文件
性能差,数据零误差
everysec(默认配置)
每秒将缓冲区内容同步到AOF文件一次
数据准确性高,性能高
no
操作系统决定何时将缓冲区内容同步到AOF
整体过程不可控
AOF重写
Redis创建一个新的AOF文件代替现有的AOF文件
原理
首先从数据库读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令
bgrewriteaof
重写放在子进程中
数据库
结构
每一个RedisDB结构代表一个数据库,dbnum代表数量,默认16
切换数据库
select
键空间
redisDb结构dict字典保存了数据库中的所有键值对,此字典称为键空间
对键值对进行添加,删除,更新操作
设置键的过期时间或生产时间(expire)
过期键删除策略
目标
内存占用与CPU占用之间寻求一种平衡
结构
维护了一块expire内存结构
定时删除
定时器,检测过期时间到到达执行删除;用处理器性能换取存储空间
优点
节约内存,到点删除,快速释放不必要内存
缺点
CPU压力大,无论CPU负载量多高,均占用CPU
惰性删除
数据到期不做处理,下次访问数据时,过期返回不存在并删除;
优点
节约CPU性能
缺点
占用内存,内存压力大
定期删除
周期性轮询,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
特点
CPU性能占用设置有峰值,检测频度可以自定义
内存压力不是很大,长期占有的冷内存会被删除
redis采用定期和惰性删除策略
集群
三高架构
高可用
服务器年宕机时长低于315秒,即99.999%
高并发
高性能
主从复制
描述
master端数据复制到slave中
一个slave对应一个maste,一个master对应多个slave
master负责写数据,slave负责读数据
作用
读写分离,master写,slave读,提高服务器读写负载能力
负载均衡,根据需求改变slave数量,提高数据库并发量和数据吞吐量
故障恢复,master出问题,slave提供服务,快速故障恢复
数据冗余:数据热备份,持久化之外的数据冗余方式
高可用的基石
流程
建立连接
slave到master的连接,使得master能够识别slave,并保存slave端口
数据同步
连接之后,复制master数据到slave
全量复制:RDB
备份id和偏移量
repl-id与repl-offset
master重启恢复,使得slave认为还是之前的master
部分复制:缓冲区
slave同步 关闭对外服务
命令传播
服务器运行ID
识别身份,每台服务器都有,40位随机十六进制字符组成
复制缓冲区
由来
开启AOF或者链接称为master节点,即创建复制缓冲区
作用
保存master收到的所有指令
FIDO队列,存储服务器执行过的命令
偏移量
一个数字,描述复制缓冲区的指令字节位置
master记录发送给slave指令字节对应的位置
slave记录slave接收master发送过来的指令字节对应的位置
作用:同步信息,比对master与slave的差异,slave断线后,恢复数据使用
字节值
心跳机制
master心跳
ping指令,判断slave是否在线
slave心跳
REPLCONF ACK,汇报slave自己的复制缓冲区,获取最新指令变化
判断master是否在线
哨兵模式
描述
哨兵是一个分布式系统,对主从结构每一台服务器进行监控,出现故障时通过投票机制选择新的master,将slave连接到新的master
哨兵也是一台redis服务器,不提供数据服务
通常哨兵配置数量为单数
作用
监控,通知,自动故障转移
哨兵模式
sentinel读入用户指定的配置文件,为每个要被监视的主服务器创建相应的实例结构,创建连向主服务器的命令和订阅连接
sentinel与主服务器和从服务器创建命令和订阅连接,sentinel与sentinel之间则只创建命令连接
sentinel以每秒一次频率向实例发送ping,并根据回复判断实例是否在线,指定时长内发送无效回复时,sentinel判定实例下线
sentinel将一个主服务器判断主观下线,会询问其他监视此主服务器sentinel询问,收集到足够多主观下线投票后,将主服务器判断为客观下线,进行故障转移
工作原理
集群
架构
使用网络将若干台计算机连通起来,提供统一的管理方式,使其对外呈现单机的服务器效果
作用
分散单台服务器访问压力,实现负载均衡
分散单台服务器存储压力,实现可扩展性
降低单台服务器宕机带来的业务灾难
节点通过握手将其他节点添加到自己所处的集群中
集群16384个槽可以指派给集群中各个节点,每个节点会记录哪些槽指派给了自己
重新分片
由redis-trib执行,关键在于将属于一个槽的所有键值对从一个节点转移到另一个节点
字典
描述
是一种用来保存键值对的抽象数据结构
使用哈希表作为底层实现
一个哈希表包含多个哈希表节点,一个节点保存字典中一个键值对
哈希表:
哈希表节点
整数集合
描述
保存整数值,保证不会出现重复元素
组成:
encoding:编码值 :int_16等
length:整数集合包含的元素数量
cntents[]:数组存放内容的
升级
当新元素加入到整数集合中,并且新元素类型比整数集合现有的类型都长时,先进行升级,在添加
跳跃表
描述
一种有序数据结构,通过每个节点中维持多个指向其他节点的指针,达到快速访问节点的目的
组成:
header:指向跳跃表表头
tail:指向跳跃表表尾节点
level:用于O(1) 时间内获取层高最大的节点的层数量
length:O(1)时间内返回跳跃表的长度
特点
跳跃表中节点按照分值大小进行排序,分值相同时,节点按照成员对象大小排序
SDS
描述
遵循C字符串以空字符串结尾的惯例,保存空字符的1字节不计算在SDS的len属性中。
特点
杜绝缓冲区溢出,free判断
减少修改字符串带来的的内存重新分配次数
空间预分配
惰性空间释放
二进制安全
使用len属性而不是空字符判断字符串是否结束
取字符串长度时间O(1),len字段
兼容部分C字符串函数
链表
节点
特点:
双端
链表前置节点和后置几点引用,获取节点时间复杂度为O(1)
无环
表头节点prer指针和表尾节点next指针都指向NULL
带链表长度计数器
len获取链表长度时间复杂度为O(1)
多态
通过void*指针保存节点值,可以保存不同类型的值
带表头表尾指针
获取链表表头节点,表尾节点复杂度为O(1)
压缩列表
定义:一系列特殊编码的连续内存块组成的顺序型数据结构
组成:
zlbytes:记录压缩列表占用的内存字节
zltail:记录压缩列表尾节点距离压缩列表起始地址有多少个字节
zllen:压缩列表包含的节点个数
entryX:压缩列表包含的各个节点
节点构成
previous_entry_length:记录压缩列表前一个字节的长度
encoding:记录节点属性content保存数据的类型以及长度
content:负责保存节点的值
zlend:特殊值0xFF,标记压缩列表的末端
数据类型
string
编码
int编码
字符串保存的是整数,可以用long表示
raw编码
值为字符串&&长度大于32字节
raw调用两次内存分配函数创建redisObject和sdshdr
embstr编码
值为字符串&&长度小于等于32字节
调用一次内存分配一块连续的空间,包含redisObject和sdshdr
编码的转换
int编码保存的不再是整数或者超出long范围,转化为raw
embstr只读,对embstr进行修改时,先转化为raw再进行修改,修改后对象一定是raw的
特点:操作原子性
命令
SET,GET,APPEND,INCRBY,DECRBY等
应用场景
控制数据库自增主键id,保障数据库表的主键唯一性
expire设置过期时间,控制数据的声明周期
list
编码
linkedlist
ziplist编码
编码转换
列表保存元素个数小于512个,每个元素长度小于64字节使用ziplist编码
不满足以上两个条件使用linkedlist编码
特点
数据有序性,数据可以重复
命令
LPUSH,RPUSH,LPOP,RPOP,LLEN等
应用场景
应用于操作先后顺序的数据控制
应用于最新消息的展示
hash
编码
ziplist编码
hashtable
编码转换
列表保存元素个数小于512 每个元素长度小于64字节 使用ziplist编码
不满足以上条件使用hashtable
特点
命令
HSET,HGET,HEXISTS,HDEL,HGETALL
应用场景
应用于购物车存储设计
应用于抢购,限购,限量发放优惠券,激活码等业务的数据存储设计
set
编码
hashtable
intset
编码转换
集合对象所有元素都是整数,所有元素数量不超过512,使用intset编码
不满足这两个条件使用hashtable编码
特点
无序,不允许重复
命令
SADD,SCARD,SISMEMBER,SRANDMEMBER,SREM等
应用场景
应用于随机推荐类信息检索
应用于不同类信息的关联检索,共同好友,共同关注等
应用于同类型数据快速去重操作
应用于不重复数据的合并,取交集操作
应用于黑名单和白名单的设计
sorted_set
编码
ziplist编码
skiplist
编码转换:
元素数量小于128 并且保存所有元素长度都小于64字节使用ziplist编码
不满足这两个条件使用skiplist编码
特点
有序的,每个元素设置一个score作为排序依据
命令
ZADD,ZCARD,ZCOUNT,ZRANGE,ZREVRANGE等
应用场景:
应用于计数器组合对应的排序
应用于定时任务执行顺序管理或者任务过期管理
应用于即时任务,消息队列执行管理
事务
描述
事务提供一种将多个命令打包,然后一次性,顺序地执行多个命令的机制,执行过程中不会中断去执行其他命令
命令
MULTI,EXEC,WATCH
MULTI
事务开始
EXEC
事务执行
WATCH/unwatch
乐观锁,EXEC之前监视任意数量数据库键,如果有键被修改,则拒绝执行事务
实现基于状态控制的批量任务的执行
DISCARD
取消事务
分布式锁
setnx/del
设置一个公共锁以及删除命令
死锁解决方案
expire,锁加上时间,到时不释放,系统释放
应用
应用于分布式锁对应的场景控制
高级数据类型
bitmaps
应用于信息状态统计
GEO
根据坐标求范围,根据点求范围内数据
附近的人,地图应用等
应用于地理位置的计算
HyperLogLog
用于进行基数统计,不保存数据,只记录数量而不是具体数据
核心是估算,最终值存在误差
应用于独立数据的统计
企业级解决方案
缓存预热
系统启动前,提前将相关的缓存数据直接加载到缓存系统;
避免用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询被预热的缓存数据
缓存击穿
单个热key过期瞬间,数据访问量较大,未命中redis后,发起了大量对同一数据的数据库访问,导致对数据库服务器造成压力
预防为主,配合监控与即时调整策略
缓存雪崩
瞬间过期数据量太大,导致对数据库服务器造成压力
有效避免过期时间集中,有效解决雪崩;配合其他策略一起
缓存穿透
访问了不存在的数据,跳过了合法数据的redis数据缓存阶段,每次访问数据库,导致对数据库服务器造成压力
性能指标监控
性能指标:Performance
Redis相应一个请求的时间/缓存命中率/平均每秒处理请求总数
内存指标:memory
使用的内存
基本活动指标
客户端连接数,slave,数据库key总数
持久化指标
最后一次持久化保存到磁盘的时间戳
最后一次持久化依赖数据库的更改次数
错误指标
拒绝连接次数,key查找失败次数
0 条评论
下一页