当前位置: 首页 > 知识库问答 >
问题:

RedisTemplate按值获取哈希键

仲孙绍元
2023-03-14

我在Spring和Redis上都很新。我想知道有没有办法按价值得到钥匙?

例如,我希望获得具有给定文件哈希和内容的图像类型文件的get the KEY。我是这样做的:

private String getKeyByVal(final String givenFileHash, final String content) {
    // get all keys that starts with "image"
    Set<String> keys = redisTemplate.keys("image*");
    if (keys != null) {
        for (String key : keys) {
            Map<Object, Object> val = redisTemplate.opsForHash().entries(key);
            // check if the value of KEY is equal to the given fileHash
            if (val.get("fileHash").equals(givenFileHash) && val.get("content").equals(content)) {
               return key;
            }
        }
    }
}

然而,我被告知这是相当昂贵的,因为我要获得所有以“image”开头的键,并手动检查所有这些键。

现在我在想,也许如果我能按价值得到钥匙会好得多。以便更容易得到它的所有属性。在Redis可能吗?

共有1个答案

梁丘权
2023-03-14

不,这在Redis是不可能的。但是,您可以同时存储一个反向映射,如下所示:

    fileHash -> "{typeOfFile}:{id}:{filename}"

此解决方案假定文件哈希是唯一的。如果哈希不是唯一的,那么可以用相同的哈希存储一组ID,检索每个ids的内容并进行比较。仍然比原来的解决方案快很多。

 类似资料:
  • hget key field 获取指定的hash field hmget key filed1....fieldN 获取全部指定的hash filed hmset key filed1 value1 ... filedN valueN 同时设置hash的多个field

  • 我想在命令行上这样做,所以像这样的事情会很好: 上面的方法当然不适合散列。所以最后我需要打电话 以自动化的方式。

  • hvals key 返回hash的所有value

  • 问题内容: 我对HashMap有一个奇怪的问题。 有多个线程访问同一哈希图(不是线程安全的)。 有时,过程陷入困境。 当我检查线程堆栈时,我看到许多线程处于状态: 请注意,这种情况很少发生。并且不能按需复制。 为什么会卡住? 哈希图上没有同步。 键是字符串 问题答案: 有多个线程访问同一哈希图(不是线程安全的)。 听起来好像您在 没有 适当同步的线程环境中使用它。您遇到的问题是内存已损坏,因此线程

  • 我正在使用BCryptPasswordEncoder使用spring security。现在对于更改密码,我需要做的是比较用户提供的现有密码和DB值。 但是由于salt是由动态生成的,所以每次我从下面的方法得到不同的散列值,并且不一定会与我的DB值匹配。 解决这个问题的办法是什么?我能识别用于我的DB字段的盐并在上面的方法中使用相同的盐吗?

  • hgetall 返回hash的所有filed和value