一文学会redis在springBoot中的使用

news2024/11/25 22:36:38

“收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!

 

 

一、什么是redis缓存

Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

二、redis缓存的优缺点

优点:

  1. 高性能:Redis内存管理非常高效,速度非常快,并且可以利用多核。在访问速度要求高的场景下,使用Redis缓存可以显著提高系统性能,减轻后端系统的压力。
  2. 支持广泛:Redis支持多种数据类型和数据结构,如列表、哈希表、集合、有序集合等,可以应对多样化的缓存需求。
  3. 高可靠性:Redis支持数据持久化和冗余备份,可以确保数据的可靠性和高可用性。
  4. 可扩展性:Redis支持集群模式,可以方便地扩展缓存容量和负载均衡,满足不同规模和需求的系统。
  5. 简单易用:Redis的API简单易用,文档和社区资源丰富,让开发者能够快速上手和掌握。

一句话:

加快了响应速度,减少了对数据库的读操作,数据库的压力降低。

缺点:

  1. 需要占用内存:Redis缓存的数据都存储在内存中,需要占用一定的内存资源。如果缓存数据过多,会导致内存不足,影响系统性能。
  2. 数据持久化的损耗:Redis支持数据持久化,但是在某些情况下,数据持久化会对性能产生一定的损耗,如在高并发的情况下进行RDB持久化操作,会阻塞Redis服务器的IO操作,影响系统性能。
  3. 可靠性问题:Redis的主从架构和高可用性机制可以保证系统可靠性,但在节点故障和网络异常等情况下,仍有一定的风险。
  4. 一致性问题:Redis的缓存是强一致性的,在某些场景下,可能不适合使用。如分布式锁、分布式事务等,需要保证系统的弱一致性。
  5. 安全性问题:Redis的安全性需要开发者进行配置和加固,如果未正确配置,可能会面临信息泄露等安全风险。

一句话:

  • 数据存储在内存,主机断电则数据丢失
  • 存储容量受到物理内存的限制,只能用于小数据量的高性能操作
  • 在线扩容比较困难,系统上线时必须确保有足够的空间
  • 用于缓存时,易出现’缓存雪崩‘,’缓存击穿‘等问题

三、为什么使用redis缓存

  1. Redis 可以用几十 G 内存来做缓存,速度快
  2. Redis 缓存可以持久化,便于数据备份、恢复;
  3. Redis支持简单的事务,操作满足原子性
  4. Redis 可以实现分布式的缓存;
  5. Redis 可以处理每秒百万级的并发,是专业的缓存服务;
  6. Redis 缓存有过期机制;
  7. Redis 有丰富的 API,容易上手;
  8. 支持哨兵机制,实现自动故障转移;

使用redis作为缓存可以减少数据库的压力,特别是需要频繁查询大量数据的情形下。使用redis还可以提高访问速度,因为redis的数据会被保存在内存中。

四、redis支持的数据类型

字符串(string)
哈希表(hash)
列表(list)
集合(set)
有序集合(zset)
为了保证读取效率,Redis 把数据对象存储在内存中,并支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。

redis的特性决定了它的功能,它可以用来做以下这些事情!

排行榜,利用zset可以方便的实现排序功能
计数器,利用redis中原子性的自增操作,可以统计到阅读量,点赞量等功能
简单消息队列,list存储结构,满足先进先出的原则,可以使用lpush/rpop或rpush/lpop实现简单消息队列
session共享,分布式系统中,可以利用redis实现session共享。spring官方提供的分布式解决方案Spring Session就是利用redis 实现的。

五、springboot整合redis

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、springboot启动类增加注解@EnableCaching,开启缓存功能,如下:

/**
  *服务启动类
  
  */
@SpringBootApplication(scanBasePackages = {"cn.xxx.common.redis","cn.xxx.task.*"})
@EnableEurekaClient
@EnableApolloConfig
@EnableFeignClients
@EnableDiscoveryClient
@EnableTransactionManagement 
@MapperScan("cn.xxx.task.dao")
@EnableScheduling
@Transactional
@EnableCaching
public class TaskApplication {

