Redis的java客户端

spring整合了前三种我们只需要学习spring整合的就行了。不过还是有企业使用老一套的原生的jedis。

jedis

操作

引入依赖

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>

建立连接

private Jedis jedis;@BeforeEach
void setUp() {// 建立连接jedis = new Jedis("192.168.150.101", 6379);// 设置密码jedis.auth("123321");// 选择库jedis.select(0);
}

测试

@Test
void testString() {// 插入数据,方法名称就是 redis 命令名称,非常简单String result = jedis.set("name", "张三");System.out.println("result = " + result);// 获取数据String name = jedis.get("name");System.out.println("name = " + name);
}

释放

@AfterEach
void tearDown() {// 释放资源if (jedis != null) {jedis.close();}
}

jedis连接池

因为是jedis是单线程,所以一但出现多线程调用一个实例就会出现线程安全问题,而且频繁的创建和销毁对象实例是有很大的性能损耗,所以我们需要设置多个实例交给连接池来管理。 

public class JedisConnectionFactory {private static final JedisPool jedisPool;static {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 最大连接jedisPoolConfig.setMaxTotal(8);// 最大空闲连接jedisPoolConfig.setMaxIdle(8);// 最小空闲连接jedisPoolConfig.setMinIdle(0);// 设置最长等待时间,msjedisPoolConfig.setMaxWaitMillis(200);jedisPool = new JedisPool(jedisPoolConfig, "192.168.150.101", 6379, 1000, "123321");}// 获取Jedis对象public static Jedis getJedis() {return jedisPool.getResource();}
}

这个代码里面有static代码块,这是一个静态代码块。它里面的代码会在类被加载到 JVM 时执行一次,并且只执行一次。它在任何对象创建之前,甚至在 main 方法执行之前就可能被执行。用来初始化 static 的 jedisPool。当 JedisConnectionFactory 类第一次被使用(比如调用 getJedis() 方法)时,JVM 会加载这个类,并自动执行这个静态代码块,完成连接池的配置和创建。之后,这个创建好的 jedisPool 就可以被所有地方共享使用了。

这里提供一个简单、全局的入口点来获取 Jedis 连接。使用者不需要关心 JedisConnectionFactory 的内部细节,也不需要自己去创建这个工厂类的对象,直接调用 JedisConnectionFactory.getJedis() 就能得到一个连接。这是一种常见的“工厂模式”或“工具类”设计。

SpringDataRedis

操作

引入依赖

springboot里面引入了SpringDataRedis这个依赖不用手动导包。

连接池需要自己导入。

<!-- 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>
</dependency>

配置文件

spring:redis:host: 192.168.150.101port: 6379password: 123321lettuce:pool:max-active: 8 # 最大连接max-idle: 8 # 最大空闲连接min-idle: 0 # 最小空闲连接max-wait: 100 # 连接等待时间

spring默认连接池实现的是lettuce,如果要用jedis还需要自己手动导入依赖。

注入

@Autowired
private RedisTemplate<String, Object> redisTemplate;

测试

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 RedisTemplate<String, Object> redisTemplate;@Testvoid testString() {// 插入一条string类型数据redisTemplate.opsForValue().set("name", "李四");// 读取一条string类型数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);}
}

序列化

spring里面接受的是object对象,接受之后会用序列化器把对象序列化字节形式传递给底层的jedis。

改变序列化方式

序列化器的实现类有多个,我们选择专门处理字符串的就行。

一般,如果key是字符串,我们就是用字符串序列化,值如果是对象我们就使用json序列化。

操作

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {// 创建 TemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// key 和 hashKey 采用 string 序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value 和 hashValue 采用 JSON 序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return redisTemplate;
}

这个bean需要写在一个新的spring配置文件里面。

还需要额外引入jackson依赖,平常开发的话springmvc里面自带了。

类地址的自动填入问题

解决办法

@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON工具
private static final ObjectMapper mapper = new ObjectMapper();@Test
void testStringRedisTemplate() throws JsonProcessingException {// 准备对象User user = new User("虎哥", 18);// 手动序列化String json = mapper.writeValueAsString(user);// 写入一条数据到redisstringRedisTemplate.opsForValue().set("user:200", json);// 读取数据String val = stringRedisTemplate.opsForValue().get("user:200");// 反序列化User user1 = mapper.readValue(val, User.class);System.out.println("user1 = " + user1);
}

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

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

相关文章

LeetCode-19day:贪心算法

贪心算法经典题目总结&#xff08;C实现&#xff09; 贪心算法是一种在每一步选择中都采取当前状态下最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最优的算法。本文总结了四道经典的贪心算法问题&#xff0c;帮助你更好地理解和掌握贪心算法…

Microsoft Edge WebView2 Runtime:为应用程序提供浏览器核心功能

在现代软件开发中&#xff0c;嵌入网页内容到应用程序界面是一个常见的需求。Microsoft Edge WebView2 Runtime&#xff08;WebView2运行库&#xff09;作为微软操作系统WebView2控件的运行环境&#xff0c;基于Chromium内核构建&#xff0c;为应用程序提供了浏览器核心功能&am…

PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并

PDF页面合并工具 这个工具可以将PDF文件中的相邻页面合并成一页&#xff0c;例如将第1页和第2页合并&#xff0c;第3页和第4页合并&#xff0c;以此类推。 功能 自动检测PDF文件中的页面数量将相邻的页面合并成一页处理奇数页数的PDF文件&#xff08;最后一页单独保留&#xff…

git hub初使用问题记录

问题一、Connection closed by UNKNOWN port 65535设置config文件为Host github.com Hostname ssh.github.com Port 443 User git问题二、ERROR: Repository not found.fatal: Could not read from remote repository.Please make sure you have the correct access rightsand …

解读 AUTOSAR AP R24-11 Manifest 规范 —— 从部署到安全的全流程支撑

今天我们来拆解 AUTOSAR AP R24-11 版本的《Requirements on Manifest Specification》Manifest 规范要求—— 这份文档是 Adaptive 平台软件 “落地运行” 的核心指南,它解决了一个关键问题:如何让 AP 软件在车载 ECU 上安全、可靠地部署和通信? 自适应平台(AP)是啥? 是…

Linux系统 -- 多线程的控制(互斥与同步)

在多线程编程中&#xff0c;多个线程可能同时访问临界资源&#xff08;如共享变量、文件、硬件设备等&#xff09;&#xff0c;若缺乏控制会导致数据混乱。互斥和同步是解决该问题的核心机制&#xff0c;其中互斥锁保证临界资源的排他访问&#xff0c;信号量实现线程间的有序协…

一键搭建开发环境:制作bash shell脚本

完整脚本&#xff1a; 1.0 #!/bin/bash set -eecho " 开始安装 AI 开发环境&#xff08;无人交互版&#xff09; "# 检测是否以 sudo 运行 if [ "$EUID" -eq 0 ]; thenecho "⚠️ 警告&#xff1a;请不要使用 sudo 运行此脚本&#xff01;"echo …

mac m4执行nvm install 14.19.1报错,安装低版本node报错解决

原因 由于node14使用的变异工具链太旧&#xff0c;无法适配最新的macOS SDK头文件导致_studio.h报错 解决办法 方法1 更新nvm到最新版本 brew update nvmnvm install 14.19.1 --binary 方法2 启用Rosetta安装&#xff08;Intel仿真&#xff09; 1.arch -x86_64 zsh 2.nvm insta…

Codeforces Round 1043 (Div. 3) F. Rada and the Chamomile Valley

F.拉达和甘菊谷 每次测试的时间限制&#xff1a;3 秒 每次测试的内存限制512 兆字节 输入&#xff1a;标准输入 输出&#xff1a;标准输出 昨天&#xff0c;拉达发现了一个传送门&#xff0c;可以把她传送到洋甘菊谷&#xff0c;然后再传送回来。拉达的快乐无以言表&#xff0c…

STM32 入门实录:从 0 到 3 色 LED 呼吸式闪烁

一、需求 & 最终效果 硬件&#xff1a;Blue-Pill&#xff08;STM32F103C8T6&#xff09; 3 只 LED&#xff08;红 PA0、黄 PA1、绿 PA2&#xff09;现象&#xff1a;上电后红→黄→绿→黄→全灭&#xff0c;每步 100 ms&#xff0c;循环往复。 二、硬件连接LED 端连接说明阴…

Playwright与PyTest结合指南

Playwright与PyTest的结合&#xff0c;为Web自动化测试带来了强大的动力。它让你既能利用Playwright现代、跨浏览器的自动化能力&#xff0c;又能借助PyTest成熟测试框架的结构化、可扩展性来高效管理和组织测试用例。我会带你了解如何将这两者结合使用。 为了让你快速上手&am…

plantsimulation知识点 一条轨道上多台RGV如何引用

最近做项目有如下需求&#xff1a;轨道1上初始化生成三台RGV&#xff0c;然后通过另一条轨道2上的传感器代码控制轨道1上的三台RGV&#xff0c;之前如果另一条轨道只有一台RGV&#xff0c;我是通过轨道2.cont来引用这台RGV的。但是现在轨道上有了多台RGV&#xff0c;此代码就不…

【Canvas与盾牌】“靡不有初,鲜克有终”黄竖条盾牌

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>黄竖条盾牌 Draft1</title><style type"text/css"&…

使用linux+javascript+html+mysql+nodejs+npm+express等构建信息资料采集系统

一、适用场景 1、人才信息库、档案管理&#xff0c;构建企业或单位内部人才库。 2、公务员/事业单位招聘&#xff0c;网上报名填写资料、上传证书等。 3、科研项目申报&#xff0c;课题负责人信息、成果附件、审查材料上传。 4、志愿者招募&#xff1a;在线填写报名信息&#…

低空经济产业白皮书:音视频链路在智能飞行体系中的核心地位

引言 低空经济正在成为继数字经济、新能源产业之后的又一战略制高点。它不仅意味着无人机物流、空中通勤、应急救援、文旅体验等新业态的兴起&#xff0c;更代表着 城市治理、智能制造、公共服务全面进入空域数字化时代。从政策引导到产业投资&#xff0c;从技术突破到应用创新…

【LeetCode 热题 100】32. 最长有效括号——(解法二)动态规划

Problem: 32. 最长有效括号 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(N)空间复杂度&#xff1a;O(N)整体思路 这段代码同样旨在解决 “最长有效括号” 问题&#xff0c;但它采用的是一种 动态规划 (Dynamic Programming) 的方法。这种方法通过构建一个DP表…

使用Docker部署ZLMediaKit流媒体服务器实现gb/t28181协议的设备

最近在研究一个摄像头&#xff0c;通信协议是 gb/t28181。对于这个协议也是第一次接触&#xff0c;通过查阅多方资料&#xff0c;找到了两个开源的源码&#xff0c;来实现 视频播放、摄像头直播。以前也没有深入的了解过关于视频播放的这方面的技术&#xff0c;偶尔网站播放视频…

硬件三人行--运算基础篇

第3讲 负反馈放大电路

【LINUX网络】TCP原理

目录 本文介绍 1. 什么是TCP&#xff1f; 2. TCP结构 为什么需要协议栈&#xff1a;两台主机通信的复杂性解决方案 3. 确认应答机制 进一步理解什么是确认和请求以及序号 进一步理解什么是序号和确认序号 并发发送带来的问题以及解决方案&#xff08;序号&#xff09; …

Java -- 文件基础知识--Java IO流原理--FileReader

目录 1. 常用文件操作 2. Java IO流原理 2.1 流的分类 3. FileReader和FileWriter介绍 FileReader相关方法&#xff1a; FileWriter常用方法&#xff1a; 文件是保存数据的地方&#xff0c;比如大家经常使用的word文档&#xff0c;txt文件&#xff0c;excel文件...都是文…