2020-12-13

由于Redis是基于内存的数据库,为了保证数据的可用性,Redis提供了两种数据持久化机制,RDB (Redis DataBase)和 AOF (Append Only File)。用于crash后,redis的恢复。

AOF

持续的用日志记录写操作,它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
优点:
数据的完整性和一致性更高
缺点:
因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
aof机制默认关闭,可以通过appendonly = yes参数开启aof机制,通过appendfilename = myaoffile.aof指定aof文件名称。

RDB

RDB模式可以在指定的时间间隔内生成内存中整个数据集的持久化快照。快照文件默认被存储在当前文件夹中,名称为dump.rdb,可以通过dir和dbfilename参数来修改默认值。
平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。redis默认为RDB。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
1会造成部分数据的丢失,数据的完整性和一致性不高,RDB可能在最后一次备份时宕机了。
2 当数据集非常大时,fork操作会占用很多系统资源,造成主服务进程假死。

缓存穿透

指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决办法:
1.布隆过滤
对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
2. 缓存空对象. 将 null 变成一个值.
如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存击穿

指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决办法:
1.设置热点数据永远不过期。
2.使用互斥锁

缓存雪崩

指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决办法:
1.设置热点数据永远不过期。
2.加互斥锁,
3.数据预热:可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。

哨兵模式

哨兵模式是redis高可用的实现方式之一
使用一个或者多个哨兵(Sentinel)实例组成的系统,对redis节点进行监控,在主节点出现故障的情况下,能将从节点中的一个升级为主节点,进行故障转义,保证系统的可用性。

哨兵的功能:
监控主数据库和从数据库是否正常运行。
主数据库出现故障时自动将从数据库转换为主数据库。

集群模式

原理:Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。
基于超半数选举原理集群至少需要3主3从

高并发
主从架构 读写分离 水平扩容支撑读高并发
主节点负责写,从节点负责读,主从保证一个主节点挂了还能正常服务,使用集群模式水平扩容可以支撑更大访问量,保证高并发。
主从、哨兵和集群
https://www.cnblogs.com/L-Test/p/11626124.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值