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

Ash*_*ani 5 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" />
Run Code Online (Sandbox Code Playgroud)

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

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

@Autowired
@Qualifier(value = "redisTemplate2")
private RedisTemplate<String, Address>       redisTemplate2;
Run Code Online (Sandbox Code Playgroud)

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

redisTemplate1.opsForHash().put("KEY1", student.getId(), student);
redisTemplate2.opsForHash().put("KEY1", address.getId(), address);
Run Code Online (Sandbox Code Playgroud)

情况是,我有每个表以1开头的主键.所以1是学生和地址的主键.

我正在使用下面的行让学生从数据存储中回来.

(Student) redisTemplate1.opsForHash().get("KEY1", 1);
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是它产生了一个例外.

java.lang.ClassCastException: com.redis.model.Address cannot be cast to com.redis.model.Student
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,

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

提前致谢.

Art*_*lan 2

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

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

kyes对于不同的域对象,您应该有不同的:例如studentsaddresses. 由于您将使用域对象自己的密钥来存储域对象,因此它看起来适合Map value您。我的意思是在 key 下应该存储 sstudents的映射Student,对于 es 也是如此Address

然而,实际上,您确实这样做了,但是您对两个域都使用了相同的内容key。所以,答案是:那是因为您在两个RedisTemplates 中使用相同的 Redis。