我是 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。
(Student) redisTemplate1.opsForHash().get("KEY1", 1);
但是,不幸的是它产生了一个异常。
java.lang.ClassCastException: com.redis.model.Address cannot be cast to com.redis.model.Student
所以,我的问题是,
- 是否可以使用多个 redis 模板?
- 如果是,我可以使用相同的 key (对于每个模板都是唯一的)来存储不同类型的数据并访问使用该模板和 key 存储的相同数据吗?
- 如果不能,执行相同操作的替代方案是什么?
提前致谢。
最佳答案
实际上,Redis 是一个key/value
存储,如果您对同一个存储使用相同的key
,您只需用新值覆盖旧值。如果真正的 Redis 服务器是相同的,那么您拥有多少 RedisTemplate
(甚至 connectionFactory
)并不重要。
现在如何帮助您完成任务:
对于不同的域对象,你应该有不同的kyes
:例如学生
,地址
。
由于您要使用自己的键存储域对象,因此 Map
value
看起来适合您。我的意思是在键 students
下应该存储 Student
的映射,对于 Address
也是如此。
实际上,无论您如何操作,但是您对两个域使用相同的 key
。
因此,答案是:那是因为您使用的是来自两个 RedisTemplate
的相同 Redis。
关于 Spring RedisTemplate : use same key with multiple RedisTemplate to store different values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835023/