Spring RedisTemplate:使用与多个RedisTemplate相同的键来存储不同的值

时间:2014-04-03 10:37:09

标签: spring spring-mvc redis

我是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 个答案:

答案 0 :(得分:1)

实际上Redis是key/value商店,如果您对同一商店使用相同的key,则只需使用新值覆盖旧值。如果真正的Redis服务器是相同的,那么RedisTemplate s(甚至connectionFactory s)的数量并不重要。

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

对于不同的域对象,您应该有不同的kyes:例如studentsaddresses。 由于您要使用自己的密钥存储域对象,因此Map value似乎适合您。我的意思是在密钥students下,应存储Student s的地图,Address es的地图相同。

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