【问题标题】:How to leverage redis and mongo in the following scenario?如何在以下场景中利用 redis 和 mongo?
【发布时间】:2021-04-19 19:38:42
【问题描述】:

每当 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 中的清除和更新操作如何作为一个块发生?

【问题讨论】:

    标签: mongodb spring-boot redis spring-data-redis


    【解决方案1】:

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

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

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

    伪代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多