spring-boot-starter-redis学习笔记

xiaoxiao2021-02-28  122

个人笔记仅供参考。

1、spring data redis推荐jedis,jedis是redis的java客户端。

<dependency> <groupId>org.springframework.boot</groupId><!-- 会附带引进jedis的包 --> <artifactId>spring-boot-starter-redis</artifactId> </dependency>

2、 RedisConnectionFactory

spring data redis连接到redis通过RedisConnectionFactory来获得有效的RedisConnection。RedisConnection负责建立和处理和redis后端通信。RedisConnection提供getNativeconnection返回用来通信的底层connection。

3、RedisTemplate

spring data redis支持低层次的通过连接器connector连接到Redis,支持高层次的友好的模板类RedisTemplate,RedisTemplate是建立在低级别的connection基础之上。RedisConnection接收或返回字节数组需要自身处理连接,比如关闭连接,而RedisTemplate负责处理串行化和反串行化,并且管理对连接进行管理。RedisTemplate提供操作视图,比如(Bound)ValueOperations,(Bound)ListOperations,(Bound)SetOperations,(Bound)ZSetOperations,(Bound)HashOperationsRedisTemplate是线程安全的,能够用于多个实例中。

RedisTemplate默认选择java-based串行化,也可以切换为其它的串行化方式,或者设置enabledDefaultSerializerfalse或者设置串行化器为null,则RedisTemplateraw byte arrays表示数据。其它序列化方式有protocol bufferJSON,带有递归的二进制字节流的方式等。

StringRedisTemplateRedisTemplate的唯一子类。

RedisTemplate默认定义了两个常用的序列化类

private RedisSerializer<?> defaultSerializer = newJdkSerializationRedisSerializer();

以及   private RedisSerializer<String> stringSerializer = newStringRedisSerializer();

4、序列化

在未配置序列化方式前,采用

redisTemplate.opsForValue().set(key, value); 得到的key和value将都是被序列化后的数字或符号,如

解决这个问题就需要将key和value序列化,如果是xml配置的

我们直接注入官方给定的keySerializer,valueSerializer,hashKeySerializer即可,那么使用注解的话我们需要自己编写RedisCacheConfig配置类

缓存主要有几个要实现的类:

1、CacheManager缓存管理器;

2、具体操作实现类;

3、CacheManager工厂类(这个可以使用配置文件配置的进行注入,也可以通过编码的方式进行实现);

4、缓存key生产策略(当然Spring自带生成策略,但是在Redis客户端进行查看的话是系列化的key,对于我们肉眼来说就是感觉是乱码了,这里我们先使用自带的缓存策略)。

/** * 缓存管理(注解用) * @author Administrator */ @Configuration @EnableCaching//启用缓存的意思 public class CacheConfig extends CachingConfigurerSupport{ /** * 自定义key. 这个可以不用 * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。 */ /* @Override public KeyGenerator keyGenerator() { System.out.println("RedisCacheConfig.keyGenerator()"); returnnew KeyGenerator() { @Override public Object generate(Object o, Method method, Object... objects) { // This will generate a unique key of the class name, the method name //and all method parameters appended. StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()); sb.append(method.getName()); for (Object obj : objects) { sb.append(obj.toString()); } System.out.println("keyGenerator=" + sb.toString()); returnsb.toString(); } }; } */ @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager rcm = new RedisCacheManager(redisTemplate); /* //设置缓存过期时间 // rcm.setDefaultExpiration(60);//秒 //设置value的过期时间 Map<String,Long> map=new HashMap(); map.put("test",60L); rcm.setExpires(map);*/ return rcm; } /** * RedisTemplate配置 * @param factory * @return */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); //定义key序列化方式 //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要 //定义value的序列化方式 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // template.setKeySerializer(redisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }

转载请注明原文地址: https://www.6miu.com/read-50698.html

最新回复(0)