前言
Redis是一种由C语言编写的,可基于内存也可基于持久化的Nosql数据库存储系统。Redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。
在Java中,操作Redis方案有很多,Jedis是较为流行的一种方案,但是在SpringBoot中默认使用的是Spring Data Redis。
1、开始集成
在SpringBoot项目中增加Redis依赖包:
org.springframework.bootspring-boot-starter-data-redisorg.apache.commonscommons-pool2
2、配置Redis
在SpringBoot的配置文件中增加配置项:
spring: redis: host: **.**.**.** password: ** pool: min-idle: 5 max-idle: 10
所能配置的信息,在自动配置的属性类RedisProperties中可查看:
private int database = 0; private String url; private String host = "localhost"; private String password; private int port = 6379; private boolean ssl; private int timeout; private RedisProperties.Pool pool; private RedisProperties.Sentinel sentinel; private RedisProperties.Cluster cluster;
此时,项目中已经集成了Spring Data Redis ,并且自动配置生效,自动注入了Redis操作类。可以在自动配置类RedisAutoConfiguration看到注入了redisTemplate和stringRedisTemplate
@Configuration protected static class RedisConfiguration{ protected RedisConfiguration(){ } @Bean @ConditionalOnMissingBean( name = {"redisTemplate"} ) public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException{ RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean({StringRedisTemplate.class})public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException{ StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } }
3、开始使用
我们可以在项目中注入这两个操作redis的类:
@Resource private RedisTemplate redisTemplate; @Resource private StringRedisTemplate stringRedisTemplate;
RedisTemplate和StringRedisTemplate提供了相同的方法,不同的是RedisTemplate可以操作任何类型,而StringRedisTemplate只能操作string类型,主要使用到的方法有:
opsForHash():返回对于Hash的操作类;
opsForList():返回对于列表List的操作类;
opsForSet():返回对于Set的操作类;
opsForValue():返回对于字符串String的操作类;
opsForZSet():返回对于ZSet的操作类;
针对具体数据类型的操作,相关的方法需要首先获取对应的数据类型,获取相应数据类型的操作方法是 opsForXXX
ValueOperations ops = redisTemplate.opsForValue();ops.set("key1", "value1"); // 设置缓存值Object k1 = ops.get("key1"); // 取出缓存值
4、序列化
RedisTemplate 中,key默认的序列化方案是JdkSerializationRedisSerializer,在生成的key中会添加一个前缀,而StringRedisTemplate,key的默认序列化方案是StringRedisSerializer,生成的key不会增加前缀。如果想RedisTemplate不添加前缀,可以修改序列化方案:
4.1、每次使用时修改序列化方案
redisTemplate.setKeySerializer(new StringRedisSerializer());
同样的对应value的序列化,我们也可以更改序列化方案:
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
4.2、统一修改序列化方案
如果在每次使用的时候都设置序列化方案,无疑是比较麻烦的事情,那么我们可以重写RedisTemplate,新建一个配置类,增加如下:
@Beanpublic RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer); return redisTemplate;}
你点的每个“在看”,我都当成了喜欢