Redis
什么是Redis持久化机制
1)背景:
Redis是内存数据库,如果不将内存中的数据库转态保存到磁盘,那么一旦服务器进程退出,服务器中的数据转态也会消失,所以Redis提供了持久化功能。
2)RDB持久化(Redis DataBase)
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个进程,先将数据集写入临时文件,写入成功后,在替换之前的文件,用二进制压缩存储。Redis会单独创建fork一个子进程来进行持久化。会将数据写入一个临时文件中,待持久化过程都结束了。再用这个临时文件替换上次持久化好的文件。整个过程中。主进程是不进行任何IO操作单独。这就确保了极高的性能。
优点:适合大规模的数据恢复,对数据完整性要求不高
缺点:需要一定时间间隔进程操作,如果redis意外宕机了,这个最后一次修改数据就没有了。fork进程的时候,会占用一定的内容空间!
3)AOF持久化(Append only File)
定义:AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
优点1:AOF可以更好的保护数据不丢失,一般AOF会以每隔一秒,通过后台的一个线程去执行一次fsync操作,如果redis进程挂掉,最多丢失一秒的数据。
优点2:AOF以日志文件的命令通过非常可读的方式进行记录,这个非常适合做灾难性的误删除紧急恢复,那么就可以将日志文件的flush删除,进行恢复。
缺点:相对于数据文件来说,aof远远大于rdb,修复的速度比rdb慢,aof运行效率也要比rdb慢,redis默认配置就是rdb持久化。
哨兵模式
主从切换技术的方法是:当主服务器宕机后,需要手动把一台服务器切换为主服务器,这就需要人工干预,费事费力费时间,所以我们会考虑用哨兵模式。它是一种特殊的模式,首先redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行,其原理是哨兵通过发送命令,等待redis服务器响应,从而监控运行多个redis的实例。
优点:
哨兵集群,基于主从复制模式。主从可以切换,故障可以转移,系统的可用性比较好加粗样式。哨兵模式就是主从模式的升级,手动到自动,更加健壮。
缺点:Redis不好在线扩容,集群容量一旦达到上限,在线扩容比较麻烦,实现哨兵机制的配置非常麻烦。
Redis缓存穿透和雪崩(他们都是服务器高可用)
Redis缓存的使用,极大的提高了效率,但是要有一些问题,例如数据一致性问题,这个问题没有办法解决,如果对数据一致性要求很高,那么就不能使用缓存。
缓存穿透:根本原因查不到导致缓存穿透
1:定义
缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败,当用户很多的时候,缓存都没有命中,于是都去请求了持久化数据库,这会给持久层造成很多的压力,这时候相当于出现了缓存穿透。
2:现象
系统平稳运行过程中,应用服务器流量随时间增量较大,redis服务器命中率随时间逐步降低,redis内容平稳,内存无压力,redis服务器cpu占用激增,数据库服务器压力激增,数据库崩溃
3:解决方案
布隆过滤器
缓存空对象
缓存击穿(某个key过期,并且该key访问量巨大!)
定义:缓存击穿,是指一个key非常热点,不不停的扛着大并发,大并发集中对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像一个屏障破了一个大洞。
当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,会导致数据库瞬间压力过大。
现象:系统平稳运行过程中,数据库连接量突然激增,redis服务器无大量key过期,redis内存平稳,无波动,redis服务器cpu正常,数据库崩溃。
3:解决方案
设置热点数据永不过期,加互斥锁,这样以来将高并发的压力转移到了分布式锁,因此对分布式锁考验很大。
缓存雪崩(短时间,缓存中较多的key集中过期)
定义:缓存雪崩是指大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机,和缓存击穿不同的时,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
2:现象
系统平稳运行过程中,互让数据库连接量激增。
应用服务器无法及时处理请求。
大量的408,500错误页面出现。
用户反复刷新页面获取数据。
redis数据库崩溃。
redis集群崩溃。
重启数据库再次被瞬间流量击崩。
3:解决方案
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
设置热点数据永远不过期。
4:常见企业级解决方案
redis集群
如果一台挂掉之后还可以继续工作。
限流降级。
在缓存失效后,通过枷锁或队列来读取数据库写缓存的线程数量。
缓存预热。
先将热点的数据在一开始全部访问一遍,这样以来大量访问就会加载到缓存中,给服务器一个准备的时间。
- Redis+Keepalived实现双机不间断缓存<二>
- Memcached 及 Redis 架构分析和比较
- redis + Tomcat 8 的session共享解决
- ServiceStack.Redis泛型存储后getById问题
- redis 主从,基于sentinel 自动切换
- Springmvc+mybatis+Dubbo+ZooKeeper+Redis+KafKa
- Redis 哨兵模式实现主从故障互切换
- redis安装
- Redis 技术内幕——Redis Sentinel 架构
- jt商品redis操作
- Redis介绍和安装
- 缓存技术PK:选择Memcached还是Redis?
- Redis配置
- redis主从配置及主从切换
- 使用Redis保存Spring session(基于XML配置文件)
- Redis学习例子
- redis安装手册,中文配置手册,php-redis模块安装方法,Web管理phpRedisAdmin
- redis读写分离下的高可用设计与实现(上)
- redis的内存优化【转】
- redis 4 搭建集群