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文件到当前时刻的全部数据 |
- AOF文件重写
- fork子进程不影响父进程处理请求
- 子进程双写,确保数据不丢失
- 手动触发:调用bgrewriteaof命令
- 被动触发:
- auto-aof-rewrite-min-size
- auto-aof-rewrite-percentage
- aof_current_size
- aof_base_size
过程如图:
Redis重启恢复过程:
注意:重启的过程中需要注意:如果开启RDB模型,未开启AOF模式,而在重启的时候开启AOF模式,这是RDB****的数据就会覆盖掉。
Redis可靠性保障
- 主从模式
启动时,全量同步Slave。增量同步,运行ID(Master启动时生成),同步给Slave,通过复制偏移量确定具体同步位置;
具体同步过程如下图所示:
哨兵模式架构:
-
集群模式
无需Sentinel哨兵,支持水平扩容,自动迁移。
缺点:
不支持批量操作,客户端路由,两次交互,存在性能问题,如图:
-
C语言
+关注
关注
180文章
7604浏览量
136713 -
数据存储
+关注
关注
5文章
970浏览量
50900 -
数据库
+关注
关注
7文章
3795浏览量
64365
发布评论请先 登录
相关推荐
评论