spring—boot(整合redis)
整合redis
第一步导入数据源
<!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
RedisConfig(默认有RedisTemplate,下面为自定义)
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 配置redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(redisConnectionFactory);RedisSerializer stringSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringSerializer); // key序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value序列化redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); // Hash value序列化redisTemplate.afterPropertiesSet();return redisTemplate;}
}
编写yml配置文件,对redis进行配置
spring:
redis:
host: 127.0.0.1
port: 6379
password: //最基本的配置到此即可
lettuce:
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)默认为8
max-wait: -1ms #连接池最大阻塞等待时间(使用负值表示没有限制)默认为-1
max-idle: 8 #连接池中的最大空闲连接 默认为8
min-idle: 5 # 连接池中的最小空闲连接 默认为0
创建服务层和实现类
public interface RedisService {
void setObj(String key, Object obj, long timeout);
void setObj(String key, Object obj);
Object getObj(String key);
}
package com.zking.zmall.service.impl;import com.zking.zmall.service.RedisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.concurrent.TimeUnit;// 定义一个Redis服务实现类,用于操作Redis数据 @Service("redisService") public class RedisServiceImpl implements RedisService {// 自动注入RedisTemplate,用于执行Redis操作@Autowiredprivate RedisTemplate redisTemplate;/*** 设置一个键值对对象到Redis中,并指定过期时间** @param key Redis中的键* @param obj 要保存的对象* @param timeout 对象的过期时间,单位:秒*/@Overridepublic void setObj(final String key, Object obj, long timeout) {// 获取操作Redis中值的操作对象ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();// 保存对象到Redis,并设置过期时间operations.set(key, obj, timeout, TimeUnit.SECONDS);}/*** 设置一个键值对对象到Redis中,使用默认过期时间** @param key Redis中的键* @param obj 要保存的对象*/@Overridepublic void setObj(String key, Object obj) {// 调用另一个setObj方法,并设置默认过期时间为15分钟setObj(key,obj,60*60*15);}/*** 从Redis中获取指定键的对象** @param key Redis中的键* @return 对应键的对象,如果不存在则返回null*/@Overridepublic Object getObj(final String key) {// 获取操作Redis中值的操作对象,并根据键获取对象Object o = redisTemplate.opsForValue().get(key);return o;} }
创建测试类测试
package com.zking.zmall;import com.zking.zmall.service.RedisService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class RedisTest {@Autowiredprivate RedisService redisService;@Testpublic void testRedisService(){redisService.setObj("name","zhangsan");}
}
测试结果
做了RedisConfig配置 ,后结果(序列化配置)

