首页 > 解决方案 > Redisson getAtomicLong - 如果密钥不存在怎么办?

问题描述

我正在使用 Redisson 在 Java 中构建缓存实现。我想用它来缓存一个数值。所以我像这样使用 getAtomicLong() :

RAtomicLong userNumber = redissonClient.getAtomicLong("my-key");
long value = userNumber.get();

但是,文档对这里发生的事情的描述不是很清楚,所以我有几个问题:

  1. 假设缓存中尚不存在“my-key”。getAtomicLong() 返回什么?
  2. 如果“my-key”不存在,userNumber.get() 返回什么?

标签: redisredissonatomic-long

解决方案


我写了一个愚蠢的 Java 示例程序并做了一些实验,所以让我回答你实际提出的问题和我认为你试图提出的问题。

假设缓存中尚不存在“my-key”。getAtomicLong() 返回什么?

-的一个实例,RAtomicLong因为您将来可能会对incrementAndGet键/值做一些事情(比如或其他事情)。

如果“my-key”不存在,userNumber.get() 返回什么?

零。是的,不是null,是的,不是例外,只是 0。这在我的测试程序中相当令人惊讶。

关于Reddison API真正有趣的部分是它非常依赖于原子的东西——如果你可以从多个线程更新一个值,那就太好了——但似乎没有记录最简单的用例:我想从 Redis 读取或写入它不是数字/不是原子/我的线程或数据的结构不会相互干扰。

这似乎是雷迪森的RBucket东西。

如果对象不在 Redis 中,那返回 a 。null

         RBucket<String> back = client.getBucket("foo");
         String value = back.get();

         if (value == null) {
             System.out.println("NOPE, NULL");
         } else {
             System.out.println(value);
         }

我真的希望能够更好地记录这一点 - 回首往事,我将“桶”视为东西的容器,但有一段时间我认为它意味着一些高级 Redis 模式,而不是“通用类型值的持有者”。

(如果你真的想要花哨的东西,上面有一个很棒的 baeldung artigle)。


推荐阅读