springboot 集成redis_一文详解Spring Boot 集成 Redis

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类型的操作方式:

00af86acb1b11775ef71a55396e70dba.png
//操作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进行多次的操作时使用。
f7f67c3724e9251295d703410f3f9c68.png
//没有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|博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机用手机的网络,电脑做热点让手机上网_电脑开热点给手机用

2016-11-26 12:00:20你好!很高兴为你解答&#xff0c;有两个解决办法:1.在每台机的本地连接--属性--常规--internet协议(TCP/IP)--常规里,设置成"自动获取IP地址"2.在每台机的本地连接--...2017-01-06 14:44:121.打开任务栏右下角的网络连接&#xff0c;在弹出的界面…

shell开启飞行模式_原来手机飞行模式有这么多用处!99%的深圳人都不知道...

相信大家都知道我们的手机里有个功能叫「飞行模式」(又称航空模式)它可以关掉手机收发信号的装置避免手机信号对飞机飞行造成干扰来源&#xff1a;网络那么对于不常坐飞机的人来说「飞行模式」功能是不是毫无用处呢&#xff1f;当然不是今天易小姐就带大家解锁关于「飞行模式」…

联想微型计算机启天e4300,戴尔轻薄商务本Latitude E4200/E4300开卖

戴尔随迅驰2平台的发布全面更新了自己的Latitude商用笔记本产品线&#xff0c;之前15和14寸的E6000/E5000系列已经上市销售&#xff0c;今天两款轻薄型号E4300/E4200也摆上了戴尔美国官网的货架。13.3寸的E4300目标直指联想ThinkPad X300/X301系列&#xff0c;虽然在轻薄程度上…

医疗小程序源码_不懂商城小程序源码,如何快速创建小程序商城?

小程序在近来发展十分迅速&#xff0c;从微信小程序游戏出发&#xff0c;到现在渗透到各种功能类型&#xff0c;甚至已经扩展到了其他的应用程序上。那么如今很多的小程序商城应该怎么创建呢&#xff1f;不懂商城小程序源码也可以自己制作吗&#xff1f;当然可以&#xff0c;下…

计算机快捷键任务管理器,任务管理器快捷键,小编告诉你电脑如何打开任务管理器...

电脑系统的任务管理器是Windows提供有关计算机性能的信息&#xff0c;并显示了计算机上所运行的程序和进程的详细信息&#xff0c;从这里可以查看到当前系统的进程数、CPU使用比率、更改的内存、容量等数据。那么&#xff0c;任务管理器怎么样打开呢&#xff1f;下面&#xff0…

python webdriver 等待网页已登录_python基础编程:python+selenium实现163邮箱自动登陆的方法...

本文介绍了让我们先来预览一下代码运行效果吧&#xff1a;首先分析163邮箱登陆页面的网页结构(按F12或单击鼠标右键选择审查元素)1、定位到登陆框(注意登录框是一个iframe&#xff0c;如果不定位到iframe的话是无法找到之后的邮箱地址框和密码输入框的)2、定位到邮箱地址框(nam…

长沙计算机中级职称分数公布,大家所期待的2020年湖南省长沙中级职称评审公示...

原标题&#xff1a;大家所期待的2020年湖南省长沙中级职称评审公示年底了&#xff0c;各大考试差不多都快结束了。唯一就是湖南长沙的土建中级职称评审结果待公示&#xff0c;湖南岳阳&#xff0c;湘潭等地方也相继公示。2019年湖南省中级职称评审(长沙市)12月24号公示&#xf…

android平台上持久化存储3种手段_深入学习Redis :持久化

前言在上一篇文章中&#xff0c;介绍了Redis的内存模型&#xff0c;从这篇文章开始&#xff0c;将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。本文将先说明上述几种技术分别解决了Redis高可用的什么问题&#xff1b;然后详细介绍Redis的持久…

自动驾驶芯片_自动驾驶芯片“争夺战”

伴随着智能汽车时代的加速到来&#xff0c;自动驾驶芯片“争夺战”也越演越烈。继奥迪、宝马、长安、广汽、小鹏等汽车厂商“摩拳擦掌”L3级自动驾驶后&#xff0c;近日本田扔出了一个大消息&#xff0c;L3级自动驾驶汽车将于明年3月正式开售。至此&#xff0c;全球已经进入L3级…

r语言将百分数化为小数_「淮南师出」教师资格/招聘小学数学:《百分数与小数的互化》...

