持久化的功能: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的直接过滤 ②使用布隆过滤器,把一定不正确的结果直接拦截。