使用Java操作Redis

news2024/11/24 10:49:59

要在Java程序中操作Redis可以使用Jedis开源工具。

一、jedis的下载
如果使用Maven项目,可以把以下内容添加到pom中

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.1</version>
</dependency>

也可以在maven仓库中下载需要的jar文件,除了jedis.jar以外,还要下载对应的依赖包

1、jedis下载地址:

https://mvnrepository.com/artifact/redis.clients/jedis/4.3.1


2、依赖下载

在下载页面的下方有依赖项的列表,在对应的链接上右键,选择”在新的标签中打开链接“,如果对应的页面不有jar的链接,可以点击”View All“,进入到子页面中去下载。


gson是必须的依赖,用于内部json数据的操作

如果要使用JedisPoolConfig,则必须添加commons-pool2和slf4j-api,没有commons-pool2无法配置池的参数,而没有slf4j-api在运行时会抛异常。

下载后把五个Jar包添加到项目中去

二、jedis使用
    说明:本示例全部使用junit4

1、redis的连接和关闭

//连接redis
Jedis j = new Jedis("localhost", 6379);
//密码
j.auth("123456");
//切换到数据库9
j.select(8);

//关闭连接
j.close();

从以下示例可以看出,jedis操作redis时方法的名称与redis的命令一致。因此对于掌握了redis操作的人员jedis会很容易上手

2、添加一个字符串的值

//连接redis
Jedis j = new Jedis("localhost", 6379);
//密码
j.auth("123456");
//切换到数据库9
j.select(8);
//清空当前数据库中的数据
j.flushDB() ;
//添加字符串的值
j.set("key1".getBytes("utf-8"), "value1".getBytes("utf-8"));
//关闭连接
j.close();

redis的默认编码为utf-8,但应用程序的编码不一定一致,如果直接使用字符串进行操作,可以在多个系统中访问时由于编码不一致而出现乱码,因此建议key和值都以utf-8编码转换成字节数组进行添加

3、获取字符串的值

Jedis j = new Jedis("localhost", 6379);
j.auth("123456");
j.select(8);
//根据key获取值
byte[] bys = j.get("key1".getBytes("utf-8"));
//输出结果
System.out.println(new String(bys,"utf-8"));

j.close();

取出时按存入时的编码还原成字符串即可

4、事务处理

Jedis j = new Jedis("localhost", 6379);
j.auth("123456");
j.select(8);
//监听
j.watch("str2".getBytes("utf-8"),"value2".getBytes("utf-8"));
//开启事务
Transaction t = j.multi();
//添加多条数据
t.set("str2".getBytes("utf-8"),"value2".getBytes("utf-8"));
t.set("str3".getBytes("utf-8"),"value3".getBytes("utf-8"));
//执行事务
t.exec();

j.close();

6、list查询的执行

    当在事务中执行查询时,会反回一个Response对象,此对象的操作必须在事务结束后执行。

示例

Transaction t = j.multi();
//在事务中必须使用事务对象执行相关方法
t.lpush(toBys("lkey1"),
              toBys("val1"),toBys("val2"));

Response<List<byte[]>> res = t.lrange(toBys("lkey1"), 0 ,-1);

t.exec();//执行事务

//从响应中获取查询结果,必须在事务完成之后执行
List<byte[]> list = res.get();
for (byte[] bytes : list) {
      System.out.println(new String(bytes,"utf-8"));
}
        //关闭连接
j.close();

6、使用默认连接池创建连接

//使用默认配置创建连接池
JedisPool pool = new JedisPool("localhost", 6379);
//从池中取出连接
Jedis j = pool.getResource();

//把连接交还给池
j.close();

//关闭池,释放所有连接
pool.close();
7、使用连接池配置创建连接池

JedisPoolConfig conf = new JedisPoolConfig();

//最大空闲连接数
conf.setMaxIdle(10);
//最大连接数
conf.setMaxTotal(100);
//最小空闲数
conf.setMinIdle(2);

//使用配置对象创建连接池
JedisPool pool = new JedisPool(conf,"localhost", 6379);

常用的配置如下

1)maxActive

    控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。

2)maxIdle

    控制一个pool最多有多少个状态为idle(空闲)的jedis实例;

3)whenExhaustedAction

    表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。

WHEN_EXHAUSTED_FAIL –> 表示无jedis实例时,直接抛出NoSuchElementException;

