我正在使用Redis作为其后端的Java应用程序。随着应用程序的增长,我们已经达到了我们需要在Redis中处理迁移(类似于迁移的东西?)的程度。当然Redis是无模式的,但在任何合理大小的项目中,你不可避免地最终会在redis中实现自己的抽象。
例如,假设我们有一个像
这样的键值对redis:6379> get myapp:user:123
"Alice"
但我们可能会在几个月后决定将抽象更改为
redis:6379> get myapp:user:123:name
"Alice"
或许我们想要保留旧的密钥格式,但是将值更改为redis哈希,或者更改为序列化的json字符串等。
问题是更改代码以创建和期望新格式的密钥很容易,但更新预先存在的数据更加困难。例如我们可以这样做,以便用
之类的东西保存新用户redis:6379> set myapp:user:124:name Bob
然后我们会有两种不同格式的数据:
redis:6379> get myapp:user:124:name
"Bob"
redis:6379> get myapp:user:123:name
(nil)
redis:6379> get myapp:user:123
"Alice"
是否有处理此问题的最佳做法?是否有任何好的工具,或者我们是否完全以错误的方式接近这个?