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 文件中导入依赖。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactid>
<version>2.9.0</version>
</dependency>
2、客户端连接 redis
// 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 工程。
--> 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 中导入依赖
<?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
/**
* 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 类型数据测试方法
@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 类型数据测试方法
@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 方法。
/**
* 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次调用。
案例要求
- 1)设定 A、B、C 三个用户
- 2)A用户限制10次/分调用,B用户限制30次/分调用,C用户不限制。
2、案例: 需求分析
- 1)设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用。
- 2)在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的方案。
- 3)对调用超限使用异常进行控制,异常处理设定为打印提示信息。
- 4)主程序启动3个线程,分别表示3种不同用户的调用。
五、jedis–程序结构搭建
1、在工程 jedis (模块)中,创建 类 Service.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
//业务操作:1)设定业务方法
public void business(String id, Long val){
System.out.println("用户" + id + " 业务操作执行第 " + val + " 次");
}
2、jedis–程序代码实现–案例:实现步骤2
//线程启动类: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
//控制单元: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
//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 中,添加控制单元方法等。
/**
* 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、基于连接池获取连接
//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
/**
* 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 中,测试工具类
/**
* 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
# 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
/**
* 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 入门到精通(二)通用指令