redis设置:

  • 修改redis服务器的配置文件
vim /usr/local/redis/bin/redis.confbind 0.0.0.0 protected-mode no
  • 重新启动redis
systemctl restart redis.service   #重新启动服务

注意:服务器的话需要设置安全组开放端口

1.导入依赖

 org.springframework.boot    spring-boot-starter-data-redis

2.全局配置文件中配置redis信息

# 应用名称spring:  application:    name: springboot-redis01  redis:    host: 47.93.190.68    port: 6379    database: 0    jedis:      #redis连接池信息      pool:        max-active: 8        min-idle: 0        max-idle: 8        max-wait: -1server:  servlet:    context-path: /redis01

通过以上配置后springboot就为我们提供了RedisTemplate和StringRedisTemplate(对key,value形式的都是string操作)

相关操作

StringRedisTemplate

对string类型的操作方式:

//操作stringstringRedisTemplate.opsForValue().set("string01","string");System.out.println(stringRedisTemplate.opsForValue().get("string01"));//操作hash类型stringRedisTemplate.opsForHash().put("hash-user","username","name");stringRedisTemplate.opsForHash().put("hash-user","userage","age");//操作liststringRedisTemplate.opsForList().rightPushAll("list","l1","l2");//操作setstringRedisTemplate.opsForSet().add("set01", "daaa");//操作zsetstringRedisTemplate.opsForZSet().add("zset01", "zset", 1);
  • 绑定一个键(k)进行操作:通常是对一个key进行多次的操作时使用。
//没有key就会添加keyBoundValueOperations boundValueOps = stringRedisTemplate.boundValueOps("name");//追加的方式boundValueOps.append("hahaha");boundValueOps.append("hahaha");System.out.println(boundValueOps.get());//重新赋值boundValueOps.set("hanwei hello");System.out.println(boundValueOps.get());

注意: 一旦绑定key之后后续根据返回对象的操作都是基于这个key的操作

redisTemplate

  • 一般操作是将对象存储在redis中。
