使用的是maven工程

springBoot集成redis默认使用的是注解,在官方文档中只需要2步;

1、在pom文件中引入即可

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-redis</artifactId>
  4. </dependency>

2、编写一个CacheService接口,使用redisCacheServiceImpl实现这个接口

官网的原文是这样的,也就是说,提供三个接口注入和你自己实现的其他实现类,默认是本地端口号为6379的redis

  1. You can inject an auto-configured RedisConnectionFactory, StringRedisTemplate or vanilla RedisTemplate instance as you would any other Spring Bean.By default the instance will attempt to connect to a Redis server using localhost:6379:

我自己的redisCacheServiceImpl这样写的

  1. @Service
  2. public class RedisCacheServiceImpl<K,V> implements CacheService<K,V> {
  3. @Autowired
  4. RedisTemplate<K, V> redisTemplate;
  5.  
  6. public void set(K key, V value) {
  7. redisTemplate.opsForValue().set(key, value);
  8. }
  9. }

ok,这样我们即可使用springBoot默认提供的redis服务,但是这样有几个问题,1序列化,我们set到redis服务器中的key是这样的

我们直接在cli中get key发现,在redisClent中发现是一堆看不懂的字符,解决这个问题就需要将key和value序列化,如果是xml配置的

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

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

1、CacheManager缓存管理器;

2、具体操作实现类;

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

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

  1. /**
  2. * 缓存管理(注解用)
  3. * @author Administrator
  4. */
  5. @Configuration
  6. @EnableCaching//启用缓存的意思
  7. public class CacheConfig extends CachingConfigurerSupport{
  8.  
  9. /**
  10. * 自定义key. 这个可以不用
  11. * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。
  12. */
  13. /* @Override
  14. public KeyGenerator keyGenerator() {
  15. System.out.println("RedisCacheConfig.keyGenerator()");
  16. returnnew KeyGenerator() {
  17. @Override
  18. public Object generate(Object o, Method method, Object... objects) {
  19. // This will generate a unique key of the class name, the method name
  20. //and all method parameters appended.
  21. StringBuilder sb = new StringBuilder();
  22. sb.append(o.getClass().getName());
  23. sb.append(method.getName());
  24. for (Object obj : objects) {
  25. sb.append(obj.toString());
  26. }
  27. System.out.println("keyGenerator=" + sb.toString());
  28. returnsb.toString();
  29. }
  30. };
  31. }
  32. */
  33.  
  34. @Bean
  35. public CacheManager cacheManager(RedisTemplate redisTemplate) {
  36. RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
  37. /* //设置缓存过期时间
  38. // rcm.setDefaultExpiration(60);//秒
  39. //设置value的过期时间
  40. Map<String,Long> map=new HashMap();
  41. map.put("test",60L);
  42. rcm.setExpires(map);*/
  43. return rcm;
  44. }
  45. /**
  46. * RedisTemplate配置
  47. * @param factory
  48. * @return
  49. */
  50. @Bean
  51. public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
  52. StringRedisTemplate template = new StringRedisTemplate(factory);
  53. //定义key序列化方式
  54. //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
  55. //定义value的序列化方式
  56. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  57. ObjectMapper om = new ObjectMapper();
  58. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  59. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  60. jackson2JsonRedisSerializer.setObjectMapper(om);
  61.  
  62. // template.setKeySerializer(redisSerializer);
  63. template.setValueSerializer(jackson2JsonRedisSerializer);
  64. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  65. template.afterPropertiesSet();
  66. return template;
  67. }
  68.  
  69. }

当数据存储到redis中时候key和value都是通过spring serializer进行序列化的,

RedisTemplate, spring默认会使用jdk序列化,如果使用jdk序列化,model模型必须实现Serializable且要有一个空的构造器,

StringRedisTemplate 默认是使用StringSerializer,同时springData还提供了其他的序列化方式,如下:

GenericToStringSerializer:使用Spring转换服务进行序列化;
JacksonJsonRedisSerializer:使用Jackson 1,将对象序列化为JSON;
Jackson2JsonRedisSerializer:使用Jackson 2,将对象序列化为JSON;
JdkSerializationRedisSerializer:使用Java序列化;
OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化;
StringRedisSerializer:序列化String类型的key和value。实际上是String和byte数组之间的转换