WHEN_EXHAUSTED_BLOCK –> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;

WHEN_EXHAUSTED_GROW –> 则表示新建一个jedis实例,也就说设置的maxActive无用;

4)maxWait

    表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;

5)testOnBorrow

    获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;

6)testOnReturn

    return 一个jedis实例给pool时,是否检查连接可用性(ping());

7)testWhileIdle

    如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

8)timeBetweenEvictionRunsMillis

    表示idle object evitor两次扫描之间要sleep的毫秒数;

9)numTestsPerEvictionRun

    表示idle object evitor每次扫描的最多的对象数;

10)minEvictableIdleTimeMillis

表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

11)softMinEvictableIdleTimeMillis

    在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

12)lifo

    borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

8、使用属性配置文件配置池参数

在项目的根下面添加属性配置文件redis.properties

max-total=10
max-idle=4
min-idle=0

在java中读取配置文件并添加到配置对象中

//创建属性配置文件解析对象
Properties pro = new Properties();
//解析属性配置文件
pro.load(Class.class.getResourceAsStream("/redis.properties"));

//创建连接池配置对象
JedisPoolConfig conf = new JedisPoolConfig();
//注入配置参数
conf.setMaxTotal(Integer.parseInt(pro.getProperty("max-total")));
conf.setMaxIdle(Integer.parseInt(pro.getProperty("max-idle")));
conf.setMinIdle(Integer.parseInt(pro.getProperty("min-idle")));

 文章来源于哔站《使用Java操作Redis》

更多学习视频和专栏文章请到哔站个人空间: 布道师学院的个人空间-布道师学院个人主页-哔哩哔哩视频

更多资源和项目下载请到:”开源吧(找实战项目和毕设项目的好网站)“ ​ :开源吧

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】函数(function)和方法(method)的区别

这里先说结论&#xff0c;为了满足心急的小伙伴&#xff1a;method与function的最大区别就是参数有无进行绑定。 自定义类Test&#xff1a; 首先先来一个自定义类&#xff1a; class Test:def Func_normal(arg):print(Func_normal:,arg)staticmethoddef Func_static(arg):pri…

在vite中使用react-router-dom-v6 路由报错 Uncaught SyntaxError: Unexpected token ‘<‘

解决方法&#xff1a;将路由表“routes”下面的"index.js"改成“index.jsx”&#xff0c;正确的文件如下图所示。

Springboo整合Sentinel

Springboo整合Sentinel 1.启动Sentinel java -jar sentinel-dashboard-1.8.6.jar2.访问localhost:8080到Sentinel管理界面(默认账号和密码都是sentinel) 3.引入依赖(注意版本对应) <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spr…

window环境下Redis7服务器的安装和运行

一、readis7的下载 由于在官网上没有window版本的redis下载&#xff0c;需要到github中去搜索&#xff0c;以下以redis7为例介绍redis的下载 下载地址&#xff1a;https://github.com/zkteco-home/redis-windows 也可以到百度网盘下载 链接&#xff1a;https://pan.baidu.com…

【JavaSE重点知识归纳】第3节:运算符(算术、关系、逻辑、位、移位、优先级)

目录 一&#xff1a;什么是运算符 二&#xff1a;算术运算符 1.基本四则运算符&#xff1a;加减乘除模&#xff08;、-、*、/、%&#xff09; 2.增量运算符&#xff08;、-、*、%&#xff09; 3.自增/自减运算符&#xff08;、--&#xff09; 三&#xff1a;关系运算符 四…

【Kafka专题】Kafka集群架构设计原理详解

目录 前言前置知识课程内容一、Kafka的Zookeeper元数据梳理1.1 zookeeper整体数据1.2 Controller Broker选举机制1.3 Leader Partition选举机制1.4 Leader Partition自动平衡机制*1.5 Partition故障恢复机制1.6 HW一致性保障-Epoch更新机制1.7 总结 学习总结感谢 前言 Kafka的…

R语言实现竞争风险模型(1)

#竞争风险模型 tmp <- data.frame(gene tiaoxuan[,5:6],OS.Time Train[,"Survival_months"], OS Train[,"CSS"],stringsAsFactors F) colnames(tmp) #方法1&#xff1a;riskregression library(riskRegression) fgr1<-FGR(Hist(OS.Time,OS)~gen…

K 个一组翻转链表(链表反转,固定长度反转)(困难)

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你链表的头节点head&#xff0c;每k个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是k的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。…