@Test    public void testRedisTemplate(){        //通过这种方式是获取不到stringRedisTemplate方式设置的值的        System.out.println(redisTemplate.opsForValue().get("name"));//null        //设置key的序列化方式为string        redisTemplate.setKeySerializer(new StringRedisSerializer());        //以下是设置value的序列化        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);        //jackson        ObjectMapper objectMapper = new ObjectMapper();        //转换json格式的时候将原始类型保留,这样在反序列化的时候就能知道对应的类型信息        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        //修改存储在redis中的日期格式        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);        User user = new User();        user.setId(22).setName("hanhan").setBir(new Date());        redisTemplate.opsForValue().set("user",user);        System.out.println(redisTemplate.opsForValue().get("user").toString());        //hash类型的是(key,(key,val)),所以需要单独设置序列化方式        redisTemplate.setHashKeySerializer(new StringRedisSerializer());        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);        redisTemplate.opsForHash().put("user1","user",user);        System.out.println(redisTemplate.opsForHash().get("user1", "user"));    }

注意redistemplate默认使用的是jdk的序列化,存储到redis中会是下面的情况:,所以我们将key的序列化改为string类型的,将value改为json序列化。

mybatis中使用redis

mybatis自身缓存存在问题,本地缓存local cache

1.本地缓存存储在当前运行的jvm内存中,如果缓存数据过多会占用一定jvm内存,导致应用运行缓存。

​ 2.不能在分布式系统中做到缓存共享。

重写mybatis cache 使用redis作分布式缓存

如果使用mybatis的二级缓存只需要在mapper文件中添加,二级缓存的作用范围是每个maper。

自定义redis缓存作为mybatis的缓存

  • 导入依赖
org.springframework.boot            spring-boot-starter        org.springframework.boot            spring-boot-starter-data-redis        org.projectlombok            lombok        org.springframework.boot            spring-boot-starter-test            testjunit            junit            testcom.fasterxml.jackson.core            jackson-databind        org.mybatis.spring.boot            mybatis-spring-boot-starter            2.1.1com.alibaba            druid            1.1.21mysql            mysql-connector-java        

注意:mybatis的xml文件如果再java文件下的话,一定要加resources将xml发布

  • 自定义RedisCache类
package com.han.cache;import com.han.util.ApplicationContextUtils;import org.apache.ibatis.cache.Cache;import org.springframework.context.ApplicationContext;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @author M.han * @title: RedisCache * @projectName springboot-redis * @description: TODO * @date 2020/12/1520:18 */public class RedisCache implements Cache {    private String id;    public RedisCache(String id) {        System.out.println("当前加入缓存的id==》" + id);        this.id = id;    }    @Override    public String getId() {        return id;    }    /***     * 放入缓存     * @param key     * @param val     */    @Override    public void putObject(Object key, Object val) {        System.out.println("KEY:" + key);        System.out.println("val:" + val);        //获取对象        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");        redisTemplate.setKeySerializer(new StringRedisSerializer());        //存储在Redis中,注意上面对key使用了string序列化,所以传入的key是string类型的        redisTemplate.opsForValue().set(key.toString(), val);    }    /***     * 从缓存中获取     * @param key     * @return     */    @Override    public Object getObject(Object key) {        System.out.println("从缓存中读取了=》" + key);        //获取对象        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");        redisTemplate.setKeySerializer(new StringRedisSerializer());        return redisTemplate.opsForValue().get(key.toString());    }    /***     *  删除缓存中的数据     */    @Override    public Object removeObject(Object o) {        return null;    }    /***     * 清空缓存     */    @Override    public void clear() {    }    /***     * 缓存的命中概率     * @return     */    @Override    public int getSize() {        return 0;    }    /***     * 读写锁,可以为空,写写互斥,读写互斥,读读共享     * @return     */    @Override    public ReadWriteLock getReadWriteLock() {        return new ReentrantReadWriteLock();    }}
  • 因为缓存类是mybatis使用而没有交给spring容器托管(因为在mybatis执行这个的时候要传入id),但是在RedisCache类中需要注入RedisTemplate,所以自定义一个获取spring工厂中的bean的工具类。
package com.han.util;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;/** * @author M.han * @title: ApplicationUtils * @projectName springboot-redis * @description: 获取spring中的bean * @date 2020/12/15 20:26 */@Componentpublic class ApplicationContextUtils implements ApplicationContextAware {    private static ApplicationContext applicationContext;    /***     *     * @param applicationContext 已经创建好的工厂对象     * @throws BeansException     */    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        ApplicationContextUtils.applicationContext = applicationContext;    }    //下面是自定义获取bean    /***     *根据id来获取bean     */    public static Object getBean(String id){        return applicationContext.getBean(id);    }    /***     * 通过类型获取bean     * @param clazz     * @return     */    public static Object getBean(Class clazz){        return applicationContext.getBean(clazz);    }    /***     * 根据id和类型同时获取bean     * @param id     * @param clazz     * @return     */    public static Object getBean(String id,Class clazz){        return applicationContext.getBean(id,clazz);    }}
  • mapper.xml文件中指定redis缓存
<?xml version="1.0" encoding="UTF-8" ?>        select id,username,password from user    
  • yaml文件配置信息
# 应用名称spring:  application:    name: springboot-redis01  redis:    host:      port:      database: 0    jedis:      #redis连接池信息      pool:        max-active: 8        min-idle: 0        max-idle: 8        max-wait: -1  datasource:    type: com.alibaba.druid.pool.DruidDataSource    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://--------/db?characterEncoding=utf-8&serverTimezone=GMT%2B8    username: root    password: server:  servlet:    context-path: /redis01mybatis:  mapper-locations: classpath*:com/han/dao/*.xml  type-aliases-package: com.han.pojologging:  level:    root: info    com.han.dao: debug

注意启动文件上添加MapperScan注解扫描。

通过以上配置,只要redis缓存中有该数据,mybatis就不会执行查询,而是从缓存中取数据。

作者|MrHanhan|博客园

springboot 集成redis_一文详解Spring Boot 集成 Redis相关推荐

  1. ideal新建springboot工程_MyBatis初级实战之一:Spring Boot集成

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  3. springboot 扫描jar包中bean_详解Spring Boot的Component Scan原理

    本文将帮助您了解Spring中最重要的概念 - 组件扫描.Spring Boot在组件扫描方面做了一些魔术 @ComponentScan 如果你了解组件扫描,你就会理解Spring.Spring是一个 ...

  4. 万字长文:详解 Spring Boot 中操作 ElasticSearch

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 超级小豆丁 来源 | http://www.m ...

  5. elasticsearch 客户端工具_万字长文:详解 Spring Boot 中操作 ElasticSearch

    点击上方"小强的进阶之路",选择"星标"公众号 优质文章,及时送达 预计阅读时间: 15分钟 一.ElasticSearch 简介 1.简介 ElasticSe ...

  6. java中的controller_详解Spring Boot中Controller用法

    Controller Controller是SpringBoot里最基本的组件,他的作用是把用户提交来的请求通过对URL的匹配,分配个不同的接收器,再进行处理,然后向用户返回结果.他的重点就在于如何从 ...

  7. 详解Spring Boot框架中的@Conditional系列注解

    目录 1. @Conditional 注解 2. Spring boot 扩展 1) @ConditionalOnClass和@ConditionalOnMissingClass注解 2) @Cond ...

  8. java部署jar还是war优劣_详解Spring Boot 部署jar和war的区别

    本文介绍了Spring Boot 部署jar和war两种方式的区别,分享给大家,具体如下: 1. packaging的方式不同,一种设置成jar一种是war xsi:schemaLocation=&q ...

  9. 详解 | Spring Boot 最核心的 3 个注解详解

    Hi !我是小小,开始本周的第一篇,本周第一篇内容是关于Spring Boot 最核心的三个注解,将会对这三个注解进行详细解释. 前言 Spring Boot 最大的特点是无需 XML 配置文件,能够 ...

最新文章

  1. Python 字典创建、更新、按键值排序、取最大键值对等操作
  2. JAVA防盗链在报表中的应用实例
  3. airpods有时能连上有时连不上怎么办?
  4. 不会自动化UI测试?不会编程?没问题,会造句就行!
  5. 使用Adreno Profiler分析android游戏
  6. css 浮动在最上层_《CSS 知识总结》
  7. PyTorch: torch.optim 的6种优化器及优化算法介绍
  8. python3参考手册_Python3 中文手册
  9. 基于Selenium的Web UI自动化实现(java)
  10. D7写的金税清成助力核心代码
  11. 去掉flash四周虚线框的方法
  12. 大众185A车机屏有关资料
  13. 如何从零开始开发一款嵌入式产品!
  14. linux 命令行大全
  15. Android深度开发第8章随笔感悟
  16. marlin代码解析
  17. No mapping for GET xxx 错误
  18. STM32使用库函数控制时钟芯片DS1302提供时间
  19. 华为荣耀9x如何安装谷歌框架
  20. HTML初始代码 注解

热门文章

  1. restful api接口设计
  2. 24个经典的MySQL索引问题,你都遇到过哪些?
  3. spring的动态代理,碰到了一个类型转换的问题:java.lang.ClassCastException: com.sun.proxy.$Proxy16 cannot be cast to com.
  4. 计划任务文件 linux,Linux之任务计划
  5. 笨方法学python3怎么样_有个很笨的女朋友,是怎么样的体验?
  6. java excel api及详细教程_针对Java Excel API及详细教程
  7. LeetCode(#118)————杨辉三角形
  8. python二分查找算法_如何使用python的二分查找算法
  9. host 端口_如何让多端口网站用一个nginx进行反向代理实际场景分析
  10. mysql explain字段含义_史上最全的explain常见结果含义分析,值得收藏