文档章节

Springboot 2.0 - 集成redis

Java烂猪皮
 Java烂猪皮
发布于 2018/10/04 22:16
字数 1180
阅读 132
收藏 16

最近在入门SpringBoot,然后在感慨 SpringBoot较于Spring真的方便多时,顺便记录下自己在集成redis时的一些想法。

 

从springboot官网查看redis的依赖包

 

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

操作redis

 

/*
   操作k-v都是字符串的
 */
@Autowired
StringRedisTemplate stringRedisTemplet;

 /*
     操作k-v都是对象的
 */
@Autowired
RedisTemplate redisTemplate;

redis的包中提供了两个可以操作方法,根据不同类型的值相对应选择。

两个操作方法对应的redis操作都是相同的

stringRedisTemplet.opsForValue() // 字符串
 stringRedisTemplet.opsForList() // 列表
 stringRedisTemplet.opsForSet() // 集合
 stringRedisTemplet.opsForHash() // 哈希
 stringRedisTemplet.opsForZSet() // 有序集合

修改数据的存储方式

在StringRedisTemplet中,默认都是存储字符串的形式;在RedisTemplet中,值可以是某个对象,而redis默认把对象序列化后存储在redis中(所以存放的对象默认情况下需要序列化)

如果需要更改数据的存储方式,如采用json来存储在redis中,而不是以序列化后的形式。

1)自己创建一个RedisTemplate实例,在该实例中自己定义json的序列化格式(org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer)

// 这里传入的是employee对象(employee 要求可以序列化)
Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);

2)把定义的格式放进自己定义的RedisTemplate实例中

RedisTemplate<Object,Employee> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 定义格式
Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
// 放入RedisTemplate实例中
template.setDefaultSerializer(jackson2JsonRedisSerializer);

参考代码:

@Bean
 public RedisTemplate<Object,Employee> employeeRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException{
        RedisTemplate<Object,Employee> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory); 
        Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(jackson2JsonRedisSerializer);
        return template;
    }

原理:

@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    ) // 在容器当前没有redisTemplate时运行
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean // 在容器当前没有stringRedisTemplate时运行
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

如果你自己定义了RedisTemplate后并添加@Bean注解,(要在配置类中定义),那么默认的RedisTemplate就不会被添加到容器中,运行的就是自己定义的ReidsTemplate实例,而你在实例中自己定义了序列化格式,所以就会以你采用的格式定义存放在redis中的对象。

更改默认的缓冲

springboot默认提供基于注解的缓冲,只要在主程序类(xxxApplication)标注@EnableCaching,缓冲注解有

@Cachingable、@CachingEvict、@CachingPut,并且该缓冲默认使用的是ConcurrentHashMapCacheManager

当引入redis的starter后,容器中保存的是RedisCacheManager ,RedisCacheManager创建RedisCache作为缓冲组件,RedisCache通过操纵redis缓冲数据

在此我向大家推荐一个架构学习交流群。交流学习群号:478030634  里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

修改redis缓冲的序列化机制

在SpringBoot中,如果要修改序列化机制,可以直接建立一个配置类,在配置类中自定义CacheManager,在CacheManager中可以自定义序列化的规则,默认的序列化规则是采用jdk的序列化

注:在SpringBoot 1.5.6 和SpringBoot 2.0.5 的版本中自定义CacheManager存在差异

参考代码:

// springboot 1.x的版本
public RedisCacheManager employeeCacheManager(RedisConnectionFactory redisConnectionFactory){

    // 1、自定义RedisTemplate
    RedisTemplate<Object,Employee> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
    template.setDefaultSerializer(jackson2JsonRedisSerializer);

    // 2、自定义RedisCacheManager
    RedisCacheManager cacheManager = new RedisCacheManager(template);
    cacheManager.setUsePrefix(true); // 会将CacheName作为key的前缀

    return cacheManager;
}



// springboot 2.x的版本

/**
 * serializeKeysWith() 修改key的序列化规则,这里采用的是StringRedisSerializer()
 * serializeValuesWith() 修改value的序列化规则,这里采用的是Jackson2JsonRedisSerializer<Employee>(Employee.class)
 * @param factory
 * @return
 */
@Bean
public RedisCacheManager employeeCacheManager(RedisConnectionFactory redisConnectionFactory) {


RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
              .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) 
             .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<Employee>(Employee.class)));

        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();

        return cacheManager;
    }
tip:可以通过查看各版本的org.springframework.data.redis.cache.RedisCacheConfiguration去自定义CacheManager.

因为不同版本的SpringBoot对应的Redis版本也是不同的,所以要重写时可以查看官方是怎么定义CacheManager,才知道怎样去自定义CacheManager。

大家觉得文章对你还是有一点点帮助的,大家可以点击下方二维码进行关注。 《Java烂猪皮》 公众号聊的不仅仅是Java技术知识,还有面试等干货,后期还有大量架构干货。大家一起关注吧!关注烂猪皮,你会了解的更多.............. 

 

原文:https://www.cnblogs.com/LxyXY/p/9741921.html

© 著作权归作者所有

共有 人打赏支持
Java烂猪皮
粉丝 50
博文 30
码字总数 82549
作品 0
黄浦
私信 提问
Spring Boot学习笔记

多模块开发 [SpringBoot学习]-IDEA创建Gradle多Module结构的SpringBoot项目 RabbitMQ RabbitMQ 安装 linux安装RabbitMQ详细教程 Ubuntu 16.04 RabbitMq 安装与运行(安装篇) ubantu安装...

OSC_fly
2018/07/26
0
0
SpringBootBucket 2.0.4 发布,代号“傲娇的小二晶”

SpringBootBucket 自从1.0.0版本发布后就有好多人喜欢,目前码云上面star数量接近1.2k。上个月还收到了红薯签名的1000 star奖杯,这个我自己也觉得很惊讶。 由于SpringBoot 1.x官方将终止维护...

一刀
2018/09/16
1K
4
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
7.3K
17
崛起于Springboot2.X之集成单机Redis(14)

简介:单机redis+springboot,并不是jedis单机操作redis,jedis是需要另外的集成,下一篇博客会讲到。 1、添加pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId......

木九天
2018/07/15
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
2018/05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

07 分支管理 —— Feature分支

07 分支管理 —— Feature分支 软件开发中,总有无穷无尽的新的功能要不断添加进来。添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好...

lwenhao
31分钟前
1
0
matlab-线性代数 创建 N阶数量矩阵 N阶单位矩阵 对角矩阵 范德蒙矩阵 等差数列

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   创建N阶数量矩阵 code cle......

志成就
42分钟前
0
0
python 利用 descriptor 实现自己的 property

1.概念简介 1.1 property 在 python 代码中,property 是非常常见的一个内置函数。property 可以为一个 python 类的 attribute 设置 getter/setter,可以类比之 C# 的 properties。 见下面的...

御坂网络路由器
今天
3
0
xssfilter-代码段

class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { /** * @param request */ public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); ......

qiang123
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部