MST

星途 面试题库

面试题:微服务架构下基于RPC的分布式缓存设计中,如何处理缓存与数据库的一致性问题

在微服务架构里,基于RPC实现分布式缓存设计时,当数据在数据库更新后,怎样保证缓存数据也能及时准确更新,以维持两者一致性?请简述常用的策略及实现思路。
24.1万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

常用策略及实现思路

  1. Cache-Aside Pattern(旁路缓存模式)
    • 更新策略
      • 先更新数据库。
      • 再删除缓存。注意不是更新缓存,因为更新缓存可能导致脏数据(比如并发场景下先读缓存后写数据库,更新缓存的值是旧值)。
    • 实现思路
      • 在业务代码中,数据库更新操作成功后,调用缓存客户端的删除接口,传入对应的缓存键。例如在Java中使用Redis,代码如下:
// 假设使用Jedis操作Redis
Jedis jedis = new Jedis("localhost", 6379);
// 更新数据库操作
updateDatabase(data); 
// 删除缓存
jedis.del(cacheKey); 
  1. Write-Through Pattern(写透模式)
    • 更新策略
      • 先更新缓存。
      • 再将缓存数据同步更新到数据库。
    • 实现思路
      • 构建一个缓存和数据库的同步更新组件。以Python使用Memcached和MySQL为例,代码如下:
import memcache
import mysql.connector

mc = memcache.Client(['127.0.0.1:11211'])
mydb = mysql.connector.connect(
  host="localhost",
  user="youruser",
  password="yourpassword",
  database="yourdatabase"
)
mycursor = mydb.cursor()

# 更新缓存
mc.set(cacheKey, newData) 
# 更新数据库
sql = "UPDATE your_table SET column = %s WHERE some_condition"
val = (newData,)
mycursor.execute(sql, val)
mydb.commit() 
  1. Write-Behind Caching Pattern(写后缓存模式,也叫异步缓存写入)
    • 更新策略
      • 先更新缓存。
      • 异步将缓存数据更新到数据库。可以使用消息队列来实现异步处理。
    • 实现思路
      • 例如在Spring Boot项目中使用Kafka作为消息队列。当数据更新时,先更新缓存,然后发送一条包含更新数据的消息到Kafka主题。
      • 有一个消费者监听该主题,从消息中获取数据并更新数据库。
// 生产者发送更新数据消息
KafkaTemplate<String, UpdateData> kafkaTemplate;
UpdateData dataToUpdate = new UpdateData(...);
kafkaTemplate.send("update - topic", dataToUpdate); 

// 消费者更新数据库
@KafkaListener(topics = "update - topic", groupId = "update - group")
public void consume(UpdateData data) {
    updateDatabase(data); 
}