持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。
Redis 提供两种方式进行持久化:
RDB 持久化:原理是将 Reids在内存中的数据库记录定时保存到磁盘上。
AOF 持久化(append only file):原理是将 Reids 的操作日志以追加的方式写入文件,类似于MySQL的binlog。
RDB 持久化(工作原理):
AOF 持久化(工作原理):
开启AOF
Redis服务器默认开启RDB,关闭AOF;要开启AOF,需要在配置文件中配置:
vim /etc/redis/6379.conf
–700行–修改,开启AOF
appendonly yes
–704行–指定AOF文件名称
appendfilename “appendonly.aof”
–796行–是否忽略最后一条可能存在问题的指令
aof-load-truncated yes
AOF持久化和RDB持久化的区别:
①AOF持久化是以追加的方式把redis内存的操作命令保存在文件中;RDB持久化是定时把redis内存的数据进行快照压缩保存成RDB文件;
②他们都是在父进程fork时会出现阻塞,但是AOF的实时性更好;
③AOF持久化占用的内存比较大,速度慢;RDB持久化占用的内存小,速度快;
④AOF持久化的兼容性比RDB持久化好;
redis的优化:
①开启AOF持久化;
②精简键名,给键设置生命周期;
③设置redis的密码;
④多使用hash散列方式在redis中;
⑤开启自动清理内存碎片;
⑥设置clients连接数、memory内存最大数、timeout超时时间;
⑦主从复制、哨兵模式和集群的高可用;
缓存和数据库的数据双写一致性问题:
怎么查:查看两方的位置点偏移量是否一致;
怎么解决:更新数据库,然后删除缓存(或者设置缓存的生命周期),然后如果有更新的数据会同步缓存到redis里;
缓存雪崩:
现象:缓存同一时间大面积的过期失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉;
解决办法:①加锁排队 ②设置生命周期随机;
缓存击穿:
现象:缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库;
解决办法:①设置高热数据永久不过期 ②设置互斥锁
缓存穿透:
现象:缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉;
解决办法:①设置校验,例如id<=0的直接过滤 ②使用布隆过滤器,把一定不正确的结果直接拦截。
redis占用内存过高,什么问题,怎么解决?
①空闲键太多,设置生命周期,高热数据不设生命周期
②内存淘汰策略有问题,可以config get maxmemory-policy查询,然后进入配置文件进行添加修改
③内存最大值设置过小,config get maxmemory进行查询,然后配置文件修改
④连接过多,流量太大等
可以get clients查最大连接数是多少,info clients查询已连接是多少,如果不多就查询流量,流量也不大,可能是客户端访问完redis后没有关闭tcp连接,可以查询tcp的连接数,然后进行内核设置快速释放等待时间