SpringBoot 2.x 整合 Redis

整合

1)添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 如果没有使用下面给出的工具类,那么就不需要引入 -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.2.4</version>
</dependency>

2)application.xml 配置

spring:redis:database: 0# ip 或者域名host: 192.168.224.128# 密码password: TO6Md91Advf# redis 默认端口是 6379port: 6379

3)配置 RedisTemplate

这里替换序列化器是因为 , RedisTemplate 默认的序列化方案是 JdkSerializationRedisSerializer,它将对象序列化为字节数组。

@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 自定义的string序列化器StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// jackson 序列化器GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// kv 序列化redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setValueSerializer(jsonRedisSerializer);// hash 序列化redisTemplate.setHashKeySerializer(stringRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}

使用例子

1)Redis 使用工具类

public class RedisUtil {@SuppressWarnings("unchecked")private static RedisTemplate<Object, Object> redisTemplate = SpringUtil.getBean("redisTemplate", RedisTemplate.class);/*** 指定键的值增加* @param key 键* @param num  要增加的数* @return*/public static int incrementInt(String key,int num){Long increment = redisTemplate.opsForValue().increment(key,num);return increment.intValue();}/*** 指定缓存失效时间** @param key  键* @param time 时间(秒)*/public static void expire(String key, long time) {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}}public static long getExpire(String key){return redisTemplate.getExpire(key);}/*** 普通缓存获取** @param key 键* @return 值*/public static Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 获取数据** @param key 键* @return 对应的键值*/public static Map<Object, Object> getMap(String key) {return redisTemplate.opsForHash().entries(key);}/*** 缓存放入** @param key   键* @param value 值*/public static void set(String key, Object value) {redisTemplate.opsForValue().set(key, value);}/*** 缓存放入** @param key   键* @param value 值* @param time  时间(秒)*/public static void set(String key, Object value, long time) {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}}/*** Map 缓存放入* @param key  键* @param map  对应多个键值*/public static void putMap(String key, Map<Object, Object> map) {redisTemplate.opsForHash().putAll(key, map);}/*** Map 缓存放入** @param key  键* @param map  对应多个键值* @param time 时间(秒)*/public static void putMap(String key, Map<Object, Object> map, long time) {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}}/*** list 缓存放入,尾部添加* @param key 键* @param value 值*/public static void pushList(String key, Object value) {redisTemplate.opsForList().rightPush(key, value);}/*** list 缓存放入,尾部添加, 批量存放 list* @param key* @param list*/public static void pushListAll(String key, List<Object> list) {if (list != null){redisTemplate.opsForList().rightPushAll(key, list);}}/*** 通过 key 获取 list*/public static List<Object> getAllList(String key){return redisTemplate.opsForList().range(key, 0, -1);}}

2)TestRdsController

如果没有使用 lomback,swagger,可以将对应的注解删除掉

/*** 用于测试 rds* @author fei**/
@Slf4j
@RestController
@RequestMapping("/")
@Api(value = "测试 RDS API", tags = {"测试 RDS API"})
public class TestRdsController extends BaseController {@AutowiredTestRdsService testRdsService;@GetMapping(value = "/rds/setString")@OperationLog(name="set String",type = OperationLogType.CREATE)@ApiOperation(value = "set String")public String rdsSetString(@ApiParam(value = "key", required = true) @RequestParam(value = "key")String key,@ApiParam(value = "value", required = true) @RequestParam(value = "value")String value) {testRdsService.rdsSetString(key, value);return "操作成功!");}@GetMapping(value = "/rds/getString")@ApiOperation(value = "get String")public String rdsGetString(@ApiParam(value = "key", required = true) @RequestParam(value = "key")String key) {String value = testRdsService.rdsGetString(key);return value;}@GetMapping(value = "/rds/putMap")@ApiOperation(value = "putMap")public String rdsPutMap(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key,@ApiParam(value = "name", required = true) @RequestParam(value = "name") String name,@ApiParam(value = "age", required = true) @RequestParam(value = "age") Integer age) {testRdsService.putMap(key, name, age);return "操作成功";}@GetMapping(value = "/rds/getMap")@ApiOperation(value = "getMap")public Map<Object, Object> getMap(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key) {Map<Object, Object> map = testRdsService.getMap(key);return map;}@GetMapping(value = "/rds/pushList")@ApiOperation(value = "list 缓存放入,尾部添加")public String pushList(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key,@ApiParam(value = "value", required = true) @RequestParam(value = "value") Object value) {testRdsService.pushList(key, value);return "操作成功";}@GetMapping(value = "/rds/pushAllList")@ApiOperation(value = "将list数据全部放入 list 缓存")public String pushAllList(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key,@ApiParam(value = "list", required = true) @RequestParam(value = "list") List<Object> list) {testRdsService.pushListAll(key, list);return "操作成功";}@GetMapping(value = "/rds/getAllList")@ApiOperation(value = "通过 key 获取所有 list")public List<Object> getAllList(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key) {List<Object> allList = testRdsService.getAllList(key);return allList;}}

