一般在电商项目中,有一些热点数据,用户频繁的访问,导致并发量较高,那么我们就需要使用redis来将这些热点数据给保存起来,利用redis的高速率来应对

  1. 当请求热点数据时
     1.1 查询redis缓存,如果存在,直接返回数据
     1.2 如果缓存中数据不存在,那么查询mysql,然后将结果存入缓存并返回结果
  2. 当热点数据发生更新等操作时
     2.1 更新时先更新mysql
     2.2 然后在删除缓存,操作结束
     2.3 分析,线程A过来查数据,缓存没有数据,读取数据库money=100, 线程B更新money=99, 然后删除了缓存,线程A将100放到缓存,结果数据库变为了99,redis变为了100
  3. 先删除缓存的问题
     3.1 更新时,先删除缓存
     3.2 然后更新mysql
     3.3 分析,当一个更新请求进来时,先删除了缓存,还未更新mysql,此时,进来了一个请求热点数据,查询缓存,发现没有缓存,然后查询mysql,最后将数据放入缓存中,那么,下面的查询的请求都会取出缓存中的数据,但是此时缓存中的数据已经变成了脏数据
  4. 如何解决3的问题,采用延时双删策略
     4.1 更新时,先删除缓存
     4.2 然后更新mysql
     4.3 根据情况休眠500毫秒或者1秒
     4.3 再删除缓存
     4.4 分析,这种策略,用户只有在延迟的这段时间内看到的是脏数据,虽然没有完全解决脏数据的问题,但是在大部分时间内可以获取到正常的数据
  5. 异步更新缓存(基于订阅binlog的同步机制)
     5.1 我们先说一下binlog二进制日志是什么东西,在mysql主从搭建的时候,从服务器数据是如何和主服务器数据保持一致的那,就是根据这个binlog二进制日志来进行复制的
      5.1.1 当mysql主服务器进行更新,添加,删除等操作时,当在进行commit提交之前将这个操作记录到binlog日志中,然后再进行commit,而从服务器会开启一个线程叫做I/O线程,去读取主服务器中的binlog日志,然后将其放到一个名叫"中继日志"的地方,然后再开启一个读写线程去读写数据,这样的话,基本上主从服务器的数据延时性很低
      5.1.2 redis缓存就可以利用这个binlog日志来做处理,当binlog产生日志时,然后根据日志去对redis缓存的热数据做对应的操作,就不需要在更新数据时操作redis里面的热数据了
     5.2 读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据