redis一般缓存什么样数据_SpringBoot+Redis轻松实现数据缓存

1.为什么需要缓存

为什么需要缓存,我相信搞开发的都能回答出来,无非就是为了降低数据库压力,节约资源,提升系统性能。而事实上也确实是,归根结底就是降压,高并发,高性能。不过,大厂里那一套高并发的东西不在本篇讲述。下面我们就spring boot 整合redis ,实现数据缓存的demo。

2.搭建Springboot工程

搭建spring boot工程,此处就不多赘述了,大家可以自己去官网下载然后导入,或者直接用idea创建。引入的核心依赖如下,另外还有其他的如mybatis,thymeleaf等。

org.springframework.boot  spring-boot-starter-weborg.springframework.boot  spring-boot-starter-data-redis  2.3.0.RELEASE

3.Redis配置类

@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    @Autowired    private LettuceConnectionFactory lettuceConnectionFactory;    @Bean    public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {        RedisTemplate redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(lettuceConnectionFactory);        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper objectMapper = new ObjectMapper();        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        // key采用String的序列化方式        redisTemplate.setKeySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // value序列化方式采用jackson        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);        // hash的value序列化方式采用jackson        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);        redisTemplate.afterPropertiesSet();        return redisTemplate;    }}

4.Redis工具类

//大家可以根据需要再自行添加方法@Componentpublic final class RedisUtil {    @Autowired    private RedisTemplate redisTemplate;    /**     * 设置缓存:无过期时间     * @param key     * @param value     * @return     */    public boolean set(String key, Object value) {        try {            redisTemplate.opsForValue().set(key,value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 设置缓存:有过期时间,单位:秒     * @param key     * @param value     * @param time     * @return     */    public boolean set(String key, Object value, long time) {        try {            if(time > 0) {                redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);            }else {                throw new RuntimeException("时间必须大于0");            }            return true;        }catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 普通缓存获取     * @param key 键     * @return 值     */    public Object get(String key) {        return key == null ? null : redisTemplate.opsForValue().get(key);    }    /**     * 判断key是否存在     * @param key 键     * @return true 存在 false不存在     */    public boolean hasKey(String key) {        try {            return redisTemplate.hasKey(key);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 指定key缓存失效时间     * @param key 键     * @param time 时间(秒)     * @return     */    public boolean expire(String key, long time) {        try {            if (time > 0) {                redisTemplate.expire(key, time, TimeUnit.SECONDS);            }else {                throw new RuntimeException("时间必须大于0");            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 根据key 获取过期时间     * @param key 键 不能为null     * @return 时间(秒) 返回0代表为永久有效     */    public long getExpire(String key) {        return redisTemplate.getExpire(key, TimeUnit.SECONDS);    }    /**     * 将list放入缓存     * @param key 键     * @param value 值     * @return     */    public boolean lSet(String key, List value) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 将list放入缓存     * @param key 键     * @param value 值     * @param time 时间(秒)     * @return     */    public boolean lSet(String key, List value, long time) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }}

5.测试

@Testvoid contextLoads() {  if(redisTemplate.opsForValue().get("list") != null) {    LOGGER.info("走缓存了=============");    List list = (List) redisTemplate.opsForValue().get("list");    System.out.println(list);  }else {    LOGGER.info("走数据库了=============");    List list = aaaServerService.findList();    redisTemplate.opsForValue().set("list",list);  }}

我们第一次运行这个测试类,控制台打印如下图1,再运行一次,控制台打印如下图2。可以看到查询的数据从缓存中取了。我们还可以连接下redis,直接 get list,得到的结果如图3,数据的确已经存入缓存!至此,spring boot整合redis就大功告成了!

e891f42d7ac918dfa3309f4770a9bbf5.png

图1

539c39fbb847b90be9a2811b6db5f8d5.png

图2

37288f81075c25d6a654db56a963eb5d.png

图3

小结

本篇文章建单的介绍了spring boot如何整合redis,相对来说,没有什么难懂的地方。对于简单的业务层面来说,这个已经足够了,更深层次的还需要大家不断的学习探索。好了,今天的文章就到这里了,喜欢的小伙伴来个关注呗[呲牙]

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

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

相关文章

python里面的import provide_Python importorror:没有名为wmi的模块

我按照说明在这里下载了用于Python的WMI当我试图运行代码时import wmic wmi.WMI ()for s in c.Win32_Service (StartMode"Auto", State"Stopped"):if raw_input ("Restart %s? " % s.Caption).upper () "Y":s.StartService ()我收到…

php 微信消息解密,thinkphp微信开发(消息加密解密)

使用thinkphp官方的WeChat包&#xff0c;使用不同模式可以成功&#xff0c;但是安全模式就是不行&#xff0c;现将分析解决结果做下记录。分析问题&#xff1a;解密微信服务器消息老是不成功&#xff0c;下载下微信公众平台官方给出的解密文件和WechatCrypt.class.php进行比对发…

模型预测控制_模型预测控制(MPC)算法之一MAC算法

引言随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热&#xff0c;模型预测控制(MPC)算法作为一种先进的控制算法&#xff0c;其应用范围与领域得到了进一步拓展与延伸。目前提出的模型预测控制算法主要有基于非参数模型的模型算法控制(MAC)和动态矩阵控制(DMC)&#x…

基于dde的vb和matlab,基于VB和DDE技术的组态王通信协议转换

组态王是一种通用的工业监控上位机软件,它界面友好、易学易用、即便是不懂编程的工程人员也能在短时时间内开发出界面精美,符合行业标准且高效的上位机监控程序,因此深受工程师们的喜爱,然而组态王软件的上下位机通信协议是固定的切不可改变,这就给一些使用“自拟定协议”和“非…

pythonjava解释xml_Python解析XML文档

解析XML主要用到pytohn自带的XML库&#xff0c;其次还是lxml库XML结构&#xff0c;先以一个相对简单但功能比较全的XML文档为例dive into markcurrently between addictionstag:diveintomark.org,2001-07-29:/2009-03-27T21:56:07ZMarkhttp://diveintomark.org/Dive into histo…

红旗linux安装oracle,Redflag Linux安装Oracle 10gR2 RAC记事

Redflag Linux安装Oracle 10gR2 RAC记事Kamus遇到过&#xff1a;SQL> startup nomountORA-27102: out of memoryLinux-x86_64 Error: 28: No space LEFT ON device这和内核参数 shmall 有关&#xff0c;修改设置 kernel.shmall 16475728 。后来离开没多久&#xff0c;客户打…

springboot开启debug日志_SpringBoot 如何优雅的打印日志?

一、打印日志注意事项1、使用 Slf4j 注解这个代码相信大家都很熟悉&#xff0c;你是否曾经看到或者自己因 copy 而 没有改变“当前类名”&#xff1f;如果你们项目用到 lombok &#xff0c;可以在类上使用 Slf4j 注解&#xff0c;省去手动写这行代码。2、不建议使用的输出为什么…

oracle导出表中某天数据命令,Oracle数据库使用命令行导入导出数据表及数据内容(本地、远程)...

一、本机导入导出1、数据库导出命令&#xff0c;导出用户userA下的表结构和数据:exp 用户名/密码服务名 owner用户名 file导出文件指定存储路径 fully2、数据库导入命令&#xff0c;将userA用户下的表结构和数据导入到用户userB下&#xff1a;imp 用户名/密码服务名 fromuser导…

python手机话费_查询话费订单详情示例代码

#!/usr/bin/python# encoding:utf-8import urllib2, json, urllib, hashlib# 3、获取订单详情data {}data["appkey"] "your_appkey_here"data["orderno"] "201605250929585085725"data["outorderno"] "77888855888…

windows 映射文件会释放内存吗_Windows系统共享内存管理

一 进程逻辑空间 物理空间​如上图所示&#xff0c;每个进程都有自己的逻辑空间&#xff0c;这些逻辑空间&#xff0c;会被映射到具体的物理空间中。每个进程的逻辑空间都是彼此隔离&#xff0c;相互独立不受干扰的。但是他们都会被映射到同一个物理空间去&#xff0c;当其所映…

linux 文件的组织,Linux文件组织和目录结构

资料&#xff1a;https://www.shiyanlou.com/courses/running1 Linux目录结构说明可以使用tree来查看目录结构sudo apt-get install tree 安装treetree / 查看根目录的结构将目录定义为四种交互作使用的形态&#xff1a;2 路径. 表示当前目录.. 表示上一级目录 - 表示上一次所在…

python 将列表中的字符串转为数字_python 将列表中的字符串转为数字

本文实例讲述了python中列表元素转为数字的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;有一个数字字符的列表&#xff1a;numbers [1, 5, 10, 8]想要把每个元素转换为数字&#xff1a;numbers [1, 5, 10, 8]用一个循环来解决&#xff1a;new_numbers [];fo…

linux perl 安装目录,linux-将Perl模块安装到特定位置

我有几台运行Perl程序以及其他程序和工具的Linux机器.我想使所有机器之间的所有工具保持同步,因此我已经在一台机器(主)和另一台机器之间共享了/usr/local目录.现在,我想在/usr/local /< modules的路径>中使所有Perl模块及其依赖项保持同步.我已经找到了local::lib模块,但…

python 降维lda算法的使用_sklearn LDA降维算法

sklearn LDA降维算法LDA(Linear Discriminant Analysis)线性判断别分析&#xff0c;可以用于降维和分类。其基本思想是类内散度尽可能小&#xff0c;类间散度尽可能大&#xff0c;是一种经典的监督式降维/分类技术。sklearn代码实现#codingutf-8import pandas as pdimport matp…

linux 命令 语法,linux常用命令及语法

mkdir、rmdirmkdir命令用来建立新的目mkdir命令用来建立新的目录&#xff0c;rmdir用来删除已建立的目录。rm这个命令是用来删除文件的。rm命令常用的参数有三个&#xff1a;-i,-r,-f。删除既有文件或目录之前先询问用户&#xff0c;删除一个名字为test的一个文件&#xff1a;r…

jeecg 导出的excel不能使用公式_微软:Excel公式是世界上使用最广泛的编程语言...

喜欢就关注我们吧&#xff01;文|一君微软近日推出了一项 Excel 公式构建的新功能 LAMBDA&#xff0c;正则测试阶段。LAMBDA 允许使用 Excel 自身的公式语言自定义功能&#xff0c;而过去&#xff0c;Excel 中需要通过 JS 等语言编写自定义函数。同时&#xff0c;LAMBDA 还可以…

linux 查找tomcat目录,linux下通过tomcat访问某路径下的文件

背景&#xff1a;linux服务器上有个日志目录&#xff0c;要通过界面访问。之前用Apache实现的&#xff0c;现在安全漏洞检查需要升级Apache&#xff0c;但是安装之路犹如西天取经&#xff0c;各种缺文件&#xff0c;各种报错&#xff0c;一直没搞定。然后决定用tomcat实现该功能…

python中的画布控制_使按钮在画布上工作(tkinter)

你的代码需要认真的重组。在这里有一些东西可以用来添加矩形。你不需要在cd2>中创建一个cd2>的集合&#xff0c;这样你就不需要在cd2>中创建一个的集合。在from tkinter import *import randomroot Tk()class Recta:def __init__(self, height60, width80):self.heig…

voip 音频采集时间_蓝牙音频续航监测系统展会现场演示

|点击【美格信】关注☝大家好&#xff0c;我是美格信公众号主编&#xff1a;小M&#xff0c;今天的2020(秋季)亚洲蓝牙耳机展上&#xff0c;我们美格信现场展示了发布的新品-MAGNUM麦金纳蓝牙音频续航监测系统。不过有很多小伙伴因为时间问题&#xff0c;没机会来现场参观&…

linux 运行scrapy,python 文件 运行 scrapy

写了一个scrapy&#xff0c;程序可以跑&#xff0c;没有任何问题。爬下30个网站的body存入json文件&#xff0c;并且保存为test.json如果test.json存在就保存到一个新建的test1.json新建了一个python文件叫check.py&#xff0c;对比两个文件的hash值&#xff0c;如果有不一样&a…