【Redis学习笔记03】Java客户端
1. 初识Jedis
Jedis的官网地址:https://github.com/redis/jedis
1.1 快速入门
使用步骤:
注意:如果是云服务器用户使用redis需要先配置防火墙!
-
引入maven依赖
<dependencies><!-- 引入Jedis依赖 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.0</version></dependency><!-- 引入单元测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.1</version><scope>test</scope></dependency> </dependencies>
-
建立连接
@BeforeEach void setUp() {jedis = new Jedis("114.55.236.21:22", 6379);jedis.auth("123456");jedis.select(0); }
-
测试String类的方法
@Test void testString() {// 1. 尝试set方法jedis.set("name", "wjj");// 2. 尝试get方法String name = jedis.get("name");System.out.println(name); }
-
释放连接
@AfterEach void tearDown() {if (jedis != null) {jedis.close();} }
运行结果:
2. 使用Jedis连接池
由于Jedis是线程不安全的,并且频繁创建销毁线程具有很大开销,因此我推荐使用连接池的方式使用Jedis
使用步骤:
-
使用连接池创建连接工厂类
/*** 基于连接池实现连接工厂类*/ public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 1. 创建连接池配置JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(8); // 最大连接数config.setMaxIdle(8); // 最大空闲连接数config.setMinIdle(0); // 最小空闲连接数config.setMaxWaitMillis(200); // 最长等待时间// 2. 创建JedisPool连接池jedisPool = new JedisPool(config, "114.55.236.21", 6379, 1000, "123456");}public static Jedis getConnection() {return jedisPool.getResource();} }
-
编写测试类测试Hash类型方法
public class TestJedisPool {private Jedis jedis;@BeforeEachvoid setUp() {jedis = JedisConnectionFactory.getConnection();}@Testvoid testHash() {// 1. 使用hset方法jedis.hset("user:1", "name", "rice");jedis.hset("user:1", "age", "22");// 2. 使用hgetAll方法Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@AfterEachvoid tearDown() {if (jedis != null) {jedis.close();}} }
运行结果:
2. 使用SpringBoot整合Redis
现在基于SpringBoot整合Redis已经成为企业的标配,其中SpringDataRedis
就是专门用来操作Redis的集成模块,其具有以下特点:
- 提供了对不同客户端的整合,比如Jedis和Lettuce
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis的哨兵和集群
- 支持Lettuce的响应式编程
- 支持基于JDK、JSON、String等对象的序列化和反序列化
- 支持基于Redis的JDKCollection实现
2.1 SpringDataRedis快速入门
使用步骤:
-
引入maven依赖
<!-- redis依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 连接池依赖 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version> </dependency>
-
在
application.yml
中配置相关参数# 配置redis spring:data:redis:host: 114.55.236.21port: 6379password: 123456lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 200
由于Spring官方默认使用lettuce作为客户端,因此如果想要使用Jedis的配置,还需要引入Jedis的maven依赖
-
在测试类中自动装配RedisTemplate对象
@Autowired private RedisTemplate redisTemplate;
-
创建测试类测试redisTemplate的使用
@SpringBootTest class SpringDataRedisDemoApplicationTests {@Resourcepublic RedisTemplate redisTemplate;@Testpublic void testString() {System.out.println(redisTemplate);// 1. 存入String类型数据redisTemplate.opsForValue().set("id", "1");// 2. 取出String类型数据Object id = redisTemplate.opsForValue().get("id");System.out.println(id);}}
运行结果:
但是我们发现其中插入了一个\xac\xed\x00\x05t\x00\x02id
这样不知名的key,但是貌似是我们在代码中插入的key值id,但是怎么会以这样的方式呈现呢?
我们追溯源码可以发现RedisTemplate中使用默认的序列化器就是JDK序列化器,其接收Object类型参数并转换成字节数组存入Redis中,但是我们发现具有以下问题:
- 可读性差
- 内存占用较大
因此我们更加建议使用String类型序列化器作为keySerializer,而使用JSON序列化器作为valueSerializer
2.2 使用自定义序列化器
使用步骤:
-
创建Redis配置类
RedisConfig.java
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// key和hashKey使用StringSerializerredisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value和hashValue使用GenericJackson2JsonRedisSerializerredisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return redisTemplate;} }
-
编写测试类
TestJsonSerializer.java
@SpringBootTest public class TestJsonSerializer {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testpublic void testJsonSerializer() {// 存放idredisTemplate.opsForValue().set("id", "2");// 取出idObject id = redisTemplate.opsForValue().get("id");System.out.println(id);} }
如果出现如下异常(莫慌,这是正常的!):
只要引入如下依赖即可:
<!-- 引入jackson-databind依赖 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.14.1</version>
</dependency>
运行结果:
此时可以发现id正常显示!
但是如果我们尝试将value设置为Java的对象,就会出现一定问题:
使用步骤:
-
创建pojo包下的实体类
User.java
@Data @NoArgsConstructor @AllArgsConstructor public class User {private Integer id;private String name;private Integer age; }
-
在测试类中新增测试方法
@Test public void testJsonObjectSerializer() {// 创建User类对象User user = new User(1, "zhangsan", 22);// 存放User对象redisTemplate.opsForValue().set("user:1", user);// 取出User对象User getUser = (User) redisTemplate.opsForValue().get("user:1");System.out.println(getUser); }
上述方法尝试将一个User类对象作为value,由于之前我们自定义了value的序列化器为JSON序列化器,因此其内部会自动进行序列化和反序列化
运行结果:
我们需要重点关注其中的@class
的字段内容,不难发现,RedisTemplate自动进行序列化和反序列化的依据就是利用Java的反射机制,因此需要保存类信息,但是这也引入了一个严重的问题:
- 如果有上千万的数据量,每条信息都需要保存对应的类信息,会极大浪费内存空间!
因此我们还是建议使用手动序列化的方式进行存取!
2.3 手动序列化
使用步骤:
-
引入JSON工具依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.35</version> </dependency>
-
编写测试类手动序列化
@Test public void testMyJSON() {// 1. 创建User对象User user = new User(2, "lisi", 22);// 2. 手动序列化为JSON格式数据String jsonString = JSONObject.toJSONString(user);redisTemplate.opsForValue().set("user:2", jsonString);// 3. 取出数据并手动序列化为User对象String userJSONString = (String) redisTemplate.opsForValue().get("user:2");User toUser = JSONObject.parseObject(userJSONString, User.class);System.out.println(toUser); }
运行结果:
此时我们就实现了手动序列化的方式存储Java对象,一切大功告成!
相关文章:

【Redis学习笔记03】Java客户端
1. 初识Jedis Jedis的官网地址:https://github.com/redis/jedis 1.1 快速入门 使用步骤: 注意:如果是云服务器用户使用redis需要先配置防火墙! 引入maven依赖 <dependencies><!-- 引入Jedis依赖 --><dependency&g…...

神经网络系列---激活函数
文章目录 激活函数Sigmoid 激活函数Tanh激活函数ReLU激活函数Leaky ReLU激活函数Parametric ReLU激活函数 (自适应Leaky ReLU激活函数)ELU激活函数SeLU激活函数Softmax 激活函数Swish 激活函数Maxout激活函数Softplus激活函数 激活函数 一般来说…...

python中continue的对比理解
# 使用while循环,输入1-10之间的数字,除7之外。 以下为代码对比: # 使用while循环,输入1-10之间的数字,除7之外。 # 第一种方式 num 0 while num < 10:num num 1if num 7:print("")else:print(num)…...

Amazon Generative AI | 基于 Amazon 扩散模型原理的代码实践之采样篇
以前通过论文介绍 Amazon 生成式 AI 和大语言模型(LLMs)的主要原理之外,在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾,希望内容可以更加深入。因此&#x…...

[服务器-数据库]MongoDBv7.0.4不支持ipv6访问
文章目录 MongoDBv7.0.4不支持ipv6访问错误描述问题分析错误原因解决方式 MongoDBv7.0.4不支持ipv6访问 错误描述 报错如下描述 Cannot connect to MongoDB.No suitable servers found: serverSelectionTimeoutMS expired: [failed to resolve 2408]问题分析 首先确定其是…...

【b站咸虾米】chapter5_uniapp-API_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握
课程地址:【新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5 API 5.1 页面和路…...

自学Python第十八天-自动化测试框架(二):DrissionPage、appium
自学Python第十八天-自动化测试框架(二):DrissionPage、appium DrissionPage环境和安装配置准备工作简单的使用示例控制浏览器收发数据包模式切换 浏览器模式创建浏览器对象访问页面加载模式none 模式技巧 获取页面信息页面交互查找元素ele()…...

云尚办公-0.3.0
5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController:1.该类是控制器;2.方法返回值会被写进响应报文的报文体,而…...
汇编英文全称
mov move mvn Mov Negative ldr LoaD Register str Store Register lsl Logic Shift Left lsr Logic Shift Right asr Arithmetic Shift Right 算数右移 ror Rotate right 循环右移…...

基于虚拟力优化的无线传感器网络覆盖率matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 虚拟力优化算法 4.2 覆盖覆盖率计算 5.完整程序 1.程序功能描述 基于虚拟力优化的无线传感器网络覆盖率,仿真输出优化前后的网络覆盖率,覆盖率优化收敛迭代曲线…...

阿里云-系统盘-磁盘扩容
阿里云系统磁盘扩容 之前是测试环境磁盘用的默认的有 40G,后面升级到正式的 磁盘怕不够用打算升级到 100G, 系统镜像: Alibaba Cloud Linux 3.2104 LTS 64 位 磁盘 ESSD 40G 升级步骤: 扩容与创建快照 在阿里云后台首先去扩容…...
libmmd.dll修复
libmmd.dll 是与Intel Math Kernel Library (MKL) 相关的动态链接库文件,通常用于数学和科学计算。 最常出现的错误信息是: 程序无法启动,因为您的计算机缺少 libmmd.dll 。尝试重新安装程序来解决这个问题。 启动 libmmd.dll 发生错误。无法…...

大数据时代的明星助手:数据可视化引领新风潮
在大数据时代的浪潮中,数据可视化如一位巧夺天工的画师,为我们描绘出庞大而丰富的信息画卷,为我们提供了直观、清晰、高效的数据呈现方式。下面我就以可视化从业者的角度,来简单聊聊这个话题。 数据可视化首先在信息管理和理解方面…...
设计模式--享元模式和组合模式
享元模式 享元模式(Flyweight Pattern)又称为轻量模式,是对象池的一种实现。类似于线程池,线程池可以避免不停的创建和销毁多个对象,销毁性能。提供了减少对象数量从而改善应用所需的对象结构的方式。其宗旨是共享细粒…...

基于Java springmvc+mybatis酒店信息管理系统设计和实现
基于Java springmvcmybatis酒店信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…...
leetcode-找不同
389. 找不同 题解: 从题意我们可以知道,虽然 t 是由 s组成,但是 t中又随机添加了一个字符,也就是相当于 t 包含 s,我们使用字典,将 t 转换成字典对应关系t_map,然后遍历 s 中的字符,若存在&am…...

笔记本hp6930p安装Android-x86避坑日记
一、序言 农历癸卯年前大扫除,翻出老机hp6930p,闲来无事,便安装Android-x86玩玩,期间多次入坑,随手记之以避坑。 笔记本配置:T9600,4G内存,120G固态160G机械硬盘 二、Android-x86系统简介 官…...

zabbix监控业务数据
前言 监控系统除了监控os和数据库性能相关的指标外,业务数据也是重点监控的对象。 一线驻场的运维同学应该深有体会,每天需要向甲方或者公司反馈现场的数据情况,正常情况下一天巡检两次,早上上班后和下午下班前各一次。监控项目…...

access数据库泄露与IIS短文件名利用
access数据库 Microsoft Office Access是微软把 数据库引擎 的图形用户界面和 软件开发工具 结合在一起的一个 数据库管理系统 它的数据库是没有库名的,都是表名。 (借用别的up的图)是不是感觉有点像excel access数据库的后缀是.mdb access数据库泄露漏洞 如果…...

MySQL 篇-深入了解 DDL 语言(一)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 MySQL 说明 2.0 DDL 语言 2.1 DDL 语言 - 定义数据库 2.1.1 创建数据库操作 2.1.2 查看数据库操作 2.1.3 使用数据库操作 2.1.4 删除数据库操作 2.2 DDL 语言 …...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...