【问题标题】:Spring RedisTemplate : use same key with multiple RedisTemplate to store different valuesSpring RedisTemplate:使用相同的键和多个 RedisTemplate 来存储不同的值
【发布时间】:2014-05-15 03:03:45
【问题描述】:

我是 Redis 新手,想用我现有的 Spring 应用程序来实现它。

我的问题是使用具有相同键的不同 redisTemplate 来存储不同类型的值。

例如

我在 spring 中定义了 redisTemplate1 和 redisTemplate2 bean,比如。

<bean id="redisTemplate1" class ="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref ="connectionFactory" />

<bean id="redisTemplate2" class ="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref ="connectionFactory" />

在我的服务的 java 文件中,我使用这两个 redis 模板创建了两个不同的数据结构。

@Autowired
@Qualifier(value = "redisTemplate1")
private RedisTemplate<String, Student>       redisTemplate1;

@Autowired
@Qualifier(value = "redisTemplate2")
private RedisTemplate<String, Address>       redisTemplate2;

并且,使用以下模式来存储数据。

redisTemplate1.opsForHash().put("KEY1", student.getId(), student);
redisTemplate2.opsForHash().put("KEY1", address.getId(), address);

情况是,我的每个表的主键都以 1 开头。所以 1 是否有 Student 和 Address 的主键。

我正在使用下面的行从数据存储中获取学生。

(Student) redisTemplate1.opsForHash().get("KEY1", 1);

但是,不幸的是它会产生异常。

java.lang.ClassCastException: com.redis.model.Address cannot be cast to com.redis.model.Student

所以,我的问题是,

  • 是否可以使用多个 redis 模板?
  • 如果是,我可以使用相同的密钥(每个模板唯一)来存储不同类型的数据并访问使用该模板和密钥存储的相同数据吗?
  • 如果不是,执行相同操作的替代方法是什么?

提前致谢。

【问题讨论】:

    标签: spring spring-mvc redis


    【解决方案1】:

    实际上 Redis 是一个 key/value 存储,如果您对同一存储使用相同的 key,您只需用新值覆盖旧值。如果真正的 Redis 服务器相同,那么您拥有多少 RedisTemplates(甚至是 connectionFactorys)并不重要。

    现在如何帮助您完成任务:

    对于不同的域对象,您应该有不同的kyes:例如students,addresses。 由于您要使用自己的密钥存储域对象,因此看起来 Map value 适合您。我的意思是在键students 下应该存储Students 的映射,Addresses 也是如此。

    但是,实际上,您是这样做的,但您对两个域使用相同的 key。 所以,你的答案是:那是因为你使用的是来自 RedisTemplates 的相同 Redis。

    【讨论】:

    • 非常感谢您的回复。但是我们可以定义多个商店吗?如果是,如何?
    • 你的意思是几个 Redis 服务器,但不同域的 key 相同?是的,这是可能的:新的 Redis 只需一个新的 connectionFactory 和它的 RedisTemplate。不过,这似乎是一个新问题。
    • @artem-bilan 不,我的意思是相同的 Redis 服务器和不同的 behttp://stackoverflow.com/users/2756547/ans,它们可能具有相同的 id(每个表从 1 开始)。我读到了一些可以通过使用“学生:{id}”、“地址:{id}”等键来实现的地方。我仍在寻找解决方案。
    猜你喜欢
    • 2013-04-05
    • 2014-04-01
    • 1970-01-01
    • 2017-12-28
    • 2020-07-05
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多