	public static void main(String[] args) {
		SpringApplication.run(TaskApplication.class,args);
	}

	/**
	 * 替换原生Decoder解析器,支持text/plain
	 * @return
	 */
	@Bean
	public Decoder feignDecoder(){
		WxMessageConverter wxConverter = new WxMessageConverter();
		ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(wxConverter);
		return new SpringDecoder(objectFactory);
	}

}


 3、配置redis连接信息

spring:
  redis:
    # redis库
    database: 0
    # redis 服务器地址
    host: localhost
    # redis 端口号
    port: 6379
    # redis 密码
    password:
    # 连接超时时间(毫秒)
    timeout: 1000
    lettuce:
      pool:
        # 连接池最大链接数(负数表示没有限制)
        max-active: 8
        # 连接池最大阻塞等待时间(负数表示没有限制)
        max-wait: -1
        # 连接池最大空闲连接数
        max-idle: 8
        # 连接池最小空闲连接数
        min-idle: 0

六、使用注解的方式使用redis缓存(重点内容)

1. 注解说明
@CacheConfig: 一般配置在类上,指定缓存名称,这个名称是和上面“置缓存管理器”中缓存名称的一致。
@Cacheable: 用于对方法返回结果进行缓存,如果已经存在该缓存,则直接从缓存中获取,缓存的key可以从入参中指定,缓存的 value 为方法返回值。
@CachePut: 无论是否存在该缓存,每次都会重新添加缓存,缓存的key可以从入参中指定,缓存的value为方法返回值,常用作于更新。
@CacheEvict: 用于清除缓存
@Caching: 用于一次性设置多个缓存。
2. 常用注解配置参数
value: 缓存管理器中配置的缓存的名称,这里可以理解为一个组的概念,缓存管理器中可以有多套缓存配置,每套都有一个名称,类似于组名,这个可以配置这个值,选择使用哪个缓存的名称,配置后就会应用那个缓存名称对应的配置。
key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。
condition: 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
unless: 不缓存的条件,和 condition 一样,也是 SpEL 编写,返回 true 或者 false,为 true 时则不进行缓存。
3. 自动缓存
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。

如果添加了@Cacheable注解,那么方法被调用后,值会被存入redis,下次再调用的时候会直接从redis中取值返回。
 

@Service
@CacheConfig(cacheNames = "user")
public class UserService {

    @Autowired
    private UserMapper userMapper;
    
    // 获取全部用户
    @Cacheable(key = "'allUsers'", unless = "#result==null")
    public List<Courses> findAll() {
        return userMapper.allUsers();
    }
}

   /**
     * 登录用户信息缓存(部分,脱敏处理)
     * @param mUser
     * @return
     */
    @CachePut(value = "member", key = "'userinfo:' + #mUser.userId")
    public Map<String, Object> loginUserInfo(MUser mUser) {
        // 手机号加*处理
        String starPhone = PhoneUtil.star(mUser.getPhone());
        Map<String, Object> resMap = new HashMap<>();
        resMap.put("purePhoneNumber", starPhone);
        resMap.put("nickName", mUser.getUserName());
        resMap.put("avatarUrl", mUser.getHeadIcon());
        resMap.put("countryCode", mUser.getCountryCode());
        // resMap.put("resToken", resToken);
        resMap.put("wxAccount", mUser.getWxAccount());
        resMap.put("sex", mUser.getSex());
        resMap.put("sexName", mUser.getSexName());
        resMap.put("userState", mUser.getUserState());
        resMap.put("userStateName", mUser.getUserStateName());
        resMap.put("channelId", mUser.getChannelId());
        resMap.put("channelName", mUser.getChannelName());
        return resMap;
    }
    
    /**
     * 内部员工缓存信息
     * @param phone
     * @param status
     * @param b
     * @param messge
     * @return
     */
    @CachePut(value = "member#PT5M", key = "'employee:' + #phone")
    public Map<String, Object> employee(String phone,String status , boolean b ,String messge ) {
        Map<String, Object> resMap = new HashMap<>();
        resMap.put("phone", phone);
        resMap.put("status", status); 
        resMap.put("flag",  b);
		resMap.put("messge",messge);
        return resMap;
    }
    
    /**
     * 是否是内部员工缓存
     * @param phone
     * @return
     */
    @Cacheable(value = "member", key = "'employee:' + #phone")
    public Map<String, Object> getEmployee(String phone) {
        return  null;
    }

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

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

