首页 > 解决方案 > 如何在以下场景中利用 redis 和 mongo?

问题描述

每当 mongodb 发生更改时,我都会使用更改流来使 redis 缓存保持最新。每当更改数据库时,我都会分两步更新缓存:

  1. 清除缓存
  2. 从头开始加载数据

代码:

redisTemplate.delete(BINDATA);
redisTemplate.opsForHash().putAll(BINDATA, binDataItemMap);

问题是在 prod 中这个设置可能很危险。由于 redis 是单线程的,因此事件有可能在多容器应用程序中以下列方式发生:

  1. 数据库更新发生
  2. 数据在redis中被清除
  3. 请求进来并查询一个空的redis缓存
  4. 数据被推入redis

理想情况下,它应该这样发生:

  1. 数据库更新发生
  2. 数据在redis中被清除
  3. 数据被推入redis
  4. 请求进来并查询更新的redis缓存

清除和更新操作如何在 redis 中作为一个块发生?

标签: mongodbspring-bootredisspring-data-redis

解决方案


Redis 支持一种事务。这完全符合您的需求。

事务中的所有命令都被序列化并按顺序执行。在 Redis 事务的执行过程中服务于另一个客户端发出的请求永远不会发生。这保证了命令作为单个隔离操作执行。

使用该MULTI命令输入 Redis 事务。此时用户可以发出多个命令。Redis 不会执行这些命令,而是将它们排队。所有命令都执行一次EXEC

伪代码:

> MULTI
OK
> redisTemplate.delete(BINDATA);
QUEUED
> redisTemplate.opsForHash().putAll(BINDATA, binDataItemMap);
QUEUED
> EXEC

推荐阅读