【问题标题】:is there option provided by redis to do partial updates to cache objectsredis 是否提供了对缓存对象进行部分更新的选项
【发布时间】:2020-08-08 11:39:12
【问题描述】:

我使用 JCA(java 缓存 api)将数据存储在 redis 中,其中键是字符串,值是对象,它是 JSON 字符串。 我需要对缓存值执行部分更新,而不是使用 key 检索缓存值,然后修改属性并使用最新的缓存值执行 put 操作

{
  "attribute1" : "value1",
   "attribute2 " : [
  {
   "attribute3" : "value3"
  }
]
}

以上是示例 json 格式。如上所述,是否可以将 attribute1 的值从 value1 更新为 value2 而无需使用 redis 中的键获取缓存值

【问题讨论】:

    标签: redis spring-data-redis redis-cluster redisson jcache


    【解决方案1】:

    假设您使用的是JCache API(即JSR-107),您可以使用Cache#invoke(K key, EntryProcessor<K,V,T> entryProcessor, Object... arguments) 来执行就地更新,而不是get-then-put。根据EntryProcessor javadocCache#invoke是在key上原子执行的,所以不用担心并发修改同一个缓存条目。

    【讨论】:

    • 我的要求是更新 POJO 的特定属性。我可以更新 POJO 的属性或 json 中的属性吗?将“员工”视为缓存名称,其键为员工 ID,值为员工(ID,姓名,年龄)POJO。是否可以在不使用整个 POJO 的情况下单独使用员工 ID 修改员工年龄
    • EntryProcessorMutableEntry 上运行,它具有用于获取映射到您正在操作的键的现有值并将其替换为新值的 API 方法。如果您的EntryProcessor 知道新的属性值,那么您的EntryProcessor 可以获取现有值、更新感兴趣的属性并设置值。
    【解决方案2】:

    您可以使用 Lua 脚本,以便使用 CJSON Lua 库更新项目。我在How to nest a list into a structure in Redis to reduce top level?上分享了一个类似的例子

    不熟悉 JCA,因此不确定您的客户是否可以轻松发送 EVAL 命令。

    【讨论】:

    • 我正在尝试执行 HSET 命令,但由于我使用带有 JCA 的 Redisson 客户端,它不支持运行本机命令,而是提供 RMap.fastput()。但它不符合我的目的
    • 我可以使用 HSET 运行 HSET 命令,如下所示conn.sync(StringCodec.INSTANCE, RedisCommands.HSET, "testmap", "age", "2"); 这将有助于将具有键“age”的缓存名称“testmap”的值覆盖为新值 2 但我的目的是如果它是一个 json 或 POJO 而不是 string ,我可以更新 POJO 的属性或 json 中的属性吗 考虑“testmap”的键为员工 id,值为员工(id,姓名,年龄)。是否可以单独使用 HSET 修改员工的年龄
    • 在 Redis4.0 之前,在 Redis 内部处理 JSON 数据的唯一方法是通过 cjson 模块使用 Lua 脚本。这部分解决了 JSON 问题,尽管它仍然是一个瓶颈并添加了学习的额外负担 Lua.Redis4.0+ 有能力使用模块。ReJSON 是一个提供特殊数据类型和直接操作命令的模块。ReJSON 以二进制格式存储数据,消除了 JSON 的存储开销,提供更快无需反序列化/重新序列化即可访问元素。redislabs.com/redis-best-practices/data-storage-patterns/…
    • 如果您可以执行 RedisCommands.HSET,您可以执行 RedisCommands.EVAL_OBJECT 或 RedisCommands.EVAL_BOOLEAN(其他版本可用)。我鼓励你尝试 Lua,它很简单。使用我在stackoverflow.com/questions/59979347/… 中提供的示例。 Lua 是 Redis 的事务性语言。 Lua 之于 Redis 就像 PL/SQL 或 T-SQL 之于 SQL DB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多