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代码和…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
