Springboot之redis缓存(二)

(二)整合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中出现了缓存:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值