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"));}}

运行测试用例:

image-20230812233428661

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

image-20230812233859534


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"));}

运行效果:

image-20230812233428661

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"));}}

运行效果:

image-20230812233428661


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 进行缓存操作。

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

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

相关文章

excel逻辑函数篇2

1、IF(logical_test,[value_if_true],[value_if_false])&#xff1a;判断是否满足某个条件&#xff0c;如果满足返回一个值&#xff0c;如果不满足则返回另一个值 if(条件,条件成立返回的值,条件不成立返回的值) 2、IFS(logical_test1,value_if_true1,…)&#xff1a;检查是否…

网络安全--wazuh环境配置及漏洞复现

目录 一、wazuh配置 二、wazuh案例复现 一、wazuh配置 1.1进入官网下载OVA启动软件 Virtual Machine (OVA) - Installation alternatives (wazuh.com) 1.2点击启动部署&#xff0c;傻瓜式操作 1.3通过账号&#xff1a;wazuh-user&#xff0c;密码&#xff1a;wazuh进入wazuh…

删除链表中的节点(力扣)

目录 题目&#xff1a; 看着花里胡哨&#xff0c;小卡拉米四行代码秒杀&#xff01; 示例&#xff1a; 思路&#xff1a; 代码&#xff1a; 题目&#xff1a; 看着花里胡哨&#xff0c;小卡拉米四行代码秒杀&#xff01; 示例&#xff1a; 思路&#xff1a; 把后一个节点的…

动手学深度学习—卷积神经网络LeNet(代码详解)

1. LeNet LeNet由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成&#xff1b;全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层&#xff1b;每个卷积层使用55卷积核和一个sigmoid激…

【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

linux RabbitMQ-3.8.5 安装

软件版本操作系统CentOS Linux release 7.9.2009erlangerlang-23.0.2-1.el7.x86_64rabbitMQrabbitmq-server-3.8.5-1.el7 RabbitMQ的安装首先需要安装Erlang,因为它是基于Erlang的VM运行的。 RabbitMQ安装需要依赖:socat和logrotate&#xff0c;logrotate操作系统已经存在了&…

图论相关问题

1. 拓扑排序bitset 第一次使用bitset&#xff0c;复杂度&#xff1a;N/32&#xff0c;比N小 所以总的时间复杂度为O(N*(NM)/32) #include <iostream> #include <bitset> #include <queue> using namespace std; const int N 3e420; bitset<N> f[N];…

使用低版本vcpkg时,bootstrap-vcpkg.bat无法生成vcpkg.exe的可能原因

缘由 需要使用vcpkg中低版本的第三方库&#xff0c;下载vcpkg后&#xff0c;回退至指定版本&#xff0c;运行bootstrap-vcpkg.bat生成vcpkg.exe时&#xff0c;命令行窗口总是一闪而过&#xff0c;但是vcpkg.exe却没有生成。 添加pause&#xff0c;查看错误 编辑bootstrap-vc…

09_Redlock算法和底层源码分析

Redlock算法和底层源码分析 一、当前代码为8.0版接上一步 自研分布式锁的重点&#xff1a; 按照juc里面Lock接口规范进行编写lock加锁关键逻辑 加锁&#xff1a;在redis中&#xff0c;加锁实际上是给key设置一个值&#xff0c;为避免死锁&#xff0c;并给key一个过期时间自旋…

腾讯云轻量应用服务器配置(详细版)

腾讯云轻量应用服务器CPU内存带宽配置高&#xff0c;成本很低&#xff0c;腾讯云百科来详细说下腾讯云服务器从购买、配置到网站上线全流程&#xff0c;包括轻量服务器配置选择、应用镜像选择、重置密码、防火墙开放端口教程等详细教程&#xff1a; 目录 一&#xff1a;注册腾…

vue的开发者工具下载『保姆级别』

1.先进官网 极简插件_Chrome扩展插件商店_优质crx应用下载 (zzzmh.cn) 2.搜索vue devtools&#xff0c;点击进去 3.下载插件 4.下载到文件下你自己的文件下&#xff1a;我的是下载到E盘下。 5.压缩到当前目录下 6.电脑进入拓展程序&#xff08;不同的浏览器操作不同&#xff…

在Visual Studio上,使用OpenCV实现人脸识别

1. 环境与说明 本文介绍了如何在Visual Studio上&#xff0c;使用OpenCV来实现人脸识别的功能 环境说明 : 操作系统 : windows 10 64位Visual Studio版本 : Visual Studio Community 2022 (社区版)OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版) 实现效果如图所示&#xff0…

系统卡死问题分析

CPU模式 CPU Frequency Scaling (CPUFREQ) Introduction CPU频率调节设备驱动程序的功能。该驱动程序允许在运行过程中更改CPU的时钟频率。一旦CPU频率被更改,必要的电源供应电压也会根据设备树脚本(DTS)中定义的电压值进行变化。通过降低时钟速度,这种方法可以减少功耗…

CloudCompare——统计滤波

目录 1.统计滤波2.软件实现3.完整操作4.算法源码5.相关代码 本文由CSDN点云侠原创&#xff0c;CloudCompare——统计滤波&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 1.统计滤波 算法原理见&#xff1a;PCL 统计滤波器…

使用 Elasticsearch 轻松进行中文文本分类

本文记录下使用 Elasticsearch 进行文本分类&#xff0c;当我第一次偶然发现 Elasticsearch 时&#xff0c;就被它的易用性、速度和配置选项所吸引。每次使用 Elasticsearch&#xff0c;我都能找到一种更为简单的方法来解决我一贯通过传统的自然语言处理 (NLP) 工具和技术来解决…

韩顺平Linux 四十四--

四十四、rwx权限 权限的基本介绍 输入指令 ls -l 显示的内容如下 -rwxrw-r-- 1 root 1213 Feb 2 09:39 abc0-9位说明 第0位确定文件类型&#xff08;d , - , l , c , b) l 是链接&#xff0c;相当于 windows 的快捷方式- 代表是文件是普通文件d 是目录&#xff0c;相…

录制游戏视频的软件有哪些?分享3款软件!

“有录制游戏视频的软件推荐吗&#xff1f;最近迷上了网游&#xff0c;想录制点自己高端操作的游戏画面&#xff0c;但是不知道用什么软件录屏比较好&#xff0c;就想问问大家&#xff0c;有没有好用的录制游戏视频软件。” 在游戏领域&#xff0c;玩家们喜欢通过录制游戏视频…

《Go 语言第一课》课程学习笔记(四)

构建模式&#xff1a;Go Module 的 6 类常规操作 为当前 module 添加一个依赖 我们如何为一个 Go Module 添加一个新的依赖包呢&#xff1f; 如果我们要为项目增加一个新依赖&#xff1a;github.com/google/uuid&#xff0c;我们首先会更新源码&#xff1a;package mainimpor…

【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 写在前面 本系列文章将对LOAM源代码进行讲解&#xff0c;在讲解过程中&#xff0c;涉及到论文中提到的部分&#xff0c;会结合论文以及我自己的理解进行解读&#xff0c;尤其是对于其中坐标变换的部分&…

更多openEuler镜像加入AWS Marketplace!

自2023年7月openEuler 22.03 LTS SP1正式登陆AWS Marketplace后&#xff0c;openEuler社区一直持续于在AWS上提供更多版本。 目前&#xff0c;openEuler22.03 LTS SP1 ,SP2两个版本及 x86 arm64两种架构的四个镜像均可通过AWS对外提供&#xff0c;且在亚太及欧洲15个Region开放…