当前位置: 首页 > news >正文

在Java中操作Redis(详细-->从环境配置到代码实现)

在Java中操作Redis

文章目录

  • 在Java中操作Redis
    • 1、介绍
    • 2、Jedis
    • 3、Spring Data Redis
      • 3.1、对String的操作
      • 3.2、对哈希类型数据的操作
      • 3.3、对list的操作
      • 3.4、对set类型的操作
      • 3.5、对 ZSet类型的数据(有序集合)
      • 3.6、通用类型的操作

1、介绍

Redis 的Java客户端很多,官方推荐的有三种:

  • Jedis

  • Lettuce

  • Redisson

Spring对Redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis

2、Jedis

Jedis的maven坐标:

     <!--redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version></dependency>

使用Jedis操作Redis的步骤:

  1. 获取连接
  2. 执行操作关闭连接
  3. 关闭连接

编写一个测试类测试redis:

package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;@SpringBootTest
class JedisDemoApplicationTests {@Testvoid contextLoads() {//1. 获取连接Jedis jedis = new Jedis("localhost", 6379);//2. 执行操作关闭连接jedis.set("name", "mannor");//3. 关闭连接jedis.close();}
}

在此之前,需要将Redis服务启动起来redis-server.exe

程序运行前:

image-20230812220121965

测试项目运行后:

image-20230812220213860

测试其他:

package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;import java.util.Set;@SpringBootTest
class JedisDemoApplicationTests {/*** 使用jedis操作Redis*/@Testvoid contextLoads() {//1. 获取连接Jedis jedis = new Jedis("localhost", 6379);//2. 执行操作关闭连接jedis.set("name", "mannor");//设置String name = jedis.get("name");//获取System.out.println(name);jedis.del("name");//删除jedis.hset("myhash","addr","beijing");//设置哈希表值String hget = jedis.hget("myhash", "addr");//获取哈希表System.out.println(hget);Set<String> keys = jedis.keys("*");//获取所有Redis的数据for(String key:keys){System.out.println(key);}//3. 关闭连接jedis.close();}}

测试项目源码:上述测试项目的源码

3、Spring Data Redis

在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

Spring Data Redis中提供了一个高度封装的类: RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

yml配置文件:

spring:application:name: springdataredis_demo#Redis相关配置redis:host: localhostport: 6379#password: 123456database: 0 #操作的是0号数据库(redis存在0-15号数据库(默认),在命令中使用select来切换)jedis:#Redis连接池配置pool:max-active: 8 #最大连接数max-wait: 1ms #连接池最大阻塞等待时间 max-idle: 4 #连接池中的最大空闲连接min-idle: 0 #连接池中的最小空闲连接

在获取到RedisTemplate对象执行下列语句:

redisTemplate.opsForValue().set("city","beijing");

输出:image-20230812225658840

原因:RedisTemplate在操作Redis数据库的时候,将key做了一个序列化,上述结果就是序列化的结果,为了解决这个问题就要配置一个配置类:

package com.itheima.config;import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** Redis配置类*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的Key序列化器为:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

对于接下类的在java中对Redis的操作,我们可以参照Redis中的常用命令

3.1、对String的操作

(ValueOperations接口)示例:

@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作String类型的数据*/@Testvoid contextLoads() {//redisTemplate.opsForValue().set("mannor" ,"rediaz");String mannor = (String) redisTemplate.opsForValue().get("mannor");System.out.println(mannor);redisTemplate.opsForValue().set("k1", "v1", 10L, TimeUnit.SECONDS);Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("mannor1", "mannor");System.out.println(aBoolean);}
}

3.2、对哈希类型数据的操作

@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作hash类型的数据*/@Testpublic void hashTest() {HashOperations hashOperations = redisTemplate.opsForHash();//存hashOperations.put("002", "name", "zhangsan");hashOperations.put("002", "age", "20");hashOperations.put("002", "addr", "beijing");//取Object age = hashOperations.get("002", "age");
//        System.out.println((String) age);//获取所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {
//            System.out.println(key);}//获得hash结构中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}}}

3.3、对list的操作

    @Autowiredprivate RedisTemplate redisTemplate;/*** 操作list类型的数据*/@Testpublic void listTest() {ListOperations listOperations = redisTemplate.opsForList();//存listOperations.leftPush("list", "00");listOperations.leftPushAll("list", "01", "02", "03");//取值List list = listOperations.range("list", 0, -1);for (Object val : list) {System.out.println(val);}System.out.println("------------------------------------------------------------");//获取长度来遍历Long size = listOperations.size("list");for (int i = 0; i < size; i++) {//出队列String element = (String) listOperations.rightPop("list");System.out.println(element);}

3.4、对set类型的操作

    @Autowiredprivate RedisTemplate redisTemplate;/*** 操作Set类型的数据*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();//存值setOperations.add("myset", "a", "b", "c", "a");//取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}//删除成员setOperations.remove("myset", "a", "b");//取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}

3.5、对 ZSet类型的数据(有序集合)

    @Autowiredprivate RedisTemplate redisTemplate;/** * 操作ZSet类型的数据*/
@Test
public void testZset() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myZset", "a", 10.0);zSetOperations.add("myZset", "b", 11.0);zSetOperations.add("myZset", "c", 12.0);zSetOperations.add("myZset", "a", 13.0);//取值Set<String> myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//修改分数zSetOperations.incrementScore("myZset", "b", 20.0);//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//删除成员zSetOperations.remove("myZset", "a", "b");//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}
}

3.6、通用类型的操作

     @Autowiredprivate RedisTemplate redisTemplate;/*** 通用操作,针对不同的数据类型都可以操作*/@Testpublic void testCommon() {//获取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}//判断某个key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);//删除指定keyredisTemplate.delete("myZset");//获取指定key对应的value的数据类型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());}

测试项目源代码:https://gitee.com/rediaz/note-management/tree/master/Regis/SpringDataRedis

相关文章:

在Java中操作Redis(详细-->从环境配置到代码实现)

在Java中操作Redis 文章目录 在Java中操作Redis1、介绍2、Jedis3、Spring Data Redis3.1、对String的操作3.2、对哈希类型数据的操作3.3、对list的操作3.4、对set类型的操作3.5、对 ZSet类型的数据&#xff08;有序集合&#xff09;3.6、通用类型的操作 1、介绍 Redis 的Java客…...

分布式作业调度框架——ElasticJob

1、简介 ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案&#xff0c;由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能&#xff0c;打造一个适用于互联网场景的分布式调度解决方案&#xff0c;…...

react如何实现数据渲染

React数据渲染是指将组件中的数据映射到页面上&#xff0c;以展示出来。在React中&#xff0c;数据渲染通常是通过JSX和组件的state或props完成的。 JSX是一个类似HTML的语法&#xff0c;可以在其中嵌入JavaScript表达式。在JSX中&#xff0c;可以使用{}包裹JavaScript表达式&…...

在Java中如何使用List集合实现分页,以及模糊查询后分页

物理分页工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;/*** ClassName: PageUtils* Description: 物理分页* Author* Date …...

【JAVA】包装类、正则表达式、Arrays类、Lambda表达式

1 包装类 包装类是8种基本数据类型对应的引用类型 作用&#xff1a;后期的集合和泛型不支持基本类型&#xff0c;只能使用包装类 基本数据类型和其对应的引用数据类型的变量可以互相赋值 基本数据类型引用数据类型 byte Byte short Short int Integer long Long ch…...

Java中的Maven Assembly插件是什么?

Maven Assembly插件是Maven中的一个插件&#xff0c;用于创建自定义的构建过程。它允许你在构建过程中执行一些自定义的操作&#xff0c;例如打包、编译、复制文件等。对于新手来说&#xff0c;Maven Assembly插件可能有点复杂&#xff0c;但是我们可以使用一些幽默的方式来解释…...

SpringBoot禁用Swagger3

Swagger3默认是启用的&#xff0c;即引入包就启用。 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> <dependency><groupId…...

小红书Java后端2023-8-6笔试

小红书推荐系统 时间限制&#xff1a;3000MS&#xff1b;内存限制&#xff1a;589824KB 题目描述 小红书有一个推荐系统&#xff0c;可以根据用户搜索的关键词推荐用户希望获取的内容。现在给定小孩的搜索记录&#xff08;记录是分词后的结果&#xff09;&#xff0c;我们认…...

metaRTC7 demo mac/ios编译指南

概要 metaRTC7.0开始全面支持mac/ios操作系统&#xff0c;新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。发布版自带了x64版第三方类库&#xff0c;arm版第三方类库还需开发者自己编译。 源码下载 下载文件metartc7.023.7z https://github.com/metartc/metaRTC/re…...

systemd-journal 占用内存的问题

最近发现部分 Debian 机器的 systemd-journal 占用了非常多内存。这和 Debian 对其的 错误配置有关系&#xff08;查了一下其他发行版&#xff0c;有和 Debian 一样的配置的也有和 Debian 不一样 的配置的&#xff0c;说明这个配置有争议&#xff09;。 systemd-journal 简介 …...

Java # Spring(2)

一、Spring事物 一、分类 编程式事物&#xff1a;代码中硬编码&#xff08;不推荐使用&#xff09; 声明式事物&#xff1a;配置文件中配置&#xff08;推荐使用&#xff09; 分类&#xff1a; 基于xml的声明式事物基于注解的声明式事物 二、隔离级别 ISOLATION_DEFAULT&…...

2021年03月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;石头剪刀布 石头剪刀布是常见的猜拳游戏。石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。 一天&#xff0c;小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的&#xff0c;比如&#xff1a;“…...

应用程序运行报错:First section must be [net] or [network]:No such file or directory

应用程序报错环境&#xff1a; 在linux下&#xff0c;调用darknet训练的模型&#xff0c;报错&#xff1a;First section must be [net] or [network]:No such file or directory&#xff0c;并提示&#xff1a;"./src/utils.c:256: error: Assertion 0 failed." 如…...

【ECMAScript】ES6-ES11学习笔记

文章目录 注意事项1.声明变量2.定义常量3.解构赋值4.模板字符串5.简化对象写法6.箭头函数7.参数默认值8.rest参数9.扩展运算符10.Symbol11.生成器函数12.Promise基本语法13.集合set14.Map15.类class16.数值扩展17.对象私有属性18.对象方法扩展19.js文件模块化20.async和await21…...

K8S MetalLB LoadBalancer

1. 简介 kubernetes集群没有L4负载均衡&#xff0c;对外暴漏服务时&#xff0c;只能使用nodePort的方式&#xff0c;比较麻烦&#xff0c;必须要记住不同的端口号。 LoadBalancer&#xff1a;使用云提供商的负载均衡器向外部暴露服务&#xff0c;外部负载均衡器可以将流量路由…...

kubernetes二进制部署2之 CNI 网络组件部署

CNI 网络组件部署 一&#xff1a;K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信&#xff1a;Overlay Network&#xff1a;VXLAN&#xff1a;Flannel:Flannel udp 模式的工作原理&#xff1a;ETCD 之 Flannel 提供说…...

docker通用镜像方法,程序更新时不用重新构建镜像

docker通用镜像方法&#xff0c;程序更新时不用重新构建镜像。更新可执行文件后&#xff0c;重新启动容器就可运行。 功能 1、在demo目录下添加脚本文件start.sh&#xff0c;里面执行demo.jar文件。 2、将demo目录映射到镜像下的 /workspace目录。 3、Dockerfile文件中默认…...

Spring Cloud构建微服务断路器介绍

什么是断路器 断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置&#xff0c;用于在电路上保护线路过载&#xff0c;当线路中有电器发生短路时&#xff0c;“断路器”能够及时的切断故障电路&#xff0c;防止发生过载、发热、甚至起火等严重后果…...

[国产MCU]-BL602开发实例-OLED-SSD1306驱动与U8g2移植

OLED-SSD1306驱动与U8g2移植 文章目录 OLED-SSD1306驱动与U8g2移植1、OLED介绍2、SSD1306介绍2、U8g2介绍3、U8g2移植3.1 定义U8g2图形库的移植函数3.2 移植函数实现3.3 移植函数调用4、驱动测试本文将详细介绍如何在BL602中移植U8g2图形库,并通过U8g2库驱动OLED SSD1306显示屏…...

AWS asg(Auto Scaling Group)部署时报错Error: Termination Reason: Client.InternalError

背景 最近用一个terraform asg模块部署asg时一直报错 Error: Termination Reason: Client.InternalError: Client error on launch 搜索资料发现和KMS下面的asg 对应的policy有关系. 解决方法 在AWS界面找到KMS, 然后找到customer managed key导航栏, 最后找到对应AMI加密用…...

Python编程核心知识点速览

一、基础知识 &#xff08;一&#xff09;语言特性1. Python是解释型、跨平台的高级通用脚本语言&#xff0c;语法简洁、生态丰富&#xff0c;支持面向过程和面向对象编程。2. 执行速度较编译型语言慢&#xff0c;但可调用C语言编写的底层代码提升性能&#xff0c;适用于数据分…...

手把手带你读懂MemBrain(极其详细):Agent实体树记忆到底怎么实现的?

继续看Agent记忆上的事情&#xff0c;看看基于实体-主题-时序-版本控制的Agent记忆方案&#xff0c;很常规的组合方案&#xff0c;不算太创新。 另一个看看两个开源模型进展&#xff1a;语言大模型GLM-5.1和检测大模型 WildDet3D。 一、基于实体-主题-时序-版本控制的Agent记…...

vLLM-v0.17.1:从MATLAB算法到生产部署的桥梁

vLLM-v0.17.1&#xff1a;从MATLAB算法到生产部署的桥梁 1. 科研与生产的鸿沟 在算法研发领域&#xff0c;MATLAB长期占据着不可替代的地位。它的矩阵运算能力、丰富的工具箱和直观的语法&#xff0c;使其成为科研人员和算法工程师的首选工具。然而&#xff0c;当这些精心设计…...

NLP-StructBERT赋能智能写作助手:查重与素材推荐一体化方案

NLP-StructBERT赋能智能写作助手&#xff1a;查重与素材推荐一体化方案 每次写完稿子&#xff0c;你是不是也有这样的烦恼&#xff1f;一边担心自己是不是无意中“借鉴”了别人的观点&#xff0c;一边又得花大量时间去翻找资料、寻找案例来支撑自己的论点。对于媒体人和学术研…...

OpenClaw技能扩展教程:Qwen3-14b_int4_awq实现公众号自动发布

OpenClaw技能扩展教程&#xff1a;Qwen3-14b_int4_awq实现公众号自动发布 1. 为什么需要自动化公众号发布 作为一个技术博主&#xff0c;我每周都要在公众号上发布2-3篇技术文章。最让我头疼的不是写作本身&#xff0c;而是发布前的繁琐流程&#xff1a;手动排版Markdown、设…...

ILI9225 TFT驱动库:Arduino 2.2英寸SPI显示屏开发指南

1. 项目概述TFT_22_ILI9225 是一款专为基于 ILI9225 显示控制器的 2.2 英寸 TFT LCD 模块设计的 Arduino 驱动库。该模块物理尺寸为 2.2 英寸&#xff0c;分辨率为 176220 像素&#xff0c;采用四线 SPI&#xff08;Serial Peripheral Interface&#xff09;接口与主控通信&…...

知识竞赛软件如何选择?抢答器功能

知识竞赛软件怎么选&#xff1f;抢答器功能是关键 组织一场精彩、公平、高效的知识竞赛&#xff0c;离不开专业软件的支持。在众多功能中&#xff0c;抢答器功能往往是决定竞赛成败的核心。本文将系统性地探讨如何选择一款合适的知识竞赛软件&#xff0c;并深入分析抢答器功能…...

AI 入门 30 天挑战 - Day 6 费曼学习法版 - 模型评估和优化

&#x1f31f; 完整项目和代码 本教程是 AI 入门 30 天挑战 系列的一部分&#xff01; &#x1f4bb; GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge&#x1f4d6; CSDN 专栏: https://blog.csdn.net/m0_67081842?typeblog⭐ 欢迎 Star 支持&#xff01;…...

Python如何实现定时异步任务_结合asyncio与loop.call_later调用

asyncio.call_later不能直接await&#xff0c;因为它返回Handle对象而非Awaitable&#xff1b;正确做法是在回调中用asyncio.create_task启动协程。asyncio.call_later 为什么不能直接 await&#xff1f;因为 loop.call_later 是一个同步注册函数&#xff0c;它不返回协程对象&…...

LAYONTHEGROUND看

一、什么是requests&#xff1f; requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你&#xff1a; 轻松发送GET、POST、PUT、DELETE等请求 处理Cookie、会话等复杂性 自动解压缩内容 处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景&#xff1a; …...