3)TestRdsService

/**** @author fei* @create 2024/11/20 9:12**/
public interface TestRdsService {void rdsSetString(String key, String value);String rdsGetString(String key);void putMap(String key, String name, Integer age);Map<Object, Object> getMap(String key);void pushList(String key, Object value);void pushListAll(String key, List<Object> list);List<Object> getAllList(String key);}

4)TestRdsServiceImpl

/**** @author fei* @create 2024/11/20 9:12**/
@Service
public class TestRdsServiceImpl implements TestRdsService {@Overridepublic void rdsSetString(String key, String value) {RedisUtil.set(key, value);}@Overridepublic String rdsGetString(String key) {Object o = RedisUtil.get(key);if (o == null){return "";}return (String)o;}@Overridepublic void putMap(String key, String name, Integer age) {Map<Object, Object> map = new HashMap<>();map.put("name", name);map.put("age", age);RedisUtil.putMap(key, map, 10000);}@Overridepublic Map<Object, Object> getMap(String key) {return RedisUtil.getMap(key);}@Overridepublic void pushList(String key, Object value) {RedisUtil.pushList(key, value);}@Overridepublic void pushListAll(String key, List<Object> list) {RedisUtil.pushListAll(key, list);}@Overridepublic List<Object> getAllList(String key) {return RedisUtil.getAllList(key);}}

5)测试

最后可以使用 swagger 或者 Apifox 等工具调用接口测试,或者直接写个测试用例也可以

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

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

相关文章

DICOM核心概念:显式 VR(Explicit VR)与隐式 VR(Implicit VR)在DICOM中的定义与区别

在DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;标准中&#xff0c;VR&#xff08;Value Representation&#xff09; 表示数据元素的值的类型和格式。理解显式 VR&#xff08;Explicit VR&#xff09;与隐式 VR&#xff08;Implicit VR&#…

2、桥接模式

模式解释 百度&#xff1a; 这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的交流调用。这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类的功能独立于接口实现类&#xff0c;这两种类型的类可被结构化…

小程序-基于java+SpringBoot+Vue的开放实验室预约管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【JavaSE】【网络编程】UDP数据报套接字编程

目录 一、网络编程简介二、Socket套接字三、TCP/UDP简介3.1 有连接 vs 无连接3.2 可靠传输 vs 不可靠传输3.3 面向字节流 vs 面向数据报3.4 双向工 vs 单行工 四、UDP数据报套接字编程4.1 API介绍4.1.1 DatagramSocket类4.1.1.1 构造方法4.1.1.2 主要方法 4.1.2 DatagramPocket…

SpringBoot集成多个rabbitmq

1、pom文件 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><versio…

第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令

文章目录 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令TCP 设备的 READ 命令READ 修改 $ZA 和 $ZB$ZA 和 READ 命令 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令 TCP 设备的 READ 命令 从服务器或客户端发出 READ 命令以读取客户端或服务器设置的…

【K8S系列】Kubernetes Pod节点ImagePullBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;当某个 Pod 的容器无法从指定的镜像仓库拉取镜像时&#xff0c;Pod 的状态会变为 ImagePullBackOff。这通常是因为指定的镜像不存在、镜像标签错误、认证失败或网络问题等原因。 以下是关于 ImagePullBackOff 的详细分析及解决方案。 1. ImagePull…

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源 由于需要在 Linux 环境下进行一些测试工作&#xff0c;于是决定使用 VMware 虚拟化软件来安装 Ubuntu 24.04 .1操作系统。考虑到测试过程中需要访问 Github &#xff0c;要使用Docker拉去镜像等外部网络资源&#xff0c;因此产…

