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 等工具调用接口测试,或者直接写个测试用例也可以
相关文章:
SpringBoot 2.x 整合 Redis
整合 1)添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 如果没有使用下面给出的工具类,那么就不需要引入 -…...
React的API✅
createContext createContext要和useContext配合使用,可以理解为 “React自带的redux或mobx” ,事实上redux就是用context来实现的。但是一番操作下来我还是感觉,简单的context对视图的更新的细粒度把控比不上mobx,除非配合memo等…...
什么是全渠道客服中心?都包括哪些电商平台?
什么是全渠道客服中心?都包括哪些电商平台? 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 全渠道客服中心是一种能够同时接入并处理来自多个渠道客户咨询和请求的综合服务平台。以…...
Jtti:如何知晓服务器的压力上限?具体的步骤和方法
了解服务器的压力上限(也称为性能极限或容量)是确保系统在高负载下仍能稳定运行的重要步骤。这通常通过压力测试(也称为负载测试或性能测试)来实现。以下是详细的步骤和方法来确定服务器的压力上限: 1. 定义测试目标和指标 在进行压力测试前,明确测试目标…...
贪心算法(1)
目录 柠檬水找零 题解: 代码: 将数组和减半的最少操作次数(大根堆) 题解: 代码: 最大数(注意 sort 中 cmp 的写法) 题解: 代码: 摆动序列࿰…...
SpringBoot,IOC,DI,分层解耦,统一响应
目录 详细参考day05 web请求 1、BS架构流程 2、RequestParam注解 完成参数名和形参的映射 3、controller接收json对象,使用RequestBody注解 4、PathVariable注解传递路径参数 5、ResponseBody(return 响应数据) RestController源码 6、统一响…...
目标驱动学习python动力
文章目录 迟迟未开始的原因打破思维里的围墙抛砖引玉爬虫 结束词 迟迟未开始的原因 其实我也是很早就知道有python,当时听说这个用于做测试不错,也就一直没有提起兴趣,后来人工智能火了之后,再次接触python,安装好pyth…...
力扣-Hot100-回溯【算法学习day.39】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
小熊派Nano接入华为云
一、华为云IoTDA创建产品 创建如下服务,并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码:小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…...
【linux硬件操作系统】计算机硬件常见硬件故障处理
这里写目录标题 一、故障排错的基本原则二、硬件维护注意事项三、关于最小化和还原出厂配置四、常见故障处理及调试五、硬盘相关故障六、硬盘相关故障:硬盘检测问题七、硬盘相关故障:自检硬盘报错八、硬盘相关故障:硬盘亮红灯九、硬盘相关故障…...
谈学生公寓安全用电系统的涉及方案
学生公寓安全 学生公寓安全用电系统的设计方案主要包括以下几个方面: 电气线路设计: 合理布线:确保所有电气线路按照国家或地区的电气安全标准进行设计,避免线路过载和短路。使用阻燃材料:选用阻燃或低…...
自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Go 语言数组
Go 语言数组 引言 Go 语言是一种静态类型、编译型语言,由 Google 开发,旨在提高多核处理器下的编程效率。数组作为 Go 语言中的一种基本数据结构,提供了存储一系列具有相同类型元素的能力。本文将深入探讨 Go 语言中数组的使用方法、特性以…...
13. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--完善TODO标记的代码
这篇文章特别短,短到可以作为一篇文章的一个章节,那让我们开始吧 一、编写代码 我们在代码中标记了大量的TODO标记,并且注明了这里暂时写死,等权限和授权完成后再改为动态获取这句话。那么到目前为止和权限有关的代码已经完成了…...
深入剖析Java内存管理:机制、优化与最佳实践
🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 深入剖析Java内存管理:机制、优化与最佳实践 一、Java内存模型概述 1. Java内存模型的定义与作…...
【Amazon】亚马逊云科技Amazon DynamoDB 实践Amazon DynamoDB
Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务,专为高性能和可扩展性设计,特别适合需要快速响应和高吞吐量的应用场景,如移动应用、游戏、物联网和实时分析等。 工作原理 Amazon DynamoDB 在任何规模下响应时间一律达毫秒级ÿ…...
Qt-常用的显示类控件
QLabel QLabel有如下核心属性: 关于文本格式的验证: 其中<b>xxx<b>,就是加粗的意思。 效果: 或者再把它改为markdown形式的: 在markd中,#就是表示一级标题,我们在加上##后&#x…...
LabVIEW内燃机缸压采集与分析
基于LabVIEW开发的内燃机缸压采集与分析系统结合高性能压力传感器和NI数据采集设备,实现了内燃机工作过程中缸压的实时监测与分析,支持性能优化与设计改进。文中详细介绍了系统的开发背景、硬件组成、软件设计及其工作原理,展现了完整的开发流…...
【Linux学习】【Ubuntu入门】1-7 ubuntu下磁盘管理
1.准备一个U盘或者SD卡(插上读卡器),将U盘插入主机电脑,右键点击属性,查看U盘的文件系统确保是FAT32格式 2.右键单击ubuntu右下角图标,将U盘与虚拟机连接 参考链接 3. Ubuntu磁盘文件:/dev/s…...
VScode clangd插件安装
前提 在VScode中写C代码时,总会用到 C/C 这个插件,也就自然而然地使用了这个插件带来的代码跳转和代码提示功能。但是当代码变地很多时,就会变得非常慢。所以经过调查后弃用C/C 插件的这个功能,使用 clangd 这个插件来提示C代码和…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