ok;基本解决了相关的序列化问题;代码有参考!

【springBoot】springBoot集成redis的key,value序列化的相关问题的更多相关文章

  1. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  2. SpringBoot项目集成Redis

    一.在pom文件中添加依赖 <!-- 集成redis --> <dependency> <groupId>org.springframework.boot</ ...

  3. springboot 2 集成 redis 缓存 序列化

    springboot 缓存 为了实现是在数据中查询数据还是在缓存中查询数据,在application.yml 中将mybatis 对应的mapper 包日志设置为debug . spring: dat ...

  4. SpringBoot中集成redis

    转载:https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html 不是使用注解而是代码调用 需要在springbo ...

  5. SpringBoot整合集成redis

    Redis安装:https://www.cnblogs.com/zwcry/p/9505949.html 1.pom.xml <project xmlns="http://maven. ...

  6. Springboot Mybatis 集成 Redis

    版本信息 Sprintboot 采用 2.1.7 RELEASE 版本 Mybatis 采用 2.1.0 Redis 采用 2.1.6.RELEASE Redis 的使用 添加 Redis 依赖 &l ...

  7. SpringBoot监听redis过期key

    开启过期监听 vim /etc/redis.conf 取消notify-keyspace-events Elg的注释 pom.xml 添加: <dependency> <groupI ...

  8. springboot 集成Redis一主二从三哨兵

    1.Centos7 Redis一主二从三哨兵配置 Redis一主二从三哨兵环境搭建 2.接入过程 与集成redis单机不同的是jedis相关的配置做了修改,JedisPool换成了JedisSenti ...

  9. Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析

    Springboot鼓励零配置的方式,帮你做好大部分重复劳动的事,好到不能再好:具体的Redis安装方法和Springboot集成Redis方法,可以去搜索相关文章或参考该文章http://www.c ...

随机推荐

  1. R中NA和NaN的区别

    NA表示的是缺失数据,missing data NaN表示无意义的数据,Not a Number, Inf-Inf Inf表示正无穷大 -Inf表示负无穷大

  2. 关于 System.IO.FileAttributes 的 Reparse Points

    关于Reparse Points找到下面的解释,要是能有更进一步的解释说明就更好了 Reparse Points其实是一个用户自定义的数据集合,它可以包含在一个文件或目录中.这种格式的数据能够被特定的 ...

  3. 349. Intersection of Two Arrays

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...

  4. 资源预加载 Preload

    当提到前端性能优化时,我们首先会联想到文件的合并.压缩,文件缓存和开启服务器端的 gzip 压缩等,这使得页面加载更快,用户可以尽快使用我们的 Web 应用来达到他们的目标. 资源预加载 是另一个性能 ...

  5. Oracle数据库Linux下的导入IMP

    和相关篇的EXP相对应的用了如下的导入方法. [oracle@localhost ~]$ imp Import: Release 11.2.0.1.0 - Production on Fri Sep ...

  6. oracle锁机制

    1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据 库执行请求,T2代表另一个请求,也可以理解为T1为 ...

  7. Codeforces Round #143 (Div. 2)

    A. Team 模拟. B. Magic, Wizardry and Wonders 可以发现\[d=a_1-a_2+a_3-a_4+\cdots\] 那么有\(odd=\lfloor \frac{n ...

  8. POJ-2486 Apple Tree (树形DP)

    题目大意:一棵点带权有根树,根节点为1.从根节点出发,走k步,求能收集的最大权值和. 题目分析:从一个点向其某棵子树出发有三种可能的情况: 1.停留在那棵子树上: 2.再回到这个点: 3.经过这个点走 ...

  9. HDU-1561 The more, The Better (树形DP+分组背包)

    题目大意:给出一片森林,总共有n个点,并且都有权值.从中选出m个,使权值和最大.其中,选某个节点之前必须先选其父节点. 题目分析:给所有的树都加一个共同的权值为0的根节点,使森林变成一棵树.定义状态d ...

  10. [CTSC 2012][BZOJ 2806]Cheat

    真是一道好题喵~ 果然自动机什么的就是要和 dp 搞基才是王道有木有! A:连 CTSC 都叫我们搞基,果然身为一个程序猿,加入 FFF 团是我此生最明智的选择.妹子什么闪边去,大家一起来搞基吧! Q ...