20220218

分布式缓存的一些方案:

缓存存在的理由:1、加速读写。单机redis qps轻松上万,mysql只有几千;2、降低后端负载。复杂结果、耗时结果缓存,减少cpu、io、线程资源。

问题:1、数据不一致;2、代码维护成本高;3、运维成本;保证高可用(主从)、高并发(集群)

策略:1、LRU\LFU\FIFO;空间有限,数据长期不变动,不存在数据不一致性业务,如录入不变更的信息。2、超时剔除;比如redis expire命令,适合能够容忍一定时间数据不一致的业务,比如文案。3、主动更新;一致性高,相当于业务数据更新和缓存更新耦合了,这里要考虑业务数据更新成功,缓存更新失败的场景(为了解耦:用消息队列的方式更新)。

低一致性业务:一二结合;高一致性:二三结合;

一、穿透优化:缓存空对象,存储层没有命中的返回一个业务上的对象保护后端。高并发不同的缓存穿透,还是会穿透到db,而且缓存了大量的空对象。方案:做好业务过滤;给空对象设置较短的过期时间;

二、布隆过滤器:可以布隆过滤器(本地缓存)+缓存空对象(redis、memcache远程缓存)结合;

三、无底洞优化:(无底洞概念:facebook 2010年有3000个memcached节点,储存千g缓存,继续添加节点,效果不明显了。原因:通常键值hash函数将key映射到对应的实列,造成key的分布和业务无关,即使使用分布式(一致性哈希、redis-cluster、codis),批量获取多个key涉及多次网络操作)

1、IO优化:命令优化(sql优化、命令优化);减少通信次数;降低接入成本(长连、接池、nio);访问合并;

2、批量操作优化:1、串行拆分(N次网络时间+n次命令时间);2、用map<node,somekeys>(node次网络时间+n次命令);3、并行(1次网络时间+n次命令)【jdk8以上,开启labmda并行流开发】;4、hash-tag实现(类似一致性哈希)

四、雪崩优化:缓存失效,所有的请求直接到存储层,造成存储层练级宕机。

1、保证缓存服务高可用(一主多从,redis sentine机制);

2、依赖隔离组件限流降级,比如netflix的hystrix;

3、项目资源隔离;

五、热点key重建优化:当缓存失效的时候,大量线程来重建缓存,造成后端负载加大雪崩。

1、互斥锁;只允许一个线程重建缓存,取数据的线程排队等待。如果重建时间太长或者并发量太大,会造成阻塞(优化:等待的线程先拿旧值返回)。google的guava cache的refreshafterwrite采用的是这个方案避免雪崩。

2、永不过期;主动更新。

3、后端限流;

spring 事务:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值