相关文章

【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程

【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程 文章目录 【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程Anaconda31.安装Anaconda32.卸载Anaconda33.修改Anaconda3安装虚拟环境的默认位置 安装PyTorch3d确定版本对应关系源码编译安装Pytorch3d 总…

Day 65: 集成学习之 AdaBoosting (3. 集成器)

代码&#xff1a; package dl;import java.io.FileReader; import weka.core.Instance; import weka.core.Instances;/*** The booster which ensembles base classifiers.*/ public class Booster {/*** Classifiers.*/SimpleClassifier[] classifiers;/*** Number of classi…

解决报错:Can‘t connect to HTTPS URL because the SSL module is not available.

本人今天准备打开安装一个label-studio包&#xff0c;试了很多次&#xff0c;接连报如下错误&#xff0c;因此我就去找了一些解决方案&#xff0c;现在总结如下&#xff1a; 1、报错信息如下 2、解决方案如下&#xff1a; github上有对应的解决方案&#xff0c;链接&#xff…

教师ChatGPT的23种用法

火爆全网的ChatGPT&#xff0c;作为教师应该如何正确使用&#xff1f;本文梳理了教师ChatGPT的23种用法&#xff0c;一起来看看吧&#xff01; 1、回答问题 ChatGPT可用于实时回答问题&#xff0c;使其成为需要快速获取信息的学生的有用工具。 从这个意义上说&#xff0c;Cha…

安卓开发后台应用周期循环获取位置信息上报服务器

问题背景 最近有需求&#xff0c;在APP启动后&#xff0c;退到后台&#xff0c;还要能实现周期获取位置信息上报服务器&#xff0c;研究了一下实现方案。 问题分析 一、APP退到后台后网络请求实现 APP退到后台后&#xff0c;实现周期循环发送网络请求。目前尝试了两种方案是…

Sui Builder House巴黎站精彩集锦

Sui Builder House巴黎站于7月19日圆满结束&#xff0c;Mysten Labs联合创始人兼CTO的Sam Blackshear在活动上发表了主题演讲。两天的Builder House活动还邀请了Mysten Labs的其他杰出成员分享Sui的发展情况和近期进展&#xff0c;社区成员展示了自己项目并提供见解&#xff0c…

C++继承体系中,基类析构函数请加上virtual,设置为虚函数

为什么建议在存在继承体系时刻我们的类的析构函数加上virtual呢&#xff1f; 大家看段代码。 咋一看&#xff0c;没什么毛病这段代码&#xff0c;让我们画图理解下。 紫框中的前4个字节指向new开辟的空间。 我们知道&#xff0c;当基类A指针指向基类B时候会发生切片 当我们del…

小程序如何修改商品

​商家可能会遇到需要修改产品信息的情况。无论是价格调整、库存更新还是商品描述的修改&#xff0c;小程序提供了简便的方式来帮助你们完成这些操作。下面是一些简单的步骤和注意事项&#xff0c;帮助你们顺利地修改商品。 一、进入商品管理页面 在个人中心点击管理入口&…

工厂电力监控解决方案

1、概述 电力监控系统实现对变压器、柴油发电机、断路器以及其它重要设备进行监视、测量、记录、报警等功能&#xff0c;并与保护设备和远方控制中心及其他设备通信&#xff0c;实时掌握供电系统运行状况和可能存在的隐患&#xff0c;快速排除故障&#xff0c;提高工厂供电可靠…

2023年Q2京东环境电器市场数据分析(京东数据产品)

今年Q2&#xff0c;环境电器市场中不少类目表现亮眼&#xff0c;尤其是以净水器、空气净化器、除湿机等为代表的环境健康电器。此外&#xff0c;像冷风扇这类具有强季节性特征的电器也呈现出比较好的增长态势。 接下来&#xff0c;结合具体数据我们一起来分析Q2环境电器市场中…

