mongodb - 如何在以下场景中利用 redis 和 mongo?
问题描述
每当 mongodb 发生更改时,我都会使用更改流来使 redis 缓存保持最新。每当更改数据库时,我都会分两步更新缓存:
- 清除缓存
- 从头开始加载数据
代码:
redisTemplate.delete(BINDATA);
redisTemplate.opsForHash().putAll(BINDATA, binDataItemMap);
问题是在 prod 中这个设置可能很危险。由于 redis 是单线程的,因此事件有可能在多容器应用程序中以下列方式发生:
- 数据库更新发生
- 数据在redis中被清除
- 请求进来并查询一个空的redis缓存
- 数据被推入redis
理想情况下,它应该这样发生:
- 数据库更新发生
- 数据在redis中被清除
- 数据被推入redis
- 请求进来并查询更新的redis缓存
清除和更新操作如何在 redis 中作为一个块发生?
解决方案
Redis 支持一种事务。这完全符合您的需求。
事务中的所有命令都被序列化并按顺序执行。在 Redis 事务的执行过程中服务于另一个客户端发出的请求永远不会发生。这保证了命令作为单个隔离操作执行。
使用该
MULTI
命令输入 Redis 事务。此时用户可以发出多个命令。Redis 不会执行这些命令,而是将它们排队。所有命令都执行一次EXEC
。
伪代码:
> MULTI
OK
> redisTemplate.delete(BINDATA);
QUEUED
> redisTemplate.opsForHash().putAll(BINDATA, binDataItemMap);
QUEUED
> EXEC
推荐阅读
- postgresql - 使用 sql 语言的 PostgreSQL 过程中的 IF 语法错误
- laravel - Laravel - 1215 无法添加外部约束
- c# - CarouselView 中的视频问题
- wordpress - WordPress 如何在管理帖子/编辑侧栏上添加另一个带有自定义元框的选项卡?
- javascript - onClick 处理程序以更改元素的颜色
- apache-spark - 如何在 spark rdd 中读取 zip 文件中的分隔文件
- javascript - 无法使用 useState 挂钩设置数组
- r - 使用带有嵌套 GBM 的 PDP 和 map 函数
- node.js - 我怎样才能让lottie动画与nodejs一起工作
- postgresql - 删除联结表外键引用的唯一约束