电子说
Redis是用C语言开发的一个开源的高性能键值对(key-value)内存数据库。
Redis数据存储原理
** 存储结构如图:**
redisDB、dict、dictht、dictEntry、RedisObject的存储结构关系如图:
占的字节数:
dictEntry :16字节、RedisObject:12字节、sds:8字节 + 字符串长度
我们现在思考,如果一个10字节的key,需要多少存储空间呢?
16+12+8+10+1=47*2(exprires也需要同样的空间所以乘以倍数)
结论:在key设置的时候尽量的少的字节,避免空间的浪费;
内存清理方式:
定期清理
随机取样的方式,如果清理的比例大于25%,继续。如下图:
惰性删除:被动删除策略,访问时判断;
LFU
volatile-lfu:对有过期时间的key采用LFU淘汰算法;
allkeys-lfu:对全部key采用LFU淘汰算法;
LRU
volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放;
allkeys-lru:从数据集中选择最近最久未使用的数据释放;
Redis数据固化方式
RDB快照方式
手动方式:
save:阻塞当前Redis服务器,直到RDB过程完成为止;
自动方式:
bgsave:fork子进程,持久化过程由子进程负责,完成后自动结束;
配置项:save m n,m秒存在n次写入,触发bgsave ;
优点:
对Redis性能影响低,二进制压缩文件体积小,数据恢复块;
** 缺点:**
有数据丢失可能,备份文件版本兼容问题;
** 过程如图:**
* AOF快照方式 :
append only file,日志形式记录写入指令,实时持久化;**命令写入过程:**
配置 | 含义 | 效率 | 数据安全 |
---|---|---|---|
appendfsync=always | 每次同步 | 低 | 全最高,最多丢失一个写入的数据 |
appendfsync=everysec | 每秒同步 | 中 | 安全最折中,最多丢失1S的数据 |
appendfsync=no | 关 闭 | 高 | 安全最低,最多上一次保存AOF文件到当前时刻的全部数据 |
过程如图:
Redis重启恢复过程:
注意:重启的过程中需要注意:如果开启RDB模型,未开启AOF模式,而在重启的时候开启AOF模式,这是RDB****的数据就会覆盖掉。
Redis可靠性保障
启动时,全量同步Slave。增量同步,运行ID(Master启动时生成),同步给Slave,通过复制偏移量确定具体同步位置;
具体同步过程如下图所示:
不断地检查Master和Slave是否运作正常,发现故障通知管理员和客户端,自动主从切换,更新配置信息,客户端应用初始化时连接Sentinel获取节点信息;
哨兵模式架构:
集群模式
无需Sentinel哨兵,支持水平扩容,自动迁移。
缺点:
不支持批量操作,客户端路由,两次交互,存在性能问题,如图:
全部0条评论
快来发表一下你的评论吧 !