承接箱体透明拼接屏项目时,需要注意哪些事项?

承接箱体透明拼接屏项目时&#xff0c;需要注意以下事项&#xff1a; 确定需求&#xff1a;在承接箱体透明拼接屏项目之前&#xff0c;需要明确客户的需求&#xff0c;包括屏幕的大小、分辨率、亮度、色彩等参数&#xff0c;以及使用的环境、观看距离和观看角度等。 材料选择&…

图文教程:如何在 3DS Max 中创建3D迷你卡通房屋

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中&#xff0c;我们将学习如何创建一个有趣的、低多边形的迷你动画房子&#xff0c;你可以在自己的插图或视频游戏项目中使用它。您将学习的一些技能将包括创建基本的3D形状和基本的建模技术。让我…

最简单的固定表格列实现

ref: https://dev.to/nicolaserny/table-with-a-fixed-first-column-2c5b 假设我们现在有这样一个表格 <table><thead><tr><th>姓名</th><th>性别</th><th>民族</th><th>年龄</th><th>籍贯</th>…

好用的敏捷开发项目管理工具有哪些?这3款真的绝绝子!

随着数字化的转型和企业团队成员不断追求高效的工作效率&#xff0c;越来越多优质的敏捷开发项目管理工具&#xff0c;深受广大管理者的青睐。今天我将通过这篇文章为大家介绍3款非常好用的开发项目管理工具&#xff0c;建议收藏起来&#xff01; ​ 1.boardmix boardmix博思…

Jmeter 中 Beanshell 的使用

目录 前言&#xff1a; Beanshell 介绍 常用内置变量 log vars 和 props vars 常用方法&#xff1a; props 常用方法&#xff1a; prev 综合运用 前言&#xff1a; JMeter 是一个广泛使用的性能测试工具&#xff0c;它支持许多不同的测试技术和方法。其中&#xff0c…

浏览器协议TCP详解

浏览器协议TCP详解 浏览器进程负责存储、界面、下载等管理。在渲染进程中&#xff0c;运行着熟知的主线程、合成线程、JavaScript 解释器、排版引擎等。 浏览器进程处理用户在地址栏的输入&#xff0c;然后将 URL 发送给网络进程。网络进程发送 URL 请求&#xff0c;在接收到响…

【Yolov8自动标注数据集完整教程】

Yolov8自动标注数据集完整教程 1 前言2 先手动标注数据集&#xff0c;训练出初步的检测模型2.1 手动标注数据集2.2 Yolov8环境配置2.2.1 Yolov8下载2.2.2 Yolov8环境配置 2.3 Yolov8模型训练&#xff0c;得到初步的检测模型2.3.1 训练方式 3 使用初步的检测模型实现自动数据集标…

STM32 I2C OVR 错误

一、问题 STM32 I2C 用作从机时&#xff0c;开启如下中断并启用 callback 回调函数。 每一次复位后&#xff0c;从机都可以正常触发地址匹配中断ADDR&#xff0c;之后在该中断的回调函数中启用接收中断去收取数据时&#xff0c;却无法进入RXNE中断&#xff0c;而是触发了 OVR …

《数据分析-JiMuReport08》JiMuReport报表开发-报表列数量开发限制调整

JiMuReport报表开发列数量限制调整 1.开发列数限制 JiMuReport报表在开发的时候&#xff0c;需要100-200列的数据&#xff0c;但是在设计到一定数量的时候&#xff0c;水平下拉框就不能滑动了 2.报表参数调整 col: n 在application.yml文件的jmreport配置处&#xff0c;如果想…

【C++】特殊类的设计 | 类型转换

文章目录 1. 特殊类的设计单例模式饿汉模式具体代码 懒汉模式具体代码 懒汉模式和饿汉模式的优缺点 2. C的类型转换C语言的类型转换C的类型转换static_castreinterpret_castconst_castdynamic_cast 1. 特殊类的设计 单例模式 设计模式是 被反复使用 多数人知晓 经过分类的、代…