当前位置: 首页 > news >正文

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&#xff08;默认有RedisTemplate&#…...

Python 包镜像源

阿里云、清华大学和豆瓣之外&#xff0c;还有许多其他的 Python 包镜像源。下面是更新后的代码&#xff0c;增加了更多常用的镜像源&#xff0c;如华为云、腾讯云等 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模式同样可以用来观测电源网络的自阻抗&#xff0c;以下图为例进行说明 2D 视图 3D view 本例要观测的是U17端口处的自阻抗&#xff0…...

Unity3D ASTC贴图压缩格式详解

一、技术详解 ASTC&#xff08;Adaptive Scalable Texture Compression&#xff09;是一种先进的纹理压缩格式&#xff0c;特别适用于OpenGL ES 3.0及更高版本。ASTC在2012年推出&#xff0c;自那以后已经成为游戏开发中重要的纹理压缩技术。它不仅在iOS设备上得到广泛应用&am…...

Docker的轻量级可视化工具Portainer

docker目录 1 Portainer官方链接2 是什么&#xff1f;3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接&#xff1a;https://www.portainer.io/ portainer安装的官方链接&#xff1a;https://docs.portainer.io/start/install-ce/server/docker/l…...

udp丢包问题

udp或者tcp丢包问题监测方式&#xff1a; netstat -su 问题分析&#xff1a; 1. 内存 2. cpu 3. 发送接收缓存 动画图解 socket 缓冲区的那些事儿-CSDN博客...

儿童安全座椅行业全面深入分析

儿童安全座椅就是一种专为不同体重&#xff08;或年龄段&#xff09;的儿童设计&#xff0c;将孩子束缚在安全座椅内&#xff0c;能有效提高儿童乘车安全的座椅。欧洲强制性执行标准ECE R44/03的定义是&#xff1a;能够固定到机动车辆上&#xff0c;带有ISOFIX接口、LATCH接口的…...

【笔记】扩散模型(九):Imagen 理论与实现

论文链接&#xff1a;Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现&#xff1a;lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作&#xff0c;这个工作并没有沿用 Stable Diffusion 的架构&#xff0c;而是级…...

05 SQL炼金术:深入探索与实战优化

文章目录 SQL炼金术&#xff1a;深入探索与实战优化一、SQL解析与执行计划1.1 获取执行计划1.2 解读执行计划 二、统计信息与执行上下文2.1 收集统计信息2.2 执行上下文 三、SQL优化工具与实战3.1 SQL Profile3.2 Hint3.3 Plan Baselines3.4 实战优化示例 SQL炼金术&#xff1a…...

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权限管理 文件访问者的分类&#xff08;人&#xff09; 文件类型和访问权限&#xff08;事物属性&#xff09; 文件权限值的表示方法 文件访问权限的相关设置方法 如何改变文件的访问权限…...

考研要求掌握的C语言(选择排序)

选择排序的特点 每次进行一趟排序后&#xff0c;就确定一个数据的最终位置 选择排序的原理 就是假设你是最小&#xff08;最大数据&#xff09;的下标&#xff0c;然后和其他进行比较&#xff0c;若发现还有比你还小&#xff08;或还大&#xff09;的数据&#xff0c;就更新…...

达梦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实现文字渐变效果

效果图&#xff1a; 代码&#xff1a; h1 {font-size: 100px;color:linear-gradient(gold,deeppink);background-image:linear-gradient( -gold, deeppink); /*春意盎然*///背景被裁剪成文字的前景色。background-clip:text;/*兼容内核版本较低的浏览器*/-webkit-background-c…...

3. Redis的通用命令介绍

Redis作为一个高效的键值对存储系统&#xff0c;不仅支持多种数据结构&#xff0c;还提供了丰富的通用命令&#xff0c;这些命令适用于各种场景。本文将详细介绍Redis的常用通用命令&#xff0c;并结合具体应用场景&#xff0c;帮助你理解这些命令的功能与使用时机。 1. 键(key…...

[spark面试]spark与mapreduce的区别---在DAG方面

1、spark中的task是以线程实现的&#xff0c;而mapreduce中是以进程实现的。 进程的频繁启动和停止会增加资源的消耗。 2、spark中支持DAG&#xff0c;而mapreduce不支持DAG DAG的使用&#xff1a;为什么支持DAG会更加高效 1&#xff09;、在DAG图中&#xff0c;会将一个job…...

tomcat启动失败和缓存清理办法

tomcat只在学校接触过并且是在window xp和win7的电脑上配置过&#xff08;中途升级过电脑系统&#xff09;&#xff0c;只记得在windows系统上可以将其设置成服务管理。但我已毕业10多年了&#xff0c;学的知识早就不知道丢哪里了。这次为了修改一个07&#xff0c;08年的项目&a…...

【软件测试】需求的概念和常见模型(瀑布、螺旋、增量、迭代)

1. 什么是需求 在企业中&#xff0c;经常会听到&#xff1a;用户需求和软件需求 用户需求&#xff1a;没用经过合理的评估&#xff0c;通常就是一句话&#xff08;开发一个五彩斑斓的黑&#xff09;软件需求&#xff1a;开发人员和测试人员执行工作的依据 1.2 软件需求 在工…...

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…...

QT添加资源文件

QT添加资源文件 1.概述 这篇文章介绍为QT项目添加资源文件&#xff0c;例如项目中使用到的图片、音视频文件等等 2.添加资源文件 拷贝资源文件到项目中 在项目mainwindow.app文件上右键选择show in Finder 打开项目所在目录。 将图片文件夹复制到该目录中 创建资源文件结…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...