前列腺分割:基于边界加权(解决弱边界)、域自适应(少样本)

前列腺分割&#xff1a;基于边界加权&#xff08;解决弱边界&#xff09;、域自适应&#xff08;少样本&#xff09; 理解发现规律论文大纲观察1. 观察行为2. 变量分析3. 假设提出4. 验证过程 解法拆解 论文&#xff1a;Boundary-weighted Domain Adaptive Neural Network for …

鼠标绘制轮廓

需要对label进行提升&#xff0c;新建MyLabel类&#xff0c;并将其提升到label控件上&#xff0c;详见上篇控件提升 mylabelmouse.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_mylabelmouse.h" #include <QMenu> #include "My…

C语言-详细讲解-冒泡排序与选择排序

1.冒泡排序 冒泡排序是一种比较简单的排序算法。它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个名字的由来是因为越小&a…

MATLAB常见数学运算函数

MATLAB中含有许多有用的函数,可以随时调用。 a b s abs abs函数 a b s abs abs函数在MATLAB中可以求绝对值,也可以求复数的模长:c e i l ceil ceil函数 向正无穷四舍五入(如果有小数,就向正方向进一)f l o o r floor floor函数 向负无穷四舍五入(如果有小数,就向负方向…

SpringBoot 集成 Sharding-JDBC(一):数据分片

在深入探讨 Sharding-JDBC 之前&#xff0c;建议读者先了解数据库分库分表的基本概念和应用场景。如果您还没有阅读过相关的内容&#xff0c;可以先阅读我们之前的文章&#xff1a; 关系型数据库海量数据存储策略-CSDN博客 这篇文章将帮助您更好地理解分库分表的基本原理和实现…

go-zero(六) JWT鉴权

go-zero JWT鉴权 还记得我们之前登录功能&#xff0c;返回的信息是token吗&#xff1f; 这个token其实就是JSON Web Token简称JWT,它是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用环境间安全地传递声明信息。 它是一种基于 JSON 的令牌&#xf…

Flink是如何实现 End-To-End Exactly-once的?

flink 如何实现端到端的 Exactly-once? 端到端包含 Source, Transformation,Sink 三部分的Exactly-once Source&#xff1a;支持数据的replay&#xff0c;如Kafka的offset。Transformation&#xff1a;借助于checkpointSink&#xff1a;Checkpoint 两阶段事务提交 两阶段提…

ZYNQ程序固化——ZYNQ学习笔记7

一、ZYNQ启动过程 二、 SD卡启动实操 1、对ZYNQ进行配置添加Flash 2、添加SD卡 3、重新生成硬件信息 4、创建vitis工程文件 5、勾选板级支持包 6、对系统工程进行整体编译&#xff0c;生成两个Debug文件&#xff0c;如图所示。 7、插入SD卡&#xff0c;格式化为 8、考入BOOT.…

python移动鼠标但不显示移动轨迹

如果需要完全隐藏鼠标的移动轨迹&#xff0c;可以尝试通过以下两种方法解决&#xff1a; 方法 1&#xff1a;直接移动到目标点进行点击 通过直接设置鼠标的最终位置而不模拟移动&#xff0c;可以避免显示鼠标的移动轨迹。以下是优化代码&#xff1a; import pyautogui import…

进程其他知识点

/* #include <stdlib.h> void exit(int status); #include <unistd.h> void _exit(int status); status 参数&#xff1a;是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。 */ #include <stdio.h> #include <stdlib.h> #include &…

Go语言内存分配源码分析学习笔记

大家好&#xff0c;我是V 哥。GO GO GO&#xff0c;今天来说一说Go语言内存分配问题&#xff0c;Go语言内存分配的源码主要集中在runtime包中&#xff0c;它实现了Go语言的内存管理&#xff0c;包括初始化、分配、回收和释放等。下面来对这些过程详细分析一下&#xff0c;先赞后…

Android ART知多少?

Android 虚拟机 ART&#xff08;Android Runtime&#xff09;是 Android 平台上的应用程序运行时环境&#xff0c;用于执行应用程序的字节码。ART 自 Android 5.0&#xff08;Lollipop&#xff09;开始取代了 Dalvik&#xff0c;成为 Android 的默认运行时环境。本文将从以下几…