redis缓存问题

结构示意图
1、缓存击穿
高并发系统中,大量的请求同时查询一个 key 时,而这个 key 正好失效,就会导致大量的请求都到数据库。可能会造成数据库请求量过大,压力增大。
解决办法:
1.1使用互斥锁(代码复杂度大,而且容易死锁风险)
1.2布隆过滤器(布隆过滤器的巨大用处就是,能够迅速判断一个元素是否在一个集合中。其内部维护一个全为0的bit数组,需要说明的是,布隆过滤器有一个误判率的概念,误判率越低,则数组越长,所占空间越大。误判率越高则数组越小,所占的空间越小。)
1.3提前”使用互斥锁(value内部设置1个超时值, timeout1比实际的memcache timeout小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。)
2、缓存雪崩
一时刻发生大规模的缓存失效的情况,比如缓存服务器停电,宕机等。此时请求就会大量到数据库。这种现象就叫缓存雪崩。
2.1队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上
2.2使用集群缓存,分布式架构。并且使用 Hystrix 限流&降级,当发生很多失败的请求时,就对请求限流或者降级。开启缓存持久化机制,尽快恢复缓存集群。设置一个失效时间随机数
3、高并发
Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进行并发访问时会出现问题。
3.1加锁的目的实际上就是把并行读写改成串行读写的方式,从而来避免资源竞争。
3.2在并发量过大的情况下,可以通过消息中间件进行处理,把并行读写进行串行化。
把Redis.set操作放在队列中使其串行化,必须的一个一个执行。
4、数据一致性
因为写和读是并发的,没法保证顺序,如果删了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。如果先写了库,再删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。
4.1双删 + 超时。在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。
4.2通过读取binlog的方式,异步淘汰缓存。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值