Spring RedisTemplate:使用相同的键在多个RedisTemplate中存储不同的值

5

我是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) redisTemplate1.opsForHash().get("KEY1", 1);

但是,不幸的是它引发了一个异常。

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

所以,我的问题是:

  • 是否可以使用多个Redis模板?
  • 如果是,我可以使用相同的键(每个模板都唯一)存储不同类型的数据并访问使用该模板和键存储的相同数据吗?
  • 如果不行,有哪些替代方法可以执行相同的操作?

提前致谢。

1个回答

2
实际上,Redis是一个键/值存储,如果您为同一存储使用相同的键,则只会用新值覆盖旧值。无论您拥有多少个RedisTemplate(甚至connectionFactory),如果真正的Redis服务器相同,这都没有关系。
现在如何帮助您完成任务:
您应该为不同的域对象使用不同的键:例如,学生,地址。 由于您将使用它们自己的键存储域对象,因此看起来像映射值对于您很重要。我的意思是,在键“students”下应存储“Student”的映射,对于“Address”也是如此。
然而,实际上您正在为两个域使用相同的键。 所以,答案是:这是因为您从两个RedisTemplate使用相同的Redis。

非常感谢您的回复。但是我们可以定义多个存储吗?如果可以,怎么做? - Ashvin Kanani
你的意思是在不同的域名下使用相同的“key”,但是有多个Redis服务器吗?是的,这是可能的:只需为新的Redis创建一个新的“connectionFactory”和相应的“RedisTemplate”。不过这似乎是一个新问题。 - Artem Bilan
不,我的意思是同一个 Redis 服务器和不同的后端服务器,可能具有相同的ID(每个表从1开始)。我读到过可以使用类似 'student:{id}'、'address:{id}' 等键来实现。我仍在寻找解决方案。 - Ashvin Kanani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接