redis cluster-场景应用特点

1、可支持业务场景

(1)缓存数据:合理地利用redis保存缓存数据,可以有效地加快数据访问,降低后端数据源的压力;

(2)计数器:合理利用incr、getset等命令以及lua脚本,实现计数、限制访问等功能;

(3)排行榜:合理地使用列表、有序集合,可以方便地构建排行榜系统;

(4)签到、活跃用户、标签:此类业务场景可以利用bitmap数据类型,大大节省内存空间占用;

(5)地理定位GEO:支持基于地理位置信息而实现的业务场景,如附近位置等;

2、不适用业务场景

(1)以数据冷热的角度,适合存放操作频繁的数据,不适合存放冷数据

生产环境中,某些集群实际每秒请求量极少,甚至查看监控图表,间隔每小时才产生几百次操作;又或者,生产环境中,某些集群触发了内存使用率告警,经缓存运维人员对该集群进行分析,发现存在大量长期未访问的key,甚至有些idle空闲达到3个月之久;进一步分析数据,发现大量未设置过期时间的数据,或者设置过期时间过长,比如1年。

(2)以数据规模的角度,因数据是存放在内存中,当数据量非常庞大的时候,完全依赖缓存会产生较高的经济成本,另外集群风险会有一定升高,运维也会变得困难,此时就要考虑更好的架构设计或数据优化方案;

基于运维经验,建议Redis单节点内存维持在4G以下,同时Redis cluster分片规模不宜过多,一方面会带来集群节点通讯压力、集群故障判定及切换效率;另一方面因缓存主机数量有限,过多的分片势必会造成单台主机在一个集群中存在过多节点,宕机场景下会扩大影响范围,甚至极端情况造成切换失败,产生风险;

(3)安全、一致性要求高的数据不要强依赖缓存
redis和数据库双写一致性问题
分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。
首先,采取正确更新策略,先更新数据库(一致性还是要看数据库),再更新缓存。其次,因为可能存在更新缓存失败的问题,提供一个补偿机制即可,例如捕获异常后利用消息队列再次发起redis更新,完善的监控预警也是很有帮助的。

以下场景存在缓存数据丢失的可能性:
选择关闭AOF持久化的集群,由于R2M分片默认为一主一从结构(主从不在同一台主机),极端情况下,主从同时宕机,则该分片数据丢失;
选择开启AOF持久化的集群,为了兼顾性能和数据安全性,默认采用系统控制刷盘策略,大概每30秒钟将增量缓存数据刷到磁盘,当机器故障/突然断电时,最近30秒钟左右产生的数据可能会丢失;
当脑裂(网络分区)发生时,可能导致少数节点所在分区中写入的数据后续无法再同步到多数节点所在分区,导致数据丢失;
主节点故障/挂掉时,因redis cluster自身节点宕机判定及新主节点选举机制,造成主从Failover存在15秒左右的时间周期,期间客户端重试失败,导致数据丢失;
主节点故障/挂掉时,极少量数据还未同步到从节点,从节点进行了failover成为新的主节点,导致数据丢失;

综上所述:集群单节点内存不超过4000MB、集群节点数量(主从相加)不超过150、集群单节点TPS不超过40k/s,认为是一个相对较好的状态,因此当集群大部分情况下已经突破这个值,建议开始进行架构、数据等层面的优化,而不是无底洞使用。

redis 缓存击穿和雪崩

缓存击穿
现在不少公司都是在使用redis中间件,使用的方式好多还是基于数据库创建生成缓存,如果缓存不存在就是去查数据库。没有不更新redis,有的话更新缓存。设计以数据库为中心,貌似没有问题。但是在盗刷,批量提交的时候就会出现问题了。
如查询用户登录信息,用一些随机生成的userId去访问你的接口,后台大量查询sql就会消耗io,线程池连接数很高,消耗计算内存,从而cpu持续增高,系统瘫痪。
解决方案:
(一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
(二)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
(三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。
缓存雪崩
大面积缓存失效了,请求到数据库
目的还是错开缓存失效
(一)给缓存的失效时间,加上一个随机值,避免集体失效。
(二)使用互斥锁,但是该方案吞吐量明显下降了。
(三)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点
I 从缓存A读数据库,有则直接返回
II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。
III 更新线程同时更新缓存A和缓存B。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值