【问题标题】:Downside of many caches in spring春季许多缓存的缺点
【发布时间】:2018-11-29 05:14:15
【问题描述】:

由于limitation 无法基于部分键逐出条目,我正在考虑使用缓存名称作为我的部分键并逐出缓存中的所有(只有一个)条目的解决方法.例如,假设有 2 个键值对,如下所示:

"123@name1" -> 值1, "124@name2" -> 值2

理想情况下,在驱逐时,我想删除所有包含字符串“123”的键。但是,由于这不受支持,我正在考虑的解决方法是:

“123”缓存:“name1”-> value1

“124”缓存:“name2”-> value2

然后在驱逐时,我会简单地指定删除“123”缓存中的所有键

当然,这样做的缺点是会有很多不同的缓存。这有任何性能损失吗?

通过阅读this,Redis 似乎至少只使用缓存名称作为前缀。所以它不会在它下面创建多个单独的缓存。但我想验证一下我的理解。

如果有帮助,我也希望使用 Redis 作为我的底层缓存提供程序。

【问题讨论】:

  • Redis 方面没有惩罚。从 Spring(通过您提供的链接,我假设您正在谈论它)方面我不知道。
  • @Imaskar 您能否详细说明为什么 Redis 方面没有处罚?是不是如上所示缓存名只是前缀?
  • 我的意思是缓存的值将只是 Redis 中的键,而 Redis 中的键检索是恒定的时间。 spring-data-redis 使用了多少技术密钥我不知道,现在无法检查。太忙了,抱歉。
  • 看看redisTemplate.opsForHash().put(cache_name, cache_key, data)。这就是@DhruvPathak 答案的 p1 所暗示的。

标签: spring caching redis


【解决方案1】:

您可以使用几种方法来克服这个问题:

  1. 使用分组data structures 像集合、排序集合和散列:它们中的每一个都支持非常多的成员元素。所以你可以使用它们来存储你的缓存项,并进行相关的查找。但是,与直接键值查找相比,这种查找的性能差异(非常小)。 一旦你想驱逐一组相似类型的缓存键,你只需从 redis 中删除该数据结构键。

  2. 使用 redis 数据库编号:您需要编辑 redis.conf 以增加可能的最大 redis 数据库编号。 Redis 数据库只是提供键值对所在的命名空间的数字。要对相似的项目进行分组,您可以将它们放在相同的数据库编号中,并在您想要刷新该组键时使用单个命令清空数据库。 这里需要注意的是,虽然您可以使用相同的 redis 连接,但您必须通过 redis SELECT 命令切换数据库

【讨论】:

  • 克服什么?
  • 克服基于部分/模式的多个键的驱逐
  • 分组数据结构在存储和检索缓存方面如何工作?例如,假设键“123”指向缓存中的一个集合。我将如何注释我的方法以指示我的方法的结果需要添加到这个集合中(而不是替换它,这将是默认行为)
  • 所有分组的数据结构都支持对其中的元素进行键查找
  • 除非你不能为元素单独设置过期时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多