Redis在Java中的基本使用
本片将介绍 Redis 在 Java 中的基本使用
文章目录
- 1、使用jedis操作redis
- 1.1、Jedis简介
- 1.2、引入jedis的Maven依赖
- 1.2、获取连接
- 1.3、使用实例
- 2、对于JedisPooled的使用
- 2.1、使用JedisPooled
- 2.2、关于连接池
- 3、SpringBoot下使用Redis
- 3.1、引入Maven依赖
- 3.2、配置Redis连接
- 3.3、创建RedisTemplate
- 3.4、使用RedisTemplate
1、使用jedis操作redis
1.1、Jedis简介
Jedis 是 Java 语言开发的 Redis 客户端工具包,用于 Java 语言与 Redis 数据进行交互。
Jedis 在 github 官网地址:https://github.com/redis/jedis#readme
Jedis 只是对 Redis 命令的封装,掌握 Redis 命令便可轻易上手 Jedis。
Jedis 遵循 RESP 协议规范开发,具有良好的通用性与可读性。
1.2、引入jedis的Maven依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.3</version></dependency>
1.2、获取连接
对于许多应用程序,需要连接到 Redis 时。最好使用连接池。可以像这样实例化一个 Jedis 连接池:
JedisPool pool = new JedisPool("localhost", 6379);
对于 JedisPool 实例,可以使用 try-With-resources 块获得连接并运行 Redis 命令(这种方式无须自己手动 close)。
try (Jedis jedis = pool.getResource()) {// 运行单个 SET 命令jedis.set("clientName", "Jedis");
}
1.3、使用实例
编写以下代码:
public static void main(String[] args) {// Redis服务端IP和端口号JedisPool pool = new JedisPool("127.0.0.1", 6379);try (Jedis jedis = pool.getResource()) {// 使用相关Redis的命令// 选择第0个数据库进行操作jedis.select(0);// 向0号数据库写入,字符串数据jedis.set("Java", "best");jedis.set("PHP", "good");// 查询是否写入System.out.println(jedis.get("Java"));System.out.println(jedis.get("PHP"));}}
运行测试用例:

Jedis 实例实现了大多数 Redis 命令,这些命令可以在 https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/Jedis.htmlApI 中查询命令对应的方法。

2、对于JedisPooled的使用
2.1、使用JedisPooled
对每个命令使用 try-with-resources 块可能比较麻烦,因此我们可以考虑使用 JedisPooled。
JedisPooled jedis = new JedisPooled("localhost", 6379);
详细代码:
public static void main(String[] args) {JedisPooled pool = new JedisPooled("127.0.0.1", 6379, null, null);pool.set("Java", "best");pool.set("PHP", "good");System.out.println(pool.get("Java"));System.out.println(pool.get("PHP"));}
运行效果:

2.2、关于连接池
使用链接池是官方推荐的使用方式,通过连接池可以更好的使用 Jedis 的,我们可以通过 GenericObjectPoolConfig 对连接池进行相关配置,GenericObjectPoolConfig API 文档:https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html
通过 GenericObjectPoolConfig 对象对连接池进行配置,具体代码如下:
public static void main(String[] args) {GenericObjectPoolConfig config = new JedisPoolConfig();// 设置连接池中最多允许放100个Jedis对象config.setMaxTotal(100);// 设置连接池中最大允许空闲连接config.setMaxIdle(100);// 设置连接池中最小允许的连接数config.setMinIdle(10);// 借出连接的时候是否测试有效性,推荐falseconfig.setTestOnBorrow(false);// 归还时是否测试,推荐falseconfig.setTestOnReturn(false);// 创建时是否测试有效 开发的时候设置为false,实践运行的时候设置为trueconfig.setTestOnCreate(false);// 当连接池内jedis无可用资源时,是否等待资源,trueconfig.setBlockWhenExhausted(true);// 没有获取资源时最长等待1秒,1秒后没有还没有的话就报错config.setMaxWaitMillis(1000);JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);try (Jedis jedis = pool.getResource()) {// 使用相关Redis的命令// 选择第0个数据库进行操作jedis.select(0);// 向0号数据库写入,字符串数据jedis.set("Java", "best");jedis.set("PHP", "good");// 查询是否写入System.out.println(jedis.get("Java"));System.out.println(jedis.get("PHP"));}}
运行效果:

3、SpringBoot下使用Redis
3.1、引入Maven依赖
首先,需要在 pom.xml 文件中添加 Redis 依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
这个依赖包含了 Spring Data Redis,以及 Jedis 和 Lettuce 这两种 Redis 客户端的实现。
3.2、配置Redis连接
在 SpringBoot 项目中,可以通过在 application.properties 或 application.yml 文件中配置 Redis 连接信息。以下是一个示例:
spring:data:redis:timeout: 3000database: 0password: passwordport: 6379host: localhost
其中,host 和 port 分别是 Redis 服务器的地址和端口号,password 是 Redis的密码(如果没有密码,可以不填),timeout 是 Redis 连接超时时间,jedis.pool 是连接池的相关设置。
3.3、创建RedisTemplate
使用 Spring Data Redis 操作 Redis,通常会使用 RedisTemplate 类。为了方便起见,我们可以创建一个工具类来管理 RedisTemplate 的创建和使用。以下是一个示例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public class RedisUtils {/*** 如果使用 @Autowired 注解完成自动装配 那么* RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>* 如果你使用其他类型的 比如RedisTemplate<String,Object>* 那么请使用 @Resource 注解* */@Resourceprivate RedisTemplate<String,Object> redisTemplate;private Logger logger = LoggerFactory.getLogger(this.getClass());/*** 缓存value** @param key -* @param value -* @param time -* @return -*/public boolean cacheValue(String key, Object value, long time) {try {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();valueOperations.set(key, value);if (time > 0) {// 如果有设置超时时间的话redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Throwable e) {logger.error("缓存[" + key + "]失败, value[" + value + "] " + e.getMessage());}return false;}/*** 缓存value,没有设置超时时间** @param key -* @param value -* @return -*/public boolean cacheValue(String key, Object value) {return cacheValue(key, value, -1);}/*** 判断缓存是否存在** @param key* @return*/public boolean containsKey(String key) {try {return redisTemplate.hasKey(key);} catch (Throwable e) {logger.error("判断缓存是否存在时失败key[" + key + "]", "err[" + e.getMessage() + "]");}return false;}/*** 根据key,获取缓存** @param key -* @return -*/public Object getValue(String key) {try {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();return valueOperations.get(key);} catch (Throwable e) {logger.error("获取缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");}return null;}/*** 移除缓存** @param key -* @return -*/public boolean removeValue(String key) {try {redisTemplate.delete(key);return true;} catch (Throwable e) {logger.error("移除缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");}return false;}/*** 根据前缀移除所有以传入前缀开头的key-value** @param pattern -* @return -*/public boolean removeKeys(String pattern) {try {Set<String> keySet = redisTemplate.keys(pattern + "*");redisTemplate.delete(keySet);return true;} catch (Throwable e) {logger.error("移除key[" + pattern + "]前缀的缓存时失败", "err[" + e.getMessage() + "]");}return false;}}
在这个示例中,我们使用 @Resource 注解自动注入了一个 RedisTemplate<String, Object> 对象。然后,我们提供了三个方法来对 Redis 进行操作:cacheValue 方法用于缓存数据,getValue 方法用于获取缓存数据,removeValue 方法用于删除缓存数据。这些方法都是通过 redisTemplate 对象来实现的。
需要注意的是,在使用 RedisTemplate 时,需要指定键值对的类型。在这个示例中,我们指定了键的类型为 String,值的类型为 Object。
3.4、使用RedisTemplate
在上面的示例中,我们已经创建了一个 RedisTemplate 对象,并提供了一些方法来对 Redis 进行操作。现在,我们可以在 SpringBoot 项目中的任何地方使用这个工具类来进行缓存操作。以下是一个示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate RedisUtils redisUtils;@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {String key = "user_" + id;User user = (User) redisUtils.getValue(key);if (user == null) {user = userService.getUserById(id);redisUtils.cacheValue(key, user);}return user;}
}
在这个示例中,我们创建了一个 UserController 类,用于处理 HTTP 请求。在 getUserById 方法中,我们首先构造了一个缓存的 key,然后使用 redisUtils.getValue 方法从 Redis 中获取缓存数据。如果缓存中没有数据,我们调用 userService.getUserById 方法从数据库中获取数据,并使用 redisUtils.cacheValue 方法将数据存入Redis缓存中。最后,返回获取到的数据。
通过这个示例,我们可以看到,在S pringBoot 项目中使用 Redis 作为缓存的流程。我们首先需要添加 Redis 依赖,然后在配置文件中配置 Redis 连接信息。接着,我们创建了一个 RedisUtil s工具类来管理 RedisTemplate 的创建和使用。最后,我们在控制器中使用 RedisUtils 来对 Redis 进行缓存操作。
相关文章:
Redis在Java中的基本使用
本片将介绍 Redis 在 Java 中的基本使用 文章目录 1、使用jedis操作redis1.1、Jedis简介1.2、引入jedis的Maven依赖1.2、获取连接1.3、使用实例 2、对于JedisPooled的使用2.1、使用JedisPooled2.2、关于连接池 3、SpringBoot下使用Redis3.1、引入Maven依赖3.2、配置Redis连接3.…...
4.2 C++ Boost 内存池管理库
Boost 库是一个由C/C语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。…...
Django模型基础
文章目录 一、models字段类型概述属性命名限制使用方式逻辑删除和物理删除常用字段类型 二、常用字段参数常用字段选项(通过字段选项,可以实现对字段的约束) 实践创建模型执行迁移命令 并 创建超级用户登录admin后台添加文件和图片字段定义模型字段和约束及在Admin后…...
导读-Linux简介
Linux简介 总所周知,计算机系统包含硬件和软件两部分。硬件部分被称为裸机,主要包括中央处理器(CPU)、内存、外存和各种外部设备。软件部分主要包括系统软件和应用软件两部分。系统软件包括操作系统、汇编语言、编译程序、数据…...
判断平面中两射线是否相交的高效方法
1. 简介 最近在工作中遇到判断平面内两射线是否相交的问题。 对于这个问题的解决,常规的方法是将两条射线拓展为直线,计算直线的交点,而后判断交点是否在射线上。 这种方法,在思路上较为直观,也易于理解。然后,该方法在计算量上相对较大。对于少量射线间的交点计算尚可…...
基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上
一、本章内容 本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 ![在这里插入图…...
RabbitMq交换机类型介绍
RabbitMq交换机类型介绍 在RabbitMq中,生产者的消息都是通过交换器来接收,然后再从交换器分发到不同的队列,再由消费者从队列获取消息。这种模式也被成为“发布/订阅”。 分发的过程中交换器类型会影响分发的逻辑。 直连交换机:…...
中国电信秋招攻略,考试内容分析
电信秋招简介 每年的毕业生人数都在逐年递增,逐年递增就意味着竞争会越来越大,最好比别人做更充足的准备。要确定好就业方向以及就业的岗位,要了解各种各样的流程,做好一切自己能做到的准备。而对于有想法进入电信公司工作的人来…...
prompt-engineering-note(面向开发者的ChatGPT提问工程学习笔记)
介绍: ChatGPT Prompt Engineering Learning Notesfor Developers (面向开发者的ChatGPT提问工程学习笔记) 课程简单介绍了语言模型的工作原理,提供了最佳的提示工程实践,并展示了如何将语言模型 API 应用于各种任务的应用程序中。 此外&am…...
2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码)
2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码) 1、时间:2011-2020(省级、城市),2014-2020(区县) 2、原始数据来源:北大金融研究中心…...
[ MySQL ] — 常见函数的使用
目录 日期函数 current_date — 获取当前日期 current_time — 获取当前时间 current_timestamp — 获取当前时间戳 date — 获取参数的日期部分 编辑 date_add — 在日期或时间的基础上进行增加 date_sub — 在日期或时间的基础上进行减少 datediff — 计算两个日期相差…...
Spring AOP实现切入增强的两种方式(execution+annotation)-Demo
pom文件依赖 <!-- AOP切面编程启动环境依赖组 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 1、通过execution表达式实现切入增强 package com…...
人工智能在网络安全中的作用:当前的局限性和未来的可能性
人工智能 (AI) 激发了网络安全行业的想象力,有可能彻底改变安全和 IT 团队处理网络危机、漏洞和勒索软件攻击的方式。 然而,对人工智能的能力和局限性的现实理解至关重要,并且存在许多挑战阻碍人工智能对网络安全产生直接的变革性影响。 在…...
BC99 序列中整数去重
描述 输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。 输入描述 输入包含两行,第一行包含一个正整数n(1 ≤ n…...
[PyTorch][chapter 52][迁移学习]
前言: 迁移学习(Transfer Learning)是一种机器学习方法,它通过将一个领域中的知识和经验迁移到另一个相关领域中,来加速和改进新领域的学习和解决问题的能力。 这里面主要结合前面ResNet18 例子,详细讲解一…...
Ceph如何操作底层对象数据
1.基本原理介绍 1.1 ceph中的对象(object) 在Ceph存储中,一切数据最终都会以对象(Object)的形式存储在硬盘(OSD)上,每个的Object默认大小为4M。 通过rados命令,可以查看一个存储池中的所有object信息,例如…...
sklearn机器学习库(二)sklearn中的随机森林
sklearn机器学习库(二)sklearn中的随机森林 集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。 多个模型集成成为的模型叫做集成评估器(ensemble estimator)…...
FlutterBoost 实现Flutter页面内嵌iOS view
在使用Flutter混合开发中会遇到一些原生比Flutter优秀的控件,不想使用Flutter的控件,想在Flutter中使用原生控件。这时就会用到 Flutter页面中内嵌 原生view,这里简单介绍一个 内嵌 iOS 的view。 注:这里使用了 FlutterBoost。网…...
走嵌入式还是纯软件?学长告诉你怎么选
最近有不少理工科的本科生问我,未来是走嵌入式还是纯软件好,究竟什么样的同学适合学习嵌入式呢?在这里我整合一下给他们的回答,根据自己的经验提供一些建议。 嵌入式领域也可以分为单片机方向、Linux方向和安卓方向。如果你的专业…...
【云计算原理及实战】初识云计算
该学习笔记取自《云计算原理及实战》一书,关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”,因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月,在圣何塞举办的SES(捜索引擎战略)大会上&a…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
