# Redis 入门到精通(三)jedis(#redis入门指南)
mhr18 2024-11-17 13:34 22 浏览 0 评论
# Redis 入门到精通(三)jedis
## 一、jedis--jedis 简介
### 1、jedis 简介
Jedis 是 Redis 官方首选的 Java 客户端开发包。使用 Jedis 提供的 Java API 对 Redis 进行操作,是 Redis 官方推崇的方式;并且,使用 Jedis 提供的对 Redis 的支持也最为灵活、全面;不足之处,就是编码复杂度较高。
### 2、Java 语言连接 redis 服务的客户端:
- Jedis
- SpringData Redis
- Lettuce
### 3、编程语言与 redis
- java 语言连接 redis 服务
- C、C++、C#、Erlang、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala 连接 redis
- 可视化连接 redis 客户端
Redis Desktop Manager
Redis Client
Redis Studio
## 二、jedis--helloworld(jedis版)
### 1、准备工作: jar包导入
- jedis-jar 包 下载地址: https://mvnrepository.com/artifact/redis.clients/jedis
- 基于 maven 工程,在 pom.xml 文件中导入依赖。
```java
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactid>
<version>2.9.0</version>
</dependency>
```
### 2、客户端连接 redis
```java
// 1)连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
// 2)操作redis
jedis.set ("name", "HelloJedis");
jedis.get ("name" );
// 3)关闭redis连接
jedis.close();
```
### 3、API 文档
http://xetorthio.github.io/jedis/
### 4、打开 idea,创建 jedis 的 maven 工程。
```java
--> idea --> File
--> New --> Project
--> Maven
Project SDK: ( 1.8(java version "1.8.0_131" )
--> Next
--> Groupld : ( djh.it )
Artifactld : ( jedis )
Version : 1.0-SNAPSHOT
--> Name: ( jedis )
Location: ( ...\jedis\ )
--> Finish
```
### 5、 在工程 jedis (模块)中的 pom.xml 中导入依赖
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>jedis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
<!-- D:\java_test\Intesij_idea\jedis\pom.xml -->
```
### 6、 在工程 jedis (模块)中,创建测试类 JedisTest.java
```java
/**
* jedis\src\test\java\djh\it\jedis\test\JedisTest.java
*
* 2024-7-13 创建测试类 JedisTest.java
*/
package djh.it.jedis.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
@Test
public void testJedis(){
// 1)连接redis
Jedis jedis = new Jedis("localhost", 6379);
// 2)操作redis
jedis.set ("name", "HellJedis");
String name = jedis.get("name");
System.out.println(name);
// 3)关闭redis连接
jedis.close();
}
}
```
### 7、打开 redis 服务端,运行测试类,进行测试。
## 三、jedis--jedis 常规操作演示
### 1、jedis常规操作--list 类型数据测试方法
```java
@Test // list 类型数据测试方法
public void testList(){
// 1)连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2)操作redis
jedis.lpush("list1", "o","l","l","e","H");
jedis.rpush("list1", "Redis");
List<String> list1 = jedis.lrange("list1", 0, -1);
for (String s : list1){
System.out.print(s);
}
System.out.println();
System.out.println("list1 的长度是: " + jedis.llen("list1"));
System.out.println();
// 3)关闭redis连接
jedis.close();
}
```
### 2、jedis常规操作--hash 类型数据测试方法
```java
@Test // hash 类型数据测试方法
public void testHash(){
// 1)连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2)操作redis
jedis.hset("hash1", "a1", "a1");
jedis.hset("hash1", "a2", "a2");
jedis.hset("hash1", "a3", "a3");
jedis.hset("hash1", "a4", "a4");
jedis.hset("hash1", "a5", "a5");
jedis.hset("hash1", "a6", "a6");
Map<String, String> hash1 = jedis.hgetAll("hash1");
System.out.println(hash1);
jedis.hset("hash1", "a1", "b1");
jedis.hset("hash1", "a2", "a2");
jedis.hset("hash1", "a3", "b3");
jedis.hset("hash1", "a4", "a4");
jedis.hset("hash1", "a5", "a5");
jedis.hset("hash1", "a6", "b6");
Map<String, String> hash2 = jedis.hgetAll("hash1");
System.out.println(hash2);
System.out.println("hash1 的长度是: " + jedis.hlen("hash1"));
System.out.println();
// 3)关闭redis连接
jedis.close();
}
```
### 3、在工程 jedis (模块)中,修改 测试类 JedisTest.java 添加 testList 方法。
```java
/**
* jedis\src\test\java\djh\it\jedis\test\JedisTest.java
*
* 2024-7-13 创建测试类 JedisTest.java
*/
package djh.it.jedis.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Map;
public class JedisTest {
@Test // String 类型数据测试方法
public void testJedis(){
// 1)连接redis
Jedis jedis = new Jedis("localhost", 6379);
// 2)操作redis
jedis.set ("name", "HellJedis");
String name = jedis.get("name");
System.out.println(name);
// 3)关闭redis连接
jedis.close();
}
@Test // list 类型数据测试方法
public void testList(){
// 1)连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2)操作redis
jedis.lpush("list1", "o","l","l","e","H");
jedis.rpush("list1", "Redis");
List<String> list1 = jedis.lrange("list1", 0, -1);
for (String s : list1){
System.out.print(s);
}
System.out.println();
System.out.println("list1 的长度是: " + jedis.llen("list1"));
System.out.println();
// 3)关闭redis连接
jedis.close();
}
@Test // hash 类型数据测试方法
public void testHash(){
// 1)连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2)操作redis
jedis.hset("hash1", "a1", "a1");
jedis.hset("hash1", "a2", "a2");
jedis.hset("hash1", "a3", "a3");
jedis.hset("hash1", "a4", "a4");
jedis.hset("hash1", "a5", "a5");
jedis.hset("hash1", "a6", "a6");
Map<String, String> hash1 = jedis.hgetAll("hash1");
System.out.println(hash1);
jedis.hset("hash1", "a1", "b1");
jedis.hset("hash1", "a2", "a2");
jedis.hset("hash1", "a3", "b3");
jedis.hset("hash1", "a4", "a4");
jedis.hset("hash1", "a5", "a5");
jedis.hset("hash1", "a6", "b6");
Map<String, String> hash2 = jedis.hgetAll("hash1");
System.out.println(hash2);
System.out.println("hash1 的长度是: " + jedis.hlen("hash1"));
System.out.println();
// 3)关闭redis连接
jedis.close();
}
}
```
### 4、打开 redis 服务端,运行测试类,进行测试。
## 四、jedis--业务请求次数控制案例需求分析
### 1、案例:服务调用次数控制
人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用。
```java
案例要求
- 1)设定 A、B、C 三个用户
- 2)A用户限制10次/分调用,B用户限制30次/分调用,C用户不限制。
```
### 2、案例: 需求分析
- 1)设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用。
- 2)在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的方案。
- 3)对调用超限使用异常进行控制,异常处理设定为打印提示信息。
- 4)主程序启动3个线程,分别表示3种不同用户的调用。
## 五、jedis--程序结构搭建
### 1、在工程 jedis (模块)中,创建 类 Service.java 和内部类。
```java
/**
* jedis\src\main\java\djh\it\jedis\Service.java
*
* 2024-7-13 创建类 Service.java
*/
package djh.it.jedis;
public class Service {
//业务操作
public void business(){
System.out.println("业务操作执行");
}
}
//线程启动类
class MyThread extends Thread {
Service sc = new Service();
public void run(){
while (true){
sc.business();
}
}
}
//main方法
class Main {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.run();
}
}
```
### 2、运行类 Service.java 的内部类 Main.java 的 main() 方法。
## 六、jedis--程序代码实现
### 1、jedis--程序代码实现--案例:实现步骤1
```java
//业务操作:1)设定业务方法
public void business(String id, Long val){
System.out.println("用户" + id + " 业务操作执行第 " + val + " 次");
}
```
### 2、jedis--程序代码实现--案例:实现步骤2
```java
//线程启动类:2)设定多线程类,模拟用户调用
class MyThread extends Thread {
Service sc;
public MyThread(String id, int num){
sc = new Service(id, num);
}
public void run(){
while (true){
sc.service();
try {
Thread.sleep(300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
### 3、jedis--程序代码实现--案例:实现步骤3
```java
//控制单元:3)设计redis控制方案
public void service(){
Jedis jedis = new Jedis("127.0.0.1", 6379);
String value = jedis.get("compid:" + id);
try {
//判断该值是否存在
if(value == null){
//不存在,创建该值
jedis.setex("compid:" + id, 8, Long.MAX_VALUE-num + "");
}else{
//存在,自增,调用业务
Long val = jedis.incr("compid:" + id);
business(id, num-(Long.MAX_VALUE - val));
}
}catch (JedisDataException e){
System.out.println("使用已经达到上限,请升级用户");
return;
}finally {
jedis.close();
}
}
```
### 4、jedis--程序代码实现--案例:实现步骤4
```java
//4)设计启动主程序
class Main {
public static void main(String[] args) {
MyThread mt1 = new MyThread("初级用户", 10);
MyThread mt2 = new MyThread("高级级用户", 30);
mt1.start();
mt2.start();
}
}
```
### 5、在工程 jedis (模块)中,修改 类 Service.java 中,添加控制单元方法等。
```java
/**
* jedis\src\main\java\djh\it\jedis\Service.java
*
* 2024-7-13 创建类 Service.java
*/
package djh.it.jedis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;
import java.util.jar.JarEntry;
public class Service {
private String id;
private int num;
public Service(String id, int num){
this.id = id;
this.num = num;
}
//控制单元
//public void service(String id){
public void service(){
Jedis jedis = new Jedis("127.0.0.1", 6379);
String value = jedis.get("compid:" + id);
try {
//判断该值是否存在
if(value == null){
//不存在,创建该值
//jedis.setex("compid:" + id, 20, Long.MAX_VALUE-10 + "");
jedis.setex("compid:" + id, 8, Long.MAX_VALUE-num + "");
}else{
//存在,自增,调用业务
Long val = jedis.incr("compid:" + id);
//business(id, val);
//business(id, Long.MAX_VALUE - val);
//business(id, 10-(Long.MAX_VALUE - val));
business(id, num-(Long.MAX_VALUE - val));
}
}catch (JedisDataException e){
System.out.println("使用已经达到上限,请升级用户");
return;
}finally {
jedis.close();
}
//jedis.close();
}
//业务操作
public void business(String id, Long val){
//System.out.println("业务操作执行");
System.out.println("用户" + id + " 业务操作执行第 " + val + " 次");
}
}
//线程启动类
class MyThread extends Thread {
//Service sc = new Service();
Service sc;
public MyThread(String id, int num){
sc = new Service(id, num);
}
public void run(){
while (true){
//sc.business();
//sc.service("初级用户");
sc.service();
try {
//Thread.sleep(1000L);
Thread.sleep(300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//main方法
class Main {
public static void main(String[] args) {
// MyThread mt = new MyThread();
// //mt.run();
// mt.start();
MyThread mt1 = new MyThread("初级用户", 10);
MyThread mt2 = new MyThread("高级级用户", 30);
mt1.start();
mt2.start();
}
}
```
### 6、运行类 Service.java 的内部类 Main.java 的 main() 方法,进行测试。
## 七、jedis--jedis 工具类制作
### 1、基于连接池获取连接
```java
//JedisPool: Jedis提供的连接池技术
// poolConfig:连接池配置对象
// host:redis服务地址
// port:redis服务端口号
public JedisPool (Generic0bjectPoolConfig poolConfig, string host, int port) {
this (poolConfig, host, port,2000,(String)null,0,(String) nu1l);
}
```
### 2、在工程 jedis (模块)中,创建工具类 JedisUtils.java
```java
/**
* jedis.src.main.java.djh.it.jedis.utils.JedisUtils.java
*
* 2024-7-13 创建工具类 JedisUtils.java
*/
package djh.it.jedis.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisUtils {
public static Jedis getJedis(){
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(30);
jpc.setMaxIdle(10);
String host = "127.0.0.1";
int port = 6379;
JedisPool jp = new JedisPool(jpc, host, port);
return jp.getResource();
}
public static void main(String[] args){
JedisUtils.getJedis();
}
}
```
### 3、在工程 jedis (模块)中,修改 类 Service.java 中,测试工具类
```java
/**
* jedis\src\main\java\djh\it\jedis\Service.java
*
* 2024-7-13 创建类 Service.java
*/
package djh.it.jedis;
import djh.it.jedis.utils.JedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;
import java.util.jar.JarEntry;
public class Service {
private String id;
private int num;
public Service(String id, int num){
this.id = id;
this.num = num;
}
//控制单元
//public void service(String id){
public void service(){
//Jedis jedis = new Jedis("127.0.0.1", 6379);
Jedis jedis = JedisUtils.getJedis();
String value = jedis.get("compid:" + id);
try {
//判断该值是否存在
if(value == null){
//不存在,创建该值
//jedis.setex("compid:" + id, 20, Long.MAX_VALUE-10 + "");
jedis.setex("compid:" + id, 8, Long.MAX_VALUE-num + "");
}else{
//存在,自增,调用业务
Long val = jedis.incr("compid:" + id);
//business(id, val);
//business(id, Long.MAX_VALUE - val);
//business(id, 10-(Long.MAX_VALUE - val));
business(id, num-(Long.MAX_VALUE - val));
}
}catch (JedisDataException e){
System.out.println("使用已经达到上限,请升级用户");
return;
}finally {
jedis.close();
}
//jedis.close();
}
//业务操作
public void business(String id, Long val){
//System.out.println("业务操作执行");
System.out.println("用户" + id + " 业务操作执行第 " + val + " 次");
}
}
//线程启动类
class MyThread extends Thread {
//Service sc = new Service();
Service sc;
public MyThread(String id, int num){
sc = new Service(id, num);
}
public void run(){
while (true){
//sc.business();
//sc.service("初级用户");
sc.service();
try {
//Thread.sleep(1000L);
Thread.sleep(300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//main方法
class Main {
public static void main(String[] args) {
// MyThread mt = new MyThread();
// //mt.run();
// mt.start();
MyThread mt1 = new MyThread("初级用户", 10);
MyThread mt2 = new MyThread("高级级用户", 30);
mt1.start();
mt2.start();
}
}
```
### 4、在工程 jedis (模块)中,创建 配置文件 redis.properties
```java
# jedis\src\main\resources\redis.properties
redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=30
redis.maxIdle=10
```
### 5、在工程 jedis (模块)中,修改 工具类 JedisUtils.java
```java
/**
* jedis.src.main.java.djh.it.jedis.utils.JedisUtils.java
*
* 2024-7-13 创建工具类 JedisUtils.java
*/
package djh.it.jedis.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
public class JedisUtils {
private static JedisPool jp = null;
private static String host = null;
private static int port;
private static int maxTotal;
private static int maxIdle;
//静态代码块
static {
JedisPoolConfig jpc = new JedisPoolConfig();
// jpc.setMaxTotal(30);
// jpc.setMaxIdle(10);
//
// String host = "127.0.0.1";
// int port = 6379;
ResourceBundle rb =ResourceBundle.getBundle("redis");
host = rb.getString("redis.host");
port = Integer.parseInt(rb.getString("redis.port"));
maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdle);
jp = new JedisPool(jpc, host, port);
}
public static Jedis getJedis(){
return jp.getResource();
}
public static void main(String[] args){
JedisUtils.getJedis();
}
}
```
## 八、jedis--可视化客户端介绍
### 1、redis-desktop-manager 下载安装
https://www.onlinedown.net/soft/10085694.htm
https://www.ddooo.com/softdown/93635.htm
https://www.xiazaiba.com/html/142075.html
### 2、jedis-可视化客户端 使用
`上一节关联链接请点击:`
[# Redis 入门到精通(二)通用指令](https://dzs168.blog.csdn.net/article/details/140401350)
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)