Redis的Java客户端的使用

发布于:2025-04-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

Redis 的 Java 客户端使用

C++ 追求极致的性能, 而 Java没有这样的追求.

Redis 在官网公开了所使用的应用层协议 (RESP). 任何一个第三方都可以通过这个协议, 来实现出一个和 Redis 服务器通信的客户端程序.

已经有很多大佬, 做好了库, 可以让我们直接调用 (不必关注 RESP 协议的细节). 在java 生态中, 封装了 RESP 协议的 Redis 客户端是很多的. 咱们此处使用的是 jedis (jedis 提供的 api 和 redis 命令高度一致). jedis 也可以通过 maven 来下载安装.

我们这里选择 jedis 4.4.2 版本.

我们的电脑是无法直接连到云服务器的6379端口上的, 但是我们可以通过 配置 SSH 来实现在本机就能访问云服务器的6379端口.

云服务器 6379 端口 — 映射— 本机 8888 端口

image-20250305113108226

1. Java 客户端连接到 Redis 服务器

关键代码:

JedisPool jedisPool = new JedisPool("url");
Jedis jedis = jedisPool.getResource()

示例:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class Main {
    public static void main(String[] args) {
        // 连接到Redis服务器上
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
        try (Jedis jedis = jedisPool.getResource()) {
            // Redis的各种命令, 就对应到Jedis对象的各种方法
            String p = jedis.ping();
            System.out.println(p);
        }
    }
}

2. Java 客户端使用通用命令

2.1 get 和 set 方法
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

public class RedisDemo1 {
    public static void test1(Jedis jedis) {
        System.out.println("get 和 set 的使用");
        // 先清空数据库,要避免上一组测试的残留数据影响到下一组测试的结果
        jedis.flushAll();

        // 使用set方法
        jedis.set("key", "111");
        jedis.set("key2", "222");

        SetParams params = new SetParams(); //设置参数
        params.ex(10);
        //params.nx(); //不存在才能创建
        params.xx(); //存在才能修改

        jedis.set("key", "333", params);

        String value = jedis.get("key");
        System.out.println("value=" + value);
    }
}

  • 运行结果:

image-20250305112957995

2.2 exists 和 del 方法
import redis.clients.jedis.Jedis;

public class RedisDemo2 {
    public static void test2(Jedis jedis) {
        System.out.println("exists 和 del");
        jedis.flushAll();

        jedis.set("key", "111");
        jedis.set("key2", "222");
        jedis.set("key3", "333");

        boolean result1 = jedis.exists("key");
        System.out.println("result1: " + result1);

        long result2 = jedis.del("key");
        System.out.println("result2: " + result2);

        boolean result3 = jedis.exists("key");
        System.out.println("result3: " + result3);

        long result4 = jedis.del("key", "key2", "key3");
        System.out.println("result4: " + result4);
    }
}
  • 运行结果:

image-20250305112909233

2.3 keys 方法
import redis.clients.jedis.Jedis;

import java.util.Set;

public class RedisDemo3 {
    public static void test3(Jedis jedis) {
        System.out.println("keys");
        jedis.flushAll();

        jedis.set("key1", "111");
        jedis.set("key2", "222");
        jedis.set("key3", "333");
        jedis.set("key4", "444");

        // redis 中的 key 不能重复,而且也是不在意顺序的
        Set<String> keys = jedis.keys("*"); //获取所有的key
        System.out.println(keys);
    }
}

  • 运行结果:

image-20250305112809945

2.4 expire, ttl 方法
import redis.clients.jedis.Jedis;

public class RedisDemo4 {
    public static void test4(Jedis jedis) {
        System.out.println("expire 和 ttl");
        jedis.flushAll();

        jedis.set("key", "111");
        jedis.expire("key", 10);

        long time1 = jedis.ttl("key");
        System.out.println("time1: " + time1); //10s

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long time2 = jedis.ttl("key");
        System.out.println("time2: " + time2); //7s
    }
}

  • 运行结果:

image-20250305112355698

2.5 type 方法
package com.wang;

import redis.clients.jedis.Jedis;

public class RedisDemo5 {
    public static void test5(Jedis jedis) {
        System.out.println("type");
        jedis.flushAll();

        jedis.set("key1", "111");
        String type = jedis.type("key1");
        System.out.println("type1: " + type);

        jedis.lpush("key2", "111", "222", "333");
        type = jedis.type("key2");
        System.out.println("type2: " + type);

        jedis.hset("key3", "f1", "111");
        type = jedis.type("key3");
        System.out.println("type3: " + type);

        jedis.sadd("key4", "111", "222", "333");
        type = jedis.type("key4");
        System.out.println("type4: " + type);

        jedis.zadd("key5", 10, "zhangsan");
        type = jedis.type("key5");
        System.out.println("type5: " + type);
    }
}

  • 运行结果:

image-20250305112627565

3. Java 客户端使用 string 命令

3.1 mset 和 mget
import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisDemoString1 {
    public static void test1(Jedis jedis) {
        System.out.println("mget 和 mset");
        jedis.flushAll();

        //mset: 一次设置多个key.
        jedis.mset("key1", "111", "key2", "222", "key3", "333");

        //mget: 一次获取多个key.
        List<String> values = jedis.mget("key1", "key2", "key100", "key3");
        System.out.println("values: " + values);
    }
}

  • 运行结果:

image-20250305115638137

3.2 getrange 和 setrange
import redis.clients.jedis.Jedis;

public class RedisDemoString2 {
    public static void test2(Jedis jedis) {
        System.out.println("getrange 和 setrange");
        jedis.flushAll();

        jedis.set("key", "abcdefghijk");

        // 得到指定范围的子字符串
        String result = jedis.getrange("key", 2, 5);
        System.out.println("result: " + result);

        // 修改字符串
        jedis.setrange("key", 2, "xyz");
        String value = jedis.get("key");
        System.out.println("value: " + value);
    }
}

  • 运行结果:

image-20250305115941016

3.3 append
import redis.clients.jedis.Jedis;

public class RedisDemoString3 {
    public static void test3(Jedis jedis) {
        System.out.println("append");
        jedis.flushAll();

        jedis.set("key", "abcdef");
        System.out.println("value1: " + jedis.get("key"));


        jedis.append("key", "ghij");
        System.out.println("value2: " +  jedis.get("key"));
    }
}

  • 运行结果:

image-20250305120720219

3.4 incr 和 decr
import redis.clients.jedis.Jedis;

public class RedisDemoString4 {
    public static void test4(Jedis jedis) {
        System.out.println("incr 和 decr");
        jedis.flushAll();

        jedis.set("key", "100");

        long result1 = jedis.incr("key");
        System.out.println("result1: " + result1);

        System.out.println("value1: " + jedis.get("key"));


        long result2 = jedis.decr("key");
        System.out.println("result2: " + result2);

        System.out.println("value2: " + jedis.get("key"));
    }
}

  • 运行结果:

image-20250305121204443

4. Java 客户端使用 list 命令

4.1 lpush 和 lrange
import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisDemoList1 {
    public static void test1(Jedis jedis) {
        System.out.println("lpush 和 lrange");
        jedis.flushAll();

        jedis.lpush("key", "111", "222", "333");

        List<String> result = jedis.lrange("key", 0, -1);
        System.out.println(result);
    }

}

  • 运行结果:

image-20250305122740741

4.2 rpush
import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisDemoList2 {
    public static void test2(Jedis jedis) {
        System.out.println("rpush");
        jedis.flushAll();

        jedis.rpush("key", "111", "222", "333");

        List<String> result = jedis.lrange("key", 0, -1);
        System.out.println("result: " + result);
    }}

  • 运行结果:

image-20250305122908674

4.3 lpop 和 rpop
import redis.clients.jedis.Jedis;

public class RedisDemoList3 {
    public static void test3(Jedis jedis) {
        System.out.println("lpop");
        jedis.flushAll();

        jedis.rpush("key", "111", "222", "333");
        String result = jedis.lpop("key");
        System.out.println("result: " + result);

        result = jedis.lpop("key");
        System.out.println("result: " + result);

        result = jedis.lpop("key");
        System.out.println("result: " + result);

        result = jedis.lpop("key");
        System.out.println("result: " + result);
    }
}

  • 运行结果:

image-20250305152037802

  • rpop:
import redis.clients.jedis.Jedis;

public class RedisDemoList4 {
    public static void test4(Jedis jedis) {
        System.out.println("rpop");
        jedis.flushAll();

        jedis.rpush("key", "111", "222", "333");
        String result = jedis.rpop("key");
        System.out.println("result: " + result);

        result = jedis.rpop("key");
        System.out.println("result: " + result);

        result = jedis.rpop("key");
        System.out.println("result: " + result);

        result = jedis.rpop("key");
        System.out.println("result: " + result);
    }
}

  • 运行结果:

image-20250305152252467

4.4 blpop

blpop 在当 key 中有元素时, 作用和 lpop 完全相同. 当 key 中没有元素时, blpop 会阻塞, 直到 key 中有元素添加进来, 停止阻塞.