利用redis提高性能
案例二(结合redis):
package com.zking.zmall.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zking.zmall.pojo.SysUser;
import com.zking.zmall.service.RedisService;
import com.zking.zmall.service.SysUserService;
import com.zking.zmall.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.Serializable;
/**
* @author lenovo
* @description 针对表【sys_user(用户信息表)】的数据库操作Service实现
* @createDate 2024-11-03 15:24:57
*/
@Service
@Slf4j
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
implements SysUserService {// 注入RedisService用于缓存操作
@Autowired
private RedisService redisService;/**
* 根据用户ID获取用户信息,优先从缓存中获取,若缓存不存在则从数据库中获取并存入缓存
* @param id 用户ID
* @return 用户信息
*/
@Override
public SysUser getById(Serializable id){
// 尝试从缓存中获取用户信息
SysUser sysUser = (SysUser) redisService.getObj("zmall:sys:user:"+id);
if (sysUser==null){
// 若缓存中无数据,记录日志并从数据库中查询
log.info("从数据库查询");
sysUser = getBaseMapper().selectById(id);
// 将从数据库中查询到的数据存入缓存
redisService.setObj("zmall:sys:user:"+id,sysUser);
}
return sysUser;
}
}
提高性能:
减少数据库访问:通过先从Redis缓存中获取用户信息,减少了对数据库的直接访问次数,从而减轻了数据库的负载,提高了系统的响应速度。
快速响应:缓存中的数据访问速度远快于数据库,因此能够快速返回用户信息,提升用户体验。
如何切换连接池
简单了解
Jedis vs Lettuce
Jedis 和 Lettuce 是 Java 操作 Redis 的客户端。在 Spring Boot 1.x 版本默认使用的是 jedis ,而在 Spring Boot 2.x 版本默认使用的就是Lettuce。关于 Jedis 跟 Lettuce 的区别如下:
Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接 Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
Lettuce
上面有
jedis
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>//排除
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
yml
spring:
redis:
host: 127.0.0.1
port: 6379
password:
jedis:
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)默认为8
max-wait: -1ms #连接池最大阻塞等待时间(使用负值表示没有限制)默认为-1
max-idle: 8 #连接池中的最大空闲连接 默认为8
min-idle: 5 # 连接池中的最小空闲连接 默认为0
相关文章:
spring—boot(整合redis)
整合redis 第一步导入数据源 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> RedisConfig(默认有RedisTemplate&#…...
Python 包镜像源
阿里云、清华大学和豆瓣之外,还有许多其他的 Python 包镜像源。下面是更新后的代码,增加了更多常用的镜像源,如华为云、腾讯云等 import tkinter as tk from tkinter import messagebox import os# 定义 pip 配置文件路径 pip_config_file …...
Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行电源阻抗仿真分析操作指导(一)-无电容
Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行电源阻抗仿真分析操作指导(一)-无电容 Sigrity Power Ground Noise Simulation模式同样可以用来观测电源网络的自阻抗,以下图为例进行说明 2D 视图 3D view 本例要观测的是U17端口处的自阻抗࿰…...
Unity3D ASTC贴图压缩格式详解
一、技术详解 ASTC(Adaptive Scalable Texture Compression)是一种先进的纹理压缩格式,特别适用于OpenGL ES 3.0及更高版本。ASTC在2012年推出,自那以后已经成为游戏开发中重要的纹理压缩技术。它不仅在iOS设备上得到广泛应用&am…...
Docker的轻量级可视化工具Portainer
docker目录 1 Portainer官方链接2 是什么?3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接:https://www.portainer.io/ portainer安装的官方链接:https://docs.portainer.io/start/install-ce/server/docker/l…...
udp丢包问题
udp或者tcp丢包问题监测方式: netstat -su 问题分析: 1. 内存 2. cpu 3. 发送接收缓存 动画图解 socket 缓冲区的那些事儿-CSDN博客...
儿童安全座椅行业全面深入分析
儿童安全座椅就是一种专为不同体重(或年龄段)的儿童设计,将孩子束缚在安全座椅内,能有效提高儿童乘车安全的座椅。欧洲强制性执行标准ECE R44/03的定义是:能够固定到机动车辆上,带有ISOFIX接口、LATCH接口的…...
【笔记】扩散模型(九):Imagen 理论与实现
论文链接:Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现:lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作,这个工作并没有沿用 Stable Diffusion 的架构,而是级…...
05 SQL炼金术:深入探索与实战优化
文章目录 SQL炼金术:深入探索与实战优化一、SQL解析与执行计划1.1 获取执行计划1.2 解读执行计划 二、统计信息与执行上下文2.1 收集统计信息2.2 执行上下文 三、SQL优化工具与实战3.1 SQL Profile3.2 Hint3.3 Plan Baselines3.4 实战优化示例 SQL炼金术:…...
Linux用lvm格式挂载磁盘
Linux用lvm格式挂载磁盘 本次目标是将磁盘/dev/sdd以lvm格式挂载到/backup目录作为备份盘来用 1、查看当前磁盘 [rootquentin ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 300G 0 disk ├─sda1 8:1 0 1G…...
Xshell,Shell的相关介绍与Linux中的权限问题
目录 XShell的介绍 Shell的运行原理 Linux当中的权限问题 Linux权限的概念 Linux权限管理 文件访问者的分类(人) 文件类型和访问权限(事物属性) 文件权限值的表示方法 文件访问权限的相关设置方法 如何改变文件的访问权限…...
考研要求掌握的C语言(选择排序)
选择排序的特点 每次进行一趟排序后,就确定一个数据的最终位置 选择排序的原理 就是假设你是最小(最大数据)的下标,然后和其他进行比较,若发现还有比你还小(或还大)的数据,就更新…...
达梦8数据库适配ORACLE的8个参数
目录 1、概述 1.1 概述 1.2 实验环境 2、参数简介 3、实验部分 3.1 参数BLANK_PAD_MODE 3.2 参数COMPATIBLE_MODE 3.3 参数ORDER_BY_NULLS_FLAG 3.4 参数DATETIME_FMT_MODE 3.5 参数PL_SQLCODE_COMPATIBLE 3.6 参数CALC_AS_DECIMAL 3.7 参数ENABLE_PL_SYNONYM 3.8…...
CSS实现文字渐变效果
效果图: 代码: h1 {font-size: 100px;color:linear-gradient(gold,deeppink);background-image:linear-gradient( -gold, deeppink); /*春意盎然*///背景被裁剪成文字的前景色。background-clip:text;/*兼容内核版本较低的浏览器*/-webkit-background-c…...
3. Redis的通用命令介绍
Redis作为一个高效的键值对存储系统,不仅支持多种数据结构,还提供了丰富的通用命令,这些命令适用于各种场景。本文将详细介绍Redis的常用通用命令,并结合具体应用场景,帮助你理解这些命令的功能与使用时机。 1. 键(key…...
[spark面试]spark与mapreduce的区别---在DAG方面
1、spark中的task是以线程实现的,而mapreduce中是以进程实现的。 进程的频繁启动和停止会增加资源的消耗。 2、spark中支持DAG,而mapreduce不支持DAG DAG的使用:为什么支持DAG会更加高效 1)、在DAG图中,会将一个job…...
tomcat启动失败和缓存清理办法
tomcat只在学校接触过并且是在window xp和win7的电脑上配置过(中途升级过电脑系统),只记得在windows系统上可以将其设置成服务管理。但我已毕业10多年了,学的知识早就不知道丢哪里了。这次为了修改一个07,08年的项目&a…...
【软件测试】需求的概念和常见模型(瀑布、螺旋、增量、迭代)
1. 什么是需求 在企业中,经常会听到:用户需求和软件需求 用户需求:没用经过合理的评估,通常就是一句话(开发一个五彩斑斓的黑)软件需求:开发人员和测试人员执行工作的依据 1.2 软件需求 在工…...
Python爬虫如何处理验证码与登录
Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时,通常会遇到两个主要问题:登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码,以便进…...
QT添加资源文件
QT添加资源文件 1.概述 这篇文章介绍为QT项目添加资源文件,例如项目中使用到的图片、音视频文件等等 2.添加资源文件 拷贝资源文件到项目中 在项目mainwindow.app文件上右键选择show in Finder 打开项目所在目录。 将图片文件夹复制到该目录中 创建资源文件结…...
CHORD-X从零开始:C语言基础概念学习报告自动生成教程
CHORD-X从零开始:C语言基础概念学习报告自动生成教程 你是不是也遇到过这样的烦恼?作为编程老师,每次讲完C语言的指针、结构体这些难点,总想给学生一份清晰易懂的复习报告,但自己动手整理又太花时间。或者,…...
2026考公全攻略:在校生如何选岗、如何备考、如何上岸一次讲清
很多在校生最近都在问:现在开始准备公务员考试,还来得及吗先说结论:来得及,但前提是你要走对路径这几年考公环境已经发生明显变化报考人数持续增加岗位信息越来越透明单纯刷题已经不再有效考公正在从拼努力,变成拼策略…...
OpenClaw性能调优:Qwen3-32B镜像的批处理与并发控制
OpenClaw性能调优:Qwen3-32B镜像的批处理与并发控制 1. 为什么需要性能调优 当我第一次在RTX4090D上部署Qwen3-32B模型并接入OpenClaw时,本以为24GB显存足以应对各种任务。但现实很快给了我一记重拳——当我尝试批量处理100个文档时,系统不…...
ArcGIS Desktop绘图工具条实战:从基础图形到专业地图注记的进阶指南
1. ArcGIS绘图工具条初探:你的地图设计起点 第一次打开ArcGIS Desktop的绘图工具条时,我就像拿到了一盒全新的彩色铅笔。这个看似简单的工具条,实际上包含了从基础绘图到专业地图注记的全套功能。绘图工具条位于软件界面顶部,右键…...
3个步骤打造静音散热系统:FanControl 262版智能风扇调控方案全解析
3个步骤打造静音散热系统:FanControl 262版智能风扇调控方案全解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub…...
半导体仿真进阶:如何用Silvaco DOPING语句精确控制掺杂分布
半导体仿真进阶:如何用Silvaco DOPING语句精确控制掺杂分布 在半导体器件设计与工艺开发中,精确控制掺杂分布是决定器件性能的关键因素之一。Silvaco TCAD工具链中的DOPING语句,为工程师提供了从简单均匀掺杂到复杂梯度分布的灵活控制能力。…...
5分钟搞懂3GPP NTN标准:从Release16到19的关键技术演进与实战应用
5分钟搞懂3GPP NTN标准:从Release16到19的关键技术演进与实战应用 当全球通信行业将目光投向低轨卫星星座与高空平台时,3GPP的NTN(非地面网络)标准正在重塑连接边界。本文将以工程师视角,带您穿透技术文档迷雾…...
手把手教你用ESP8266 AT指令连接华为云IoT(附固件烧录与MQTT避坑指南)
从零玩转ESP8266:华为云IoT连接实战与深度排错指南 当你第一次拿到那块拇指大小的ESP8266模块时,可能不会想到这个售价不到20元的Wi-Fi芯片能成为物联网世界的通行证。作为全球使用量最大的IoT连接方案之一,ESP8266配合华为云物联网平台&…...
别再硬编码了!Qt QTabBar标签宽度自适应窗体的5种实战方案对比(附完整代码)
Qt QTabBar标签宽度自适应窗体的5种实战方案深度评测 每次看到Qt界面中那些挤在一起或稀疏分布的标签页,总让人想起超市货架上摆放不齐的商品——既影响美观又降低使用效率。作为中级Qt开发者,你一定遇到过这样的困境:当窗体尺寸变化时&#…...
水库调度员必看:动态规划在月度发电计划中的5个避坑指南
水库调度员实战指南:动态规划在月度发电计划中的5个关键避坑策略 在水利工程领域,水库调度是一项集科学性、技术性和艺术性于一体的复杂工作。作为水库调度员,我们每天都在与时间、水量和电力需求进行着精妙的博弈。而动态规划作为一种强大的…...