Android SELinux 参数语法介绍及基础分析

Android SELinux安全策略主要使用对象安全上下文的基础进行描述&#xff0c;通过主体和客体的安全上下文去定义主体是否有权限访问客体&#xff0c;称为TypeEnforcement 安全上下文&#xff08;Security Context&#xff09; SEAndroid中的安全上下文:共有4个部分组成分别为use…

STM32 定时器介绍--通用、高级定时器

目录 高级定时器 1.功能框图 1-时钟源 2-时基单元 3-输入捕获 4-输出比较 2.输入捕获的应用 3.输出比较的应用 4.初始化结构体 1-时基初始化结构体 2-输出比较结构体 3-PWM信号 周期和占空比的计算--以通用定时器为例 4-输入捕获结构体 5-断路和死区初始化结构体…

05. 机器学习入门 - 动态规划

文章目录 从一个案例开始动态规划 Hi, 你好。我是茶桁。 咱们之前的课程就给大家讲了什么是人工智能&#xff0c;也说了每个人的定义都不太一样。关于人工智能的不同观点和方法&#xff0c;其实是一个很复杂的领域&#xff0c;我们无法用一个或者两个概念确定什么是人工智能&a…

对一条Linux命令的解读(sed find egrep)

目录 1 sed -i的意义 2 $的作用 3 find . -type f的意义 4 -exec .... {} \;的意义 5 egrep -l的意义 6 综合以上 在前面的博客源码编译elfutils_金色熊族的博客-CSDN博客中&#xff0c;我使用了一条指令 sed -i s/-Werror//g $(find . -type f -exec egrep -l _no_Werr…

学信息系统项目管理师第4版系列15_资源管理基础

1. 项目资源 1.1. 实物资源 1.1.1. 着眼于以有效和高效的方式&#xff0c;分配和使用完成项目所需的实物资源 1.1.2. 包括设备、材料、设施和基础设施 1.2. 团队资源 1.2.1. 人力资源 1.2.2. 包含了技能和能力要求 2. 人力资源管理 2.1. 不仅是组织中最重要的资源之一&…

C语言结构体指针学习

结构体变量存放内存中&#xff0c;也有起始地址&#xff0c;定义一个变量来存放这个地址&#xff0c;那这个变量就是结构体指针&#xff1b; typedef struct mydata{int a1;int a2;int a3; }mydata;void CJgtzzView::OnDraw(CDC* pDC) {CJgtzzDoc* pDoc GetDocument();ASSERT…

【算法分析与设计】回溯法(上)

目录 一、学习要点1.1 回溯法1.2 问题的解空间1.3 0-1背包问题的解空间1.4 旅行售货员问题的解空间1.5 生成问题状态的基本方法 二、回溯法的基本思想三、回溯算法的适用条件四、递归回溯五、迭代回溯六、子集树与排列树七、装载问题八、批处理作业调度问题 一、学习要点 理解回…

Scala第十一章节

Scala第十一章节 1.模式匹配 2. Option 类型 3.偏函数 4.正则表达式 5.异常处理 6.提取器 7.案例&#xff1a;随机职业 scala总目录 文档资料下载

大数据Flink(九十五):DML:Window TopN

文章目录 DML:Window TopN DML:Window TopN Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。 应用场景

【C语言】模拟实现strstr

strstr这个库函数看到这个名字大概率猜不到这是什么函数&#xff0c; 但经过学习就可以很好的认识到这个函数 目录 介绍&#xff1a;模拟实现&#xff1a;思路&#xff1a;代码实现&#xff1a; 介绍&#xff1a; 可以看到此函数是用来寻找一个字符串中是否含有另一个字符串 代…

云安全之HTTP协议介绍补充

HTTP是一个基于TCP/IP通信协议来传递数据的协议&#xff0c;传输的数据类型为HTML文件、图片文件、查询结果等。HTTP协议一般用于B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 URI、URL、URN HTTP使用统一资源标识符(Uniform Resource ldentif…

WebSocket实战之二协议分析

一、前言 上一篇 WebSocket实战之一 讲了WebSocket一个极简例子和基础的API的介绍&#xff0c;这一篇来分析一下WebSocket的协议&#xff0c;学习网络协议最好的方式就是抓包分析一下什么就都明白了。 二、WebSocket协议 本想盗一张网络图&#xff0c;后来想想不太好&#x…