一.Redis环境搭建

系统默认是使用ConcurrentMapCacheManager,然后获取和创建ConcurrentMapCache类型的缓存组件,再将数据保存在ConcurrentMap中

开发中使用缓存中间件:redis,memcached,ehcache

1.搭建redis环境

在linux上安装redis(推荐使用docker)。docker安装redis的技巧:使用国内镜像可以加速下载。

docker pull registry.docker-cn.com/library/redis

2.使用docker启动redis

 docker run -p 6379:6379 --name myredis -d registry.docker-cn.com/library/redis

 3.引入redis的starter

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

4.配置redis

spring.redis.host=172.**.**.**

二.RedisTemplate的使用

SpringBoot底层整合了spring-data-redis,里面的StringRedisTemplate以及RedisTemplate都已经注入到容器中,使用的时候直接从容器中取出来即可。其中StringRedisTemplate封装了redis对字符串的一些常用操作,RedisTemplate封装了一些对象的常用操作。

1.StringRedisTemplate的使用

public void testStringRedis() {
//redis保存数据
stringRedisTemplate.opsForValue().append("msg","hello"); //读取数据
String msg = stringRedisTemplate.opsForValue().get("msg");
System.out.println(msg);
     //list存储数据 
stringRedisTemplate.opsForList().leftPush("mylist","1");
stringRedisTemplate.opsForList().leftPush("mylist","2");
stringRedisTemplate.opsForList().leftPush("mylist","3");
String mylist = stringRedisTemplate.opsForList().leftPop("mylist"); //删除并查询最顶层的list数据
System.out.println(mylist);
}

2.RedisTemplate的使用

public void testRedis() {
employeeRedisTemplate.opsForValue().set("emp-02",employeeMapper.getEmployeeById(2));
}

使用set方法保存查询到的员工对象,执行完毕后发现有错误,这是因为Emp对象没有被序列化,没有序列化的对象是无法存入redis数据库。所以需要Emp实体类实现Serializable接口,将对象序列化再次执行发现有数据存储到数据库中,但是是以序列化的方式存储的。

这样存储数据是有了,但是存在数据库里很不直观,查询数据的人无法知道自己存了什么数据进去,那么如何解决序列化对象的问题呢?

redis存取序列化对象的解决方式

方式一:将数据以json形式保存,将对象转为json,转成json对象后,就会以json的形式存储到数据库中。

方式二:改变默认的序列化规则,由于默认使用jdk的序列化器,切换使用json的序列化器即可解决序列化问题

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

使用的时候注入该类,使用这个类来调用set方法即可将Emp对象存到数据库里

@Autowired
RedisTemplate<Object, Employee> employeeRedisTemplate;
public void testRedis() {

    employeeRedisTemplate.opsForValue().set("emp-02",employeeMapper.getEmployeeById(2));
}

.测试Redis缓存

1.默认使用ConcurrentMapCacheManager缓存组件来实际给缓存中存取数据。引入redis的starter之后,容器中保存的是RedisCacheManager,开启debug日志报告,可以搜索已经开启了的 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration,原来的SimpleCacheConfiguration将不再匹配。

2.RedisCacheManager帮我们创建RedisCache来作为缓存组件,RedisCache通过操作redis来操作缓存数据,原来的缓存替换为redis缓存,注解配置都一样,区别是缓存的内容都存到配置好的redis数据库了。

3.默认保存数据k-v都是object,利用序列化保存,所以需要反序列化,将其保存为json

  1)、引入了redis的starter,cacheManager变为RedisCacheManager

  2)、默认创建的RedisCacheManager操作redis的时候使用的是RedisTemplate<Object,Object>

  3)、RedisTemplate<Object,Object>默认使用jdk的序列化机制,所以会乱码

  4)、自定义CacheManager(springboox1.x的版本和这个有区别,这边给出的是2.x的例子)

 //容器会自动检测到这个CacheManager,并替换原来自带的CacheManager
@Primary //若配置多个缓存管理器需要有一个默认的缓存管理器
@Bean
public RedisCacheManager myCacheManager(RedisConnectionFactory redisConnectionFactory){
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
//.entryTtl(Duration.ofHours(1)); // 设置缓存有效期一小时
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); // 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
return cacheManager;
}

注意多个缓存管理器时,若需要引入缓存管理器可以在类注解上@CacheConfig(cacheNames = "emp",cacheManager = "myCacheManager") 配置。

使用编码的方式进行缓存

上面讲的都是采用注解的方式进行缓存的,实际生产过程中也可以采用编码的方式进行缓存。

1) 注入缓存管理器

 @Qualifier("myCacheManager")
@Autowired
RedisCacheManager myCacheManager;

