缓存更新

主要有以下三种缓存更新策略

  1. 内存淘汰:这种策略主要是利用Redis的内存淘汰机制,即当Redis中内存已满时,如果这时又新的数据到来,那么Redis就会按照一定策略淘汰掉一部分数据,从而让新数据进入。常见的淘汰策略有先进先出,最近未被使用(LUR),最少未被使用等。这种更新策略的优点是不需要维护,又Redis自己维护,缺点是几乎不能保证数据一致性,Redis中可能会同时存在旧数据和新数据。
  2. 超时剔除:这种策略需要我们在Redis存储数据时为其设置一个有效时间,时间一到数据自然剔除,当用户查询数据时,由于缓存中没有该数据,就会从数据库中查找,进而更新进缓存中。因此这种策略具有一定的数据一致性,但是一致性不高,因为如果数据在有效期内发生的变化,需要等到有效期后才会被存储进缓存中,在此期间取出的数据都是旧数据。
  3. 主动更新:当我们修改数据库中的数据时,需要手动的去更新缓存中的数据。具有较好的数据一致性,但是维护成本大。

需要根据不同业务场景来选择不同的更新策略,低一致性业务可以考虑内存淘汰,因为不需要维护;高一致性业务考虑主动更新。

主要有以下三种主动更新方案

  1. Cache Aside调用者在更新数据库时更新缓存
  2. Read/Write Through缓存和数据库集成为一个服务,服务保证两者一致性,对外提供接口
  3. 调用者只操作缓存,使用一个独立的异步线程每间隔一段时间更新一次数据库

为什么选择方案1?

操作缓存和数据库时需要考虑的3个问题

  1. 删除缓存还是更新缓存?为什么?

    删除缓存。因为删除缓存可以和更新缓存达到相同的目的,但是性能更好。如果选择更新缓存,意味着当我们更新数据库中的数据时,顺便更新缓存中的数据。而如果选择删除缓存,意味着更新数据库中的数据时,删除缓存中对应的数据,当用户查询该数据时,由于缓存中没有,因此会向数据库中查询,也能得到正确的数据,这样做的好处在于,只有当用户请求对应数据时才会向缓存中存入,节省了内存。

  2. 如何保证缓存和数据库的操作同时成功或失败?

    通过事务保证删除缓存和更新数据库两个操作的原子性,在分布式系统中需要通过另一种技术实现

  3. 先操作缓存还是数据库?

    如果选择先删除缓存,由于更新数据库的时间比较长,如果此时来了大量请求,会给数据库造成极大压力;