import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisDemoList5 {
    public static void test5(Jedis jedis) {
        System.out.println("blpop");
        jedis.flushAll();

        // 返回结果是一个 "二元组",一个表示从哪个 key 对应的list中删除的,一个表示删除的元素是什么.
        List<String> results = jedis.blpop(100, "key"); //设置超时时间为100s
        
        System.out.println("results[0]: " + results.get(0));
        System.out.println("results[1]: " + results.get(1));
    }
}

image-20250305152740203

在 key 中添加元素222之后:

image-20250305152905257

4.5 llen
import redis.clients.jedis.Jedis;

public class RedisDemoList6 {
    public static void test6(Jedis jedis) {
        System.out.println("llen");
        jedis.flushAll();

        jedis.rpush("key", "111", "222", "333");
        long length = jedis.llen("key");
        System.out.println("列表长度: " + length);
    }
}

  • 运行结果:

image-20250305153038788

5. Java 客户端使用 set 命令

5.1 sadd 和 smembers

sadd: 往 set 中添加元素

smembers: 返回 set 中所有的元素.

    public static void test1(Jedis jedis) {
        System.out.println("sadd 和 smembers");
        jedis.flushAll();

        jedis.sadd("key", "111", "222", "333");
        Set<String> result = jedis.smembers("key");
        System.out.println("result: " + result);
    }
  • 运行结果:

image-20250305154238761

5.2 sismember

用于判断指定元素是否存在于集合中

    public static void test2(Jedis jedis) {
        System.out.println("sismember");
        jedis.flushAll();

        jedis.sadd("key", "111", "222", "333");
        boolean result = jedis.sismember("key", "100");// 判断100是不是key中的元素
        System.out.println("result: " + result);
    }
  • 运行结果:

image-20250305154532295

5.3 scard

判断 set 中的元素个数

    public static void test3(Jedis jedis) {
        System.out.println("scard");
        jedis.flushAll();

        jedis.sadd("key", "111", "222", "333");
        long result = jedis.scard("key");
        System.out.println("result: " + result);
    }

运行结果:

image-20250305154713382

5.4 spop

随机删除 set 中的元素.

    public static void test4(Jedis jedis) {
        System.out.println("spop");
        jedis.flushAll();

        jedis.sadd("key", "111", "222", "333", "444", "555");
        String result = jedis.spop("key");
        System.out.println("result: " + result);
    }
  • 运行结果:

image-20250305155010343

5.5 sinter 和 sinterstore

sinter:

    public static void test5(Jedis jedis) {
        System.out.println("sinter");
        jedis.flushAll();

        jedis.sadd("key1", "111", "222", "333");
        jedis.sadd("key2", "111", "222", "444");

        Set<String> result = jedis.sinter("key1", "key2");
        System.out.println("result: " + result);
    }
  • 运行结果:

image-20250305155811677

sinterstore:

    public static void test6(Jedis jedis) {
        System.out.println("sinterstore");
        jedis.flushAll();

        jedis.sadd("key1", "111", "222", "333");
        jedis.sadd("key2", "111", "222", "444");

        long len = jedis.sinterstore("key3", "key1", "key2");
        System.out.println("len: " + len);

        Set<String> result = jedis.smembers("key3");
        System.out.println("result: " + result);
    }
  • 运行结果:

image-20250305160027811

6. Java 客户端使用 hash 命令

6.1 hset 和 hget
    public static void test1(Jedis jedis) {
        System.out.println("hset 和 hget");
        jedis.flushAll();

        jedis.hset("key", "f1", "111");

        Map<String, String> fields = new HashMap<>();
        fields.put("f2", "222");
        fields.put("f3", "333");

        jedis.hset("key", fields);

        System.out.println("result1: " + jedis.hget("key", "f1"));

        System.out.println("result2: " + jedis.hget("key", "f2"));

        System.out.println("result3: " + jedis.hget("key", "f100"));
    }
  • 运行结果:

image-20250305161922391

6.2 hexists 和 hdel

hexists:

    public static void test2(Jedis jedis) {
        System.out.println("hexists");
        jedis.flushAll();

        jedis.hset("key", "f1", "111");
        jedis.hset("key", "f2", "222");
        jedis.hset("key", "f3", "333");

        boolean result1 = jedis.hexists("key", "f1");
        System.out.println("result: " + result1);

        boolean result2 = jedis.hexists("key", "f100");
        System.out.println("result: " + result2);
    }
  • 运行结果:

image-20250305161900134

