分布式缓存设计之Redis引入(一)

生产中遇到的缓存问题

  • 系统在某个时刻访问量剧增(热点新闻),造成数据库压力剧增甚至崩溃,怎么办?
  • 什么是缓存雪崩、缓存穿透和缓存击穿,会造成什么问题,如何解决?
  • 什么是大key和热key,会造成什么问题,怎么解决?
  • 如何保证redis中的数据都是热点数据?
  • 什么是并发竞争,会造成什么问题,如何解决?
  • 单线程的redis为什么这么快?
  • redis的哨兵和集群原理及选择?
  • 在多机redis使用时,如何保证主从服务器的数据一致性?

缓存的使用场景

  • DB缓存,减轻服务器压力
    • 数据库压力大时,做分库分表,读写分离,引入缓存
  • 提高系统响应
    • 数据库的数据是存在文件里,也就是硬盘,当查找数据时,与内存交换数据,在大量访问时(高并发场景),mysql单机会因为频繁IO而造成无法响应
    • mysql修改操作存在行锁
    • redis数据放在内存中,天然支持高并发访问,qps可达10W/S
  • 做session共享
    • tomcat通过网络session复制,耗费空间和时间,极大影响性能,放在redis中可实现共享
  • 做分布式锁
    • 一般锁是线程锁,多进程用分布式锁
  • 做乐观锁
    • 同步锁和数据库中的行锁和表锁,都是悲观锁,悲观锁的性能是比较低的,响应性比较差
    • 高性能、高响应(秒杀)采用乐观锁,redis可以实现乐观锁 watch+ incr

缓存的分类

  • 客户端缓存
    • 页面缓存: 文件的缓存等
    • 浏览器缓存: 数据的缓存等
    • APP缓存: 数据、文件
  • 网络端缓存:通过代理的方式响应客户端请求,对重复的请求返回缓存中的资源
    • web代理缓存: 如ngnix
    • 边缘缓存:CDN
  • 服务端缓存
    • 数据库级别缓存: mysql查询时的缓存(8版本已废弃)
    • 平台级缓存:GuavaChache、EhCache、OSCache等,部署在应用服务器上,也称为服务器本地缓存
    • 应用级缓存:Redis,Memcache、Tair等

使用缓存的代价

  • 额外硬件支出,系统复杂度提高
    • 缓存是一种用空间换时间的的技术
    • 需额外部署
    • 代码设计时必须考虑更多问题
  • 高并发缓存失效
    • 高并发场景时,会出现缓存失效
    • 缓存穿透、缓存击穿和缓存雪崩
  • 缓存与数据库同步
    • 缓存无法做到时时和数据库数据同步
    • redis主从无法做到主从时时同步
  • 缓存并发竞争
    • 多个客户端同时对一个key进行set值时,由于执行顺序引起的并发问题

缓存的读写模式

  • 旁路缓存
    • 先更新数据库,再删缓存,查询时懒加载缓存(推荐)
      • 也可使用异步方式加载缓存
      • 也存在脏读问题,严格场景下可使用缓存双删策略或分布式锁控制
    • 先更新数据库,再更新缓存
      • 脏读问题,且比上一方案出现的概率更高,因为更新缓存(可能涉及遍历等操作)比删除缓存慢,
    • 先更新缓存,再更新数据库
      • 缓存和数据库数据不一致的问题,而且问题影响时间最长
  • 只更新缓存,缓存操作数据库
  • 只更新缓存,缓存异步操作数据库

缓存的设计思路

  • 多层次:前端缓存,服务本地缓存,服务缓存
  • 选型:memcache redis
  • 集群:哨兵+主从,RedisCluster
  • 缓存的数据结构设计

你可能感兴趣的:(redis,缓存,分布式,redis)