本文介绍: 这样的操作虽然提高了效率,但也带来了安全问题:如果计算机停机,内存缓冲区的数据会丢失,因此系统提供了fsync、fadatasync等同步函数,可以强制操作系统立刻将缓存区中的数据写入到硬盘里,从而确保数据的安全性。Redis时内存从数据库,数据都是存储在内存中,为了避免服务器断电等原因等值Redis进程异常退出后数据打的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘,当下次Redis重启时,利用持久化文件实现数据恢复。文件重写是指定期重写AOF文件,减小AOF文件的体积。
1 Redis的高可用
1.1 高可用的定义
在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不丢失等。
1.2 Redis高可用技术
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和Cluster集群
持久化:
持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
不主从复制:
主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化,写操作无法负载均衡,存储能力收到单机的限制
哨兵:
在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡
Cluster集群:
2 Redis持久化
2.1 持久化的功能
2.2 持久化的方式
RDB持久化:
AOF持久化:
3 RDB持久化
3.1 RDB持久化的触发条件
文件名:dump.rdb
1)手动触发(bgsave命令)
2)自动触发(满足save指令配置的条件,主从复制时从节点首次同步,执行shutdown命令时)
除了save m n 以外,还有一些其他情况会触发bgsave:
3.2 RDB执行流程
执行流程过程:
3.3 启动时加载
4 AOF持久化
4.1 开启AOF
4.2 AOF执行流程
AOF的执行流程包括:
4.3 文件重写
文件重新压缩AOF
文件重写的触发方式
文件重写的流程
4.4 启动时加载
5 RDB和AOF的优缺点
5.1 RDB持久化
优点:
缺点:
5.2 AOF持久化
优点:
缺点:
5.3 RDB/AOF持久化的区别
6 Redis性能优化
查看Redis内存使用
6.1 内存碎片率
6.2 内存碎片率的产生
Redis内部有自己的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
Redis中的值删除的时候,并没有把内存直接释放,交还给操作系统,而是交给了Redis内部的内存管理器。
Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。
6.3 内存碎片率说明
跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
6.4 如何解决碎片率大的问题
6.5 内存使用率
6.6 内回收key
7 Redis优化
7.1 配置文件优化
1)设置 config set activedefrag yes 开启内存碎片自动清理,或者定时执行 memory purge 清理内存碎片
2)尽可能使用 hash 数据类型存储数据。因为 hash 类型的一个键(key)可包含多个字段,该类型数据的占用空间较小。
3)建议设置 key 的过期时间
4)精简 key 的键名和键值,控制 key 占用空间的大小,避免 bigkey(大键) 的产生
5)修改配置 maxmemory 指定redis可占用的最大内存大小
修改配置 maxmemory-policy 指定内存数据淘汰策略(也叫键的回收策略),实现保证内存使 用率不超过最大内存
修改配置 maxmemory-samples 指定内存数据淘汰策略的样本数量,一般为3-7,值越大样本越精确
修改配置 maxclients 指定最大客户端连接数
修改配置 tcp-backlog 指定最大连接队列数
修改配置 timeout 指定连接超时时间
修改配置 lazyfree-lazy-expire yes 释放过期 key 的内存,放到后台线程执行,避免阻塞主进程
修改配置 no-appendfsync-on-rewrite yes AOF文件重写期间,AOF 后台子线程不进行刷盘操作,避免 AOF 重写和 fsync 竞争磁盘 IO 资源,导致 Redis 延迟增加
6)设置 AOF 持久化和主从复制备备份数据,采用哨兵或集群模式实现redis 集群的高可用
7)建议设置 config set requirepass 或修改配置 requirepass 参数来设置 redis 密码
7.2 redis的三大缓存问题
缓存雪崩:redis中大量的缓存键集体过期
解决方案:使用随机数设置key的过期时间,防止集体过期。设置缓存标记,如果缓存过期,自动更新缓存。数据库使用排他锁,实现加速等待。
缓存击穿:redis一个热点键过期,此时又有大量用户访问这个热点
解决方案:预先对热点数据进行缓存预热。监控数据,实时调整
缓存穿透:大量请求访问redis和数据库都不存在的键
解决方案:对空值也进行缓存。使用布隆脚本过滤器进行判断拦截一定不存在的无效请求。使用脚本实时监控,进行黑名单限制
7.3 如何保证 MySQL 和 Redis 的数据一致性
读取数据时,先从redis 读取数据,如果redis中没有,再从MySQL中读取,并将读取到的数据同步到redis缓存中。
更新数据时,先更新MySQL数据库,再更新redis缓存。
删除数据时,先删除redis缓存,再删除MySQL数据库。
对于一些关键数据,可以使用MySQL的触发器来实现同步更新redis缓存。也可以使用定时任务,定自动进行缓存预热,来定期同步MySQL和redis的数据。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。