hdel:

    public static void test3(Jedis jedis) {
        System.out.println("hdel");
        jedis.flushAll();

        jedis.hset("key", "f1", "111");
        jedis.hset("key", "f2", "222");
        jedis.hset("key", "f3", "333");

        long result = jedis.hdel("key", "f1", "f2");
        System.out.println("result: " + result);

        System.out.println("f1.exists: " + jedis.hexists("key", "f1"));
        System.out.println("f2.exists: " + jedis.hexists("key", "f2"));
    }
  • 运行结果:

image-20250305162237787

6.3 hkeys 和 hvalues

hkeys: 获取指定 key 中的所有 field.

hvalues: 获取指定 key 中的所有 value.

    public static void test4(Jedis jedis) {
        System.out.println("hkeys 和 hvals");
        jedis.flushAll();

        jedis.hset("key", "f1", "111");
        jedis.hset("key", "f2", "222");
        jedis.hset("key", "f3", "333");

        Set<String> fields = jedis.hkeys("key");
        List<String> vals = jedis.hvals("key");
        System.out.println("fields: " + fields);
        System.out.println("vals: " + vals);
    }
  • 运行结果:

image-20250305163804677

6.4 hmset 和 hmget

hmset: 一次设置多组 field-value.

hmget: 一次获取多组 field-value.

    public static void test5(Jedis jedis) {
        System.out.println("hmset 和 hmget");
        jedis.flushAll();

        Map<String, String> map = new HashMap<>();
        map.put("f1", "111");
        map.put("f2", "222");
        map.put("f3", "333");
        jedis.hmset("key", map);

        List<String> values = jedis.hmget("key", "f2", "f1", "f3");
        System.out.println("values: " + values);
    }
  • 运行结果:

image-20250305164219360

7. Java 客户端使用 zset 命令

  • zset 中 存储的元素是 element-score 类型的.
7.1 zadd 和 zrange
    public static void test1(Jedis jedis) {
        System.out.println("zadd 和 zrange");
        jedis.flushAll();

        jedis.zadd("key", 10, "zhangsan");
        Map<String, Double> map = new HashMap<>();
        map.put("lisi", 20.0);
        map.put("wangwu", 30.0);
        jedis.zadd("key", map);

        List<String> members = jedis.zrange("key", 0, -1);
        System.out.println("members: " + members);

        List<Tuple> membersWithScore = jedis.zrangeWithScores("key", 0, -1);
        System.out.println("membersWithScore: " + membersWithScore);

        String member = membersWithScore.get(0).getElement();
        double score = membersWithScore.get(0).getScore();
        System.out.println("member: " + member + ", score: " + score);
    }
  • 运行结果:

image-20250305165702079

7.2 zcard
    public static void test2(Jedis jedis) {
        System.out.println("zcard");
        jedis.flushAll();

        jedis.zadd("key", 10, "zhangsan");
        jedis.zadd("key", 20, "lisi");
        jedis.zadd("key", 30, "wangwu");

        System.out.println("len: " + jedis.zcard("key"));
    }
  • 运行结果:

image-20250305170516099

7.3 zrem
    public static void test3(Jedis jedis) {
        System.out.println("zrem");
        jedis.flushAll();

        jedis.zadd("key", 10, "zhangsan");
        jedis.zadd("key", 20, "lisi");
        jedis.zadd("key", 30, "wangwu");

        long n = jedis.zrem("key", "zhangsan");
        System.out.println("n: " + n);

        List<Tuple> result = jedis.zrangeWithScores("key", 0, -1);
        System.out.println("result: " + result);
    }
  • 运行结果:

7.4 zscore
    public static void test4(Jedis jedis) {
        System.out.println("zscore");
        jedis.flushAll();

        jedis.zadd("key", 10, "zhangsan");
        jedis.zadd("key", 20, "lisi");
        jedis.zadd("key", 30, "wangwu");

        Double score = jedis.zscore("key", "zhangsan");
        System.out.println("zhangsan.score: " + score);
    }
  • 运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.5 zrank
    public static void test5(Jedis jedis) {
        System.out.println("zrank");
        jedis.flushAll();

        jedis.zadd("key", 10, "zhangsan");
        jedis.zadd("key", 20, "lisi");
        jedis.zadd("key", 30, "wangwu");

        Long rank = jedis.zrank("key", "zhangsan");
        System.out.println("rank: " + rank);
    }
  • 运行结果:

image-20250305171135626

8. 小结

本质上来说, Jedis 库就是对 Redis 所有命令的一个简单封装, 这里不再过多介绍. 如果有其他问题, 我们可以查看 Jedis 的官方文档 (在 github 上).