高并发,分布式缓存和本地缓存

2021年4月29日 6点热度 0条评论 来源: 关键我姓杨

高并发,分布式缓存和本地缓存

讲解分布式缓存和本地缓存知识

  • 什么是缓存
    • 程序经常要调用的对象存在内存中,方便其使用快速调用,不必去数据库或者其他持久化设备中查询,主要是提高性能
    • DNS 缓存.前端缓存.代理服务器缓存Nginx,应用程序缓存(本地缓存,分布式缓存),数据库缓存
  • 分布式缓存
    • 与应用分离的缓存组件或服务,与本地应用隔离一个独立的应用程序,多个应用可直接共享缓存
    • 常见的分布式缓存 Redis,Memcached等
  • 本地缓存
  • 和业务程序一起的缓存,例如mybais的一级缓存,mybais二级缓存,本地缓存自然是最快的,但是不能在多个节点进行共享
  • 常见的本地缓存:ssm基础课程mybais一级缓存,mybais二级缓存;框架本身的缓存;redis本地单机服务;ehchche,guava cache,caffeine等
  • 选择本地缓存和分布式缓存
    • 和业务数据结合去选择
    • 高并发项目里面一般都是有本地缓存和分布式缓存共同存在的

缓存穿透,击穿和雪崩你是否可以区分

简单描述一下缓存穿透,击穿和雪崩的区别
  • 缓存击穿 (某个热点key缓存失效了)
    • 缓存中没有但数据库中有的数据,假如是热点数据,那么key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大。
    • 和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key。
    • 预防: 设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁
  • 缓存穿透 (查询不存在数据)
    • 查询一个不存在的数据,由于缓存是不命中的,并且处于容错考虑,如发起id为"-1"不存在的数据
    • 如果从存款层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。存在大量查询不存在的数据,可能DB就挂掉了,这也是黑客利用不存在的key频繁攻击应用的一种方式。
    • 预防: 接口层增加校验,数据合理性校验,缓存取不到的数据,在数据库中也没有取到这时也可以将key-value对写炜key-null,设置短点的过期时间,防止同一个key被一直攻击。
  • 缓存雪崩 (多个热点key过期)
    • 大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效,造成瞬时DB请求量大,压力骤增,引起雪崩。
    • 预防: 存数据库的过期时间设置随机,防止同一时间大量数据过期现象发生,设置热点数据永远不过期,定时任务定时更新。

    Redis使用规范

  • 冷热数据区分
    • 虽然 Redis支持持久化,但将所有数据存储在 Redis 中,成本非常昂贵。建议将热数据 (如 QPS超过 5k) 的数据加载到 Redis 中。低频数据可存储在 Mysql、 ElasticSearch中。
    • 业务数据分离
    • 不要将不相关的数据业务都放到一个 Redis中。一方面避免业务相互影响,另一方面避免单实例膨胀,并能在故障时降低影响面,快速恢复。
  • 消息大小限制
    • 由于 Redis 是单线程服务,消息过大会阻塞并拖慢其他操作。保持消息内容在 1KB 以下是个好的习惯。严禁超过 50KB 的单条记录。消息过大还会引起网络带宽的高占用,持久化到磁盘时的 IO 问题。
  • 缓存 Key 设置失效时间
    • 作为缓存使用的 Key,必须要设置失效时间。失效时间并不是越长越好,请根据业务性质进行设置。注意,失效时间的单位有的是秒,有的是毫秒
  • 缓存不能有中间态
    • 缓存应该仅作缓存用,去掉后业务逻辑不应发生改变,万不可切入到业务里。第一,缓存的高可用会影响业务;第二,产生深耦合会发生无法预料的效果;第三,会对维护行产生肤效果。

    操作规范

    • 严禁使用 Keys
    • Keys 命令效率极低,属于 O(N)操作,会阻塞其他正常命令,在 cluster 上,会是灾难性的操作。严禁使用,DBA 应该 rename 此命令,从根源禁用。
  • 严禁作为消息队列使用
    • 如没有非常特殊的需求,严禁将 Redis 当作消息队列使用。Redis 当作消息队列使用,会有容量、网络、效率、功能方面的多种问题。如需要消息队列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ。
  • 禁止长时间 monitor
    • monitor函数可以快速看到当前 redis 正在执行的数据流,但是当心,高峰期长时间阻塞在 monitor 命令上,会严重影响 redis 的性能。此命令不禁止使用,但使用一定要特别特别注意。
  • Key 规范
    • Redis 的 Key 一定要规范,这样在遇到问题时,能够进行方便的定位。Redis 属于无 scheme 的 KV 数据库,所以,我们靠约定来建立其 scheme 语义
      • 能够根据某类 key 进行数据清理
      • 能够根据某类 key 进行数据更新
      • 能够方面了解到某类 key 的归属方和应用场景
      • 为统一化、平台化做准备,减少技术变更
    原文作者:关键我姓杨
    原文地址: https://blog.csdn.net/qq_48609783/article/details/116274268
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。