2) 编码缓存

 public Department getDept(Integer id){
Department department = departmentMapper.getDepartmentById(id);
Cache dept = myCacheManager.getCache("dept"); //获取某个缓存
dept.put("dept:1",department); return departmentMapper.getDepartmentById(id);
}

SpringBoot缓存篇Ⅱ --- 整合Redis以及序列化机制的更多相关文章

  1. 实例讲解Springboot以Template方式整合Redis及序列化问题

    1 简介 之前讲过如何通过Docker安装Redis,也讲了Springboot以Repository方式整合Redis,建议阅读后再看本文效果更佳: (1) Docker安装Redis并介绍漂亮的可 ...

  2. Spring整合Redis&JSON序列化&Spring/Web项目部署相关

    几种JSON框架用法和效率对比: https://blog.csdn.net/sisyphus_z/article/details/53333925 https://blog.csdn.net/wei ...

  3. 【快学springboot】11.整合redis实现session共享

    前言 这里都是基于前面的项目基础上的.springboot整合redis非常的方便,这也是springboot的宗旨,简化配置.这篇文章就教大家如何使用springboot整合redis来实现sess ...

  4. springboot 2.x整合redis,spring aop实现接口缓存

    pox.xml: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  5. Redis缓存篇(二)淘汰机制:缓存满了怎么办?

    上一讲提到,缓存的容量总是小于后端数据库的.随着业务系统的使用,缓存数据会撑满内存空间,该怎么处理呢? 本节我们来学习内存淘汰机制.在Redis 4.0之前有6种内存淘汰策略,之后又增加2种,一共8种 ...

  6. SpringBoot + MySQL + MyBatis 整合 Redis 实现缓存操作

    本地安装 Redis Redis 安装:https://www.cnblogs.com/oukele/p/11373052.html 项目结构:  SpringBootRedis 工程项目结构如下: ...

  7. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  8. SpringBoot消息篇Ⅲ --- 整合RabbitMQ

    知识储备:  关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与RabbitMQ的整合以及简单的使用. 一.安装RabbitMQ 1.在linux上 ...

  9. SpringBoot分布式篇Ⅷ --- 整合SpringCloud

    SpringCloud是一个分布式的整体解决方案.Spring Cloud为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局锁,leader选举.分布 ...

随机推荐

  1. 第二阶段:1.流程图:12.AXURE绘制页面流程图

    注意的事项: 完整的页面流程图

  2. 优雅的使用BeanUtils对List集合的操作

    摘要 在业务员流程的时候,我们在Entity.Bo.Vo层数据间可能经常转换数据,Entity对应的是持久层数据结构(一般是数据库表的映射模型).Bo对应的是业务层操作的数据结构.Vo就是Contro ...

  3. `docker数据持久化volume和bind mounts两种方式

    将数据从宿主机到容器的三种方式: ,volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式 ,bind mounts 将宿主机上的任 ...

  4. centos 7.3 服务器环境搭建——MySQL 安装和配置

    centos 7.3 服务器环境搭建——MySQL 安装和配置服务器信息如下:服务器:阿里云系统 centos 7.3 (阿里云该版本最新系统)mysql版本:5.7.18 (当前时间最新版本)连接服 ...

  5. my_mysql

    ###一键偷懒YUM安装MySQbL### 1.安装mysql数据库 #yum install -y mariadb-server  mariadb 2.登录mysql数据库常用选项 -h:指定服务端 ...

  6. Kubernetes 会不会“杀死” DevOps?

    作者丨孙健波(天元)  阿里巴巴技术专家 导读:DevOps 这个概念最早是在 2007 年提出的,那时云计算基础设施的概念也才刚刚提出没多久,而随着互联网的逐渐普及,应用软件的需求爆发式增长,软件开 ...

  7. 一个.NET程序员 "2019" 跳槽3次的悲惨故事

    2019年是值得深思的一年,在找工作上没有那么用心,导致碌碌无为,在这里我建议大家找工作的时候不要太着急...要不然会被逼疯的,一定不能被“工作”挑,一定要做到挑"工作".:那我就 ...

  8. spring-boot序章:打造博客系统

    blog 使用spring-boot打造一个博客系统,在项目中学习! 项目功能 文章 游览 创建 编辑 删除 评论 用户 游客 注册用户 关注 被关注 后台统计 注册用户数 在线人数 文章总数 评论总 ...

  9. rabbitmq系列(一)初识rabbitmq

    为什么要使用消息中间件 案例:假如我们开发了一个商品抢购网站.这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息注册.传统做法应 ...

  10. FlashFXP 5.0.0官方中文破解版,附文件下载地址和破解码

    FlashFXP 5.0.0官方中文破解版是一个功能强大的 FXP/FTP 软件,融合了一些其他优秀 FTP 软件的优点,如像 CuteFTP 一样可以比较文件夹,支持彩色文字显示:像 BpFTP 支 ...