关于redis:Redis-缓存一致性思考

42次阅读

共计 795 个字符,预计需要花费 2 分钟才能阅读完成。

概述

一致性

  • 缓存一致性,指的是缓存中的数据,与数据库中的数据是否统一

能够了解为数据的快照与实时数据是否相等,在实时数据变动的过程中以及数据快照同步中产生的问题,即缓存一致性问题(也能够归类于数据双写问题)

业务场景

生产中面临数据的高频读取,为了升高数据库压力,就能够思考将数据放入缓存中,缓存又可分为本地缓存与分布式缓存

本地缓存 & 分布式缓存

  • 本地缓存指的是机器上的缓存,如 Guava 和 Ehcache,此类缓存多受限于机器内存与分布式部署同步艰难等问题
  • 分布式缓存指的是数据寄存在服务端,应用方拜访同一份数据,如 Redis,MemCache,此类缓存存在丢数据,数据延时,服务宕机等问题

分布式缓存一致性问题

承接上述,已知分布式缓存的实质是将数据库的数据写入到缓存服务端,当数据库产生变更,将变更同步至缓存服务端的过程中,缓存与数据库的数据是不统一的,就波及到了缓存一致性问题
(本地缓存一致性问题不在此处探讨)

解决方案

读数据

面临强一致性场景时,能够思考将数据放入缓存(过期或永不过期都可),服务端只能从缓存读取数据,当发现缓存中没有数据时,服务端加锁读取数据库,此时只有一个申请能够拜访数据库,查问完结后将后果写入缓存,其余申请阻塞至缓存写入实现,再从缓存中读取数据

  1. 服务端解决查问申请,尝试从缓存中查问数据
  2. 缓存中存在数据,则间接返回
  3. 缓存中不存在数据,则加锁查询数据库,查库完结将数据放入缓存
  4. 其余申请间接读取缓存

写数据

写数据时可后行批改数据库,再将缓存更新或删除(删除时,直到下一次查问申请到来时,新数据才会写入缓存),此计划在数据写入到缓存更新的过程中,其余查问申请仍然将拜访到旧的数据,无奈保障相对的一致性

若须要强一致性计划,则可间接将缓存删除,并阻塞所有读取申请,而后加锁写数据,再将数据放入缓存中,相似于读写锁的概念,读写互斥,此计划因为强一致性束缚,相上述计划性能会差一些,须要联合具体场景应用

正文完
 0