教学目标&#xff1a;1、利用已有知识迁移、类推、发现百分数和小数互化的规律和方法。2、理解、掌握百分数和小数互化的方法&#xff0c;并能熟练运用&#xff0c;进一步体会数学之间的内在联系&#xff0c;增强思维的深刻性。3、通过合作交流、探索发现等数学学习活动教给学生…

wps表格里面计算机在哪里,WPS的Word居然还有计算神器?在哪里能找到又是怎么进行计算呢?...

说到计算器&#xff0c;恐怕好多小伙伴第一时间会想到WPS的Excel和微软的Excel表格&#xff0c;其实&#xff0c;WPS的Word也有计算器&#xff0c;只是隐藏了起来好多人不知道而已。只要找到它&#xff0c;我们在Word里也能进行加减乘除的计算了&#xff0c;下面白豆芽就给大家…

深入浅出:Go 语言中值传递与引用传递的原理解析

深入浅出&#xff1a;Go 语言中值传递与引用传递的原理解析 引言Go 语言中的值传递什么是值传递&#xff1f;Go 语言中值传递的工作原理代码示例 Go 语言中的引用传递什么是引用传递&#xff1f;Go 语言中引用传递的工作原理代码示例 值传递与引用传递的比较优势和劣势应用场景…

专科学数控还是计算机,盘点适合专科男生学的专业 哪些专业好就业

正所谓&#xff1a;男怕入错行&#xff0c;女怕嫁错郎。对于专科男生来说&#xff0c;哪些专业好就业呢&#xff1f;下面和小编一起来看看吧&#xff01;1、数控加工专业随着数控制造增多&#xff0c;我国对于数控加工专业人才严重缺乏。选择学数控加工专业的专科男生在毕业后&…

红米note2能刷机没显示无服务器,红米note2怎么刷机 红米note2刷机教程

大家应该知道吧!现在手机市场已经被智能手机垄断了&#xff0c;走到哪儿智能手机都跟我们形影不离。虽然像三星、 苹果 一样的大牌手机比较出名&#xff0c;但是我们的国产手机这几年发展的也是很不错的&#xff0c;就好比国内最火爆的 小米 手机&#xff0c;这个品牌的手机上市…

花瓣长度和花瓣宽度散点图鸢尾花_基于python的鸢尾花简单聚类模型分析

1、导入数据#导入花萼数据 from sklearn.datasets import load_iris irisload_iris() iris.data前四列为花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度等4个用于识别鸢尾花的属性2、建模#创建kmeans聚类 from sklearn.cluster import KMeans kmeansKM…

ajax结构图,Vuex结构图及用法

Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex结构图下图是我总结的Vuex结构图。Vuex用法以一个Vue项目中的商家信息搜索功能为例&#xff0c;记录Vuex的使…

qq饥荒联机版服务器没有响应,饥荒联机版专用服务器卡顿原因及解决方法汇总...

饥荒联机版中自己的专用服务器会经常卡顿&#xff0c;那么是什么原因造成的呢?相信很多玩家都不太了解&#xff0c;下面带给大家的是饥荒联机版专用服务器卡顿原因汇总。饥荒联机版专用服务器卡顿原因汇总①猪人兔人鱼人房卡顿等级:高 解决难度:低普通服务器地上同屏可以放20个…

php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码

一、忘记密码模块路由二、控制器解析跟注册、登录的控制器一样&#xff0c;大部分的逻辑使用trait引入。ForgotPasswordController&#xff1a;负责忘记密码页面&#xff0c;以及邮件发送四、扩展开发&#xff1a;自定义的忘记密码行为忘记密码有多种处理方式&#xff0c;这里默…

MBSE系统工程是什么

MBSE&#xff08;基于模型的系统工程&#xff09;是现代系统工程的最新发展结果。 曾经的产品设计师利用纸笔绘制图版来制作产品和设计&#xff0c;在CAD这类三维建模软件的出现&#xff0c;让工程师们甩掉了图板和图纸&#xff0c;带来的效益大家都能理解。 目前系统工程师们…

数值计算软件有哪些?一款国产软件非常亮眼。

数值计算软件有哪些&#xff1f;一款国产软件非常亮眼。 数学软件由算法标准程序发展而来, 大致形成于70年代初期。随着几大数学软件工程的开展,如美国的NATS工程&#xff0c;人们探索了产生高质量数学软件的方式、方法和技术。 经过长期积累&#xff0c;已有丰富的、涉及广泛数…