(二)整合redis
docker下载镜像
基于centos7的虚拟机中,可以用阿里云镜像加速
docker pull xxxxxx.mirror.aliyuncs.com/library/redis
xxxxxx根据自己注册阿里云的账号而不同。阿里云登录(进去找容器镜像服务)
但是,后面自己又出现redisDesktopMananger不能连接redis的问题,搞了好几个小时,网上各种方法都试过了,错误之后的各种尝试,仍然不成功。最后删了阿里云的redis,重新下载了官网的redis。才成功连接。
安装好后运行redis,将虚拟机端口映射到docker端口
docker run -d -p 6379:6379 --name myredis xxxxxx.mirror.aliyuncs.com/library/redis
在springboot中配置redis
配置文件中写入:
redis中操作指定数据类型的代码:
如果需要在redis中保存对象,需要使对象所在的类可序列化:
保存对象的操作:
public void test02(){
Employee emp = employeeMapper.getEmpById(1);
redisTemplate.opsForValue().set("emp-01",emp);
}
redisDesktopMananger呈现的数据不够直观:
为了显示为json格式,需要自定义序列化器,加入以下配置:
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<Object, Employee> myRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> serializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
template.setDefaultSerializer(serializer);
return template;//使用最后输出为json格式的序列化器
}
}
自定义redis模板设置好了之后,将模板注入测试程序,并用该模板操作(其中加入容器,自动注入和最后操作数据的模板对象一致,保证显示数据为json格式):
@Autowired
RedisTemplate<Object,Employee> myRedisTemplate;
@Test//保存对象
public void test02(){
Employee emp = employeeMapper.getEmpById(1);
myRedisTemplate.opsForValue().set("emp-01",emp);
}
Waring: redis缓存能够工作的原理:
当引入redis-start依赖后,容器保存redisCacheMannager,用redis缓存数据
redisCacheMannager创建redisCache作为缓存组件,redisCache操作redis,RedisTemplate使用默认序列化机制,上面自定义的myRedisTemplate就更换了序列化机制,使得最后呈现出来的是json格式。
**还可以在springboot2.0中自定义缓存设置(保存为json格式),来统一方便对其他bean的数据类型进行操作,而不需要像之前的那种方式,需要针对每一个数据类型自定义配置redisTemplate:
@Bean
public RedisCacheManager employeeRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1)) // 设置缓存过期时间为一天
.disableCachingNullValues() // 禁用缓存空值,不缓存null校验
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericJackson2JsonRedisSerializer())); // 设置CacheManager的值序列化方式为json序列化,可加入@Class属性
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build(); // 设置默认的cache组件
}
设置好之后,将该组价加入部门的service中,操作部门数据,也能返回json格式的数据。
@Service
public class DeptService {
@Autowired
DepartmentMapper departmentMapper;
@Autowired
RedisCacheManager eRedisCacheManager;
public Department getDepById(Integer id) {
System.out.println("查询部门" + id);
Department department=departmentMapper.getDeptById(id);
Cache dept = eRedisCacheManager.getCache("dept");
dept.put("dept:1",department);
return department;
}
}
下面是对部门查询缓存的操作:
1.mapper建立CRUD方法
public interface DepartmentMapper {
@Select("SELECT * FROM department WHERE id=#{id}")
Department getDeptById(Integer id);
}
2.service注入mapper,并写可缓存查询方法
@Service
public class DeptService {
@Autowired
DepartmentMapper departmentMapper;
@Cacheable(cacheNames = "dept")
public Department getDepById(Integer id) {
System.out.println("查询部门" + id);
Department department=departmentMapper.getDeptById(id);
return department;
}
}
3.controller控制和浏览器交互:
@RestController
public class DeptController {
@Autowired
DeptService deptService;
@GetMapping("/dept/{id}")
public Department getDept(@PathVariable("id") Integer id){
return deptService.getDepById(id);
}
}
这里是通过service里面对方法加上@Cacheable注解的方式使用缓存。
下面介绍另外一种通过编码的方式使用缓存的方法:
1.将springboot2.0中自定义缓存规则的类对象注入(通用所有类,不需要为每个类单独配置):
@Autowired
RedisCacheManager eRedisCacheManager;
2.通过cacheManager得到缓存,再通过缓存操作:
public Department getDepById(Integer id) {
System.out.println("查询部门" + id);
Department department=departmentMapper.getDeptById(id);
Cache dept = eRedisCacheManager.getCache("dept");
dept.put("dept:1",department);//将得到的department对象放入key为dept:1的缓存
return department;
}
3.浏览器访问数据库后,可以看到redis中出现了缓存: