如何配置Spring Data KeyValue以Redis作为持久化存储?
别担心,你完全不用自己手动实现Map!你的思路其实是对的,Spring Data KeyValue确实可以和Spring Data Redis配合使用,借助Spring Data Redis提供的适配器,就能让你的应用保持对键值存储类型的独立性,同时用上Redis做持久化。下面一步步给你讲清楚怎么配置:
1. 添加必要的依赖
首先要把Spring Data KeyValue、Spring Data Redis以及Jedis客户端的依赖加到项目里(以Maven为例):
<dependencies> <!-- Spring Data KeyValue --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-keyvalue</artifactId> <version>你的版本号</version> </dependency> <!-- Spring Data Redis --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>你的版本号</version> </dependency> <!-- Jedis 客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>你的版本号</version> </dependency> </dependencies>
2. 配置Redis连接工厂
接下来需要配置Redis的连接工厂,Spring Data Redis已经封装了Jedis的连接逻辑,你只需要定义一个JedisConnectionFactory的Bean即可:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; @Configuration public class RedisConfig { @Bean public JedisConnectionFactory jedisConnectionFactory() { // 这里可以根据你的Redis实例配置主机、端口、密码等 JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setHostName("localhost"); factory.setPort(6379); // 如果你的Redis有密码,打开下面这行 // factory.setPassword("your-redis-password"); factory.afterPropertiesSet(); return factory; } }
3. 配置KeyValueTemplate与Redis适配器
Spring Data Redis提供了RedisKeyValueAdapter,它会把Spring Data KeyValue的操作转换成Redis的操作,我们需要把这个适配器注入到KeyValueTemplate中:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.keyvalue.core.KeyValueTemplate; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisKeyValueAdapter; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class KeyValueConfig { @Bean public KeyValueTemplate keyValueTemplate(RedisConnectionFactory connectionFactory) { RedisKeyValueAdapter adapter = new RedisKeyValueAdapter(redisTemplate(connectionFactory)); return new KeyValueTemplate(adapter); } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 配置序列化器,避免Redis里存的是乱码 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } }
4. 启用MapRepositories并指定模板
在你的配置类或者启动类上添加@EnableMapRepositories注解,指定我们刚才配置的keyValueTemplate:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.keyvalue.repository.config.EnableMapRepositories; @SpringBootApplication @EnableMapRepositories(keyValueTemplateRef = "keyValueTemplate") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
5. 编写并使用Repository
现在你可以像使用普通Spring Data KeyValue Repository一样编写你的数据访问层,完全不用关心底层是Redis还是默认的HashMap:
import org.springframework.data.keyvalue.repository.KeyValueRepository; import org.springframework.stereotype.Repository; @Repository public interface YourEntityRepository extends KeyValueRepository<YourEntity, String> { // 可以添加自定义查询方法,Spring Data会自动实现 }
关于你提到的Jedis的疑问
你不用直接操作Jedis的类,也不用自己实现Map接口。Spring Data Redis已经封装了Jedis的操作,RedisKeyValueAdapter会帮你把Spring Data KeyValue的抽象操作转换成Redis的命令,Jedis只是作为底层的客户端来执行这些命令而已。
这样配置之后,你的应用代码完全依赖Spring Data KeyValue的抽象接口,未来如果要切换到其他键值存储(比如Couchbase),只需要替换对应的适配器和配置,业务代码完全不用修改,完美实现了你想要的存储独立性。
内容来源于stack exchange

