1、引入依赖

Java 操作 redis 的客⼾端有很多. 其中最知名的是 jedis.
创建 maven 项⽬, 把 jedis 的依赖拷⻉到 pom.xml 中

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

版本选择⼀个相对较新的版本即可.

2、配置端口转发

Redis 服务器安装在云服务器上, ⽽我们编写的代码则是在本地主机.
要想让本地主机能访问 redis, 需要把 redis 的端口通过云服务器后台⻚⾯的 “防⽕墙” / “安全组” 放开
端口到公⽹上. 但是这个操作⾮常危险(⿊客会顺着 redis 端口进来).
因此我们可以使⽤端口转发的⽅式, 直接把服务器的 redis 端口映射到本地

在 xshell 中, 进⾏如下配置:

  1. 右键云服务器的会话, 选择属性
  2. 找到隧道 -> 配置转移规则
    配置端口转发
  3. 使⽤该会话连接服务器.
    此时, 访问本地的 8888, 就相当于访问对应服务器的 6379

注意, xshell 和服务器必须处在连接状态, 这样的映射才是有效的

3、连接 Redis Server

  • 使⽤JedisPool描述 Redis 服务器的位置. 使⽤ url 来表⽰.
  • 使⽤getResource和服务器建立连接.
  • 使用 try-with-resources 自动关闭连接,避免资源泄漏
  • 通过 ping ⽅法可以检测连接是否正确建立
public class RedisBasicOps {
    public static void main(String[] args) {
        // 配置连接池(本地端口8888映射云服务器6379端口,需提前配置端口转发)
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
        
        // 建立连接并测试
        try (Jedis jedis = jedisPool.getResource()) {
            // ping 测试连接,返回 PONG 表示连接成功
            String pingResult = jedis.ping();
            System.out.println(pingResult); // 执行结果:PONG
        }
        // 注意:SLF4J 日志相关报错(如 Failed to load class "org.slf4j.impl.StaticLoggerBinder")可忽略,不影响功能
    }
}

执行结果

PONG

4、基础键操作

包含键的增删查、过期时间设置、类型判断等核心操作。

4.1 set 和 get(设置与获取键值)

  • 功能:set 用于设置键值对,get 用于获取指定键的值,键不存在时返回 null
  • 代码示例:
private static void testGetSet(Jedis jedis) {
    // 设置键值对
    jedis.set("key1", "value1");
    jedis.set("key2", "value2");
    
    // 获取键值
    String value1 = jedis.get("key1");
    String value2 = jedis.get("key2");
    String valueNull = jedis.get("noSuchKey"); // 不存在的键
    
    // 打印结果
    System.out.println(value1);    // 执行结果:value1
    System.out.println(value2);    // 执行结果:value2
    System.out.println(valueNull); // 执行结果:null
}

4.2 exists 和 del(判断键存在与删除键)

  • 功能:exists 判断键是否存在(返回 boolean);del 删除一个或多个键(返回实际删除的键数量)。
  • 代码示例:
private static void testExistsAndDel(Jedis jedis) {
    // 初始化3个键
    jedis.set("key1", "value");
    jedis.set("key2", "value");
    jedis.set("key3", "value");
    
    // 判断key1是否存在
    boolean isKey1Exist = jedis.exists("key1");
    System.out.println(isKey1Exist); // 执行结果:true
    
    // 删除key1,返回删除数量
    long delCount1 = jedis.del("key1");
    System.out.println(delCount1);   // 执行结果:1
    
    // 再次判断key1是否存在
    isKey1Exist = jedis.exists("key1");
    System.out.println(isKey1Exist); // 执行结果:false
    
    // 批量删除key2和key3
    long delCount2 = jedis.del("key2", "key3");
    System.out.println(delCount2);   // 执行结果:2
    
    // 判断key2是否存在
    boolean isKey2Exist = jedis.exists("key2");
    System.out.println(isKey2Exist); // 执行结果:false
}

4.3 keys(匹配查询键)

  • 功能:通过通配符匹配键,支持 *(匹配任意字符)、?(匹配单个字符)。
  • 代码示例:
private static void testKeys(Jedis jedis) {
    // 初始化4个键
    jedis.set("key1", "value1");
    jedis.set("key2", "value2");
    jedis.set("key3", "value3");
    jedis.set("myKey", "value4");
    
    // 匹配所有键(* 表示任意字符)
    Set<String> allKeys = jedis.keys("*");
    System.out.println(allKeys); // 执行结果:[key1, key2, key3, myKey]
    
    // 匹配以key开头且后续仅1个字符的键(? 表示单个字符)
    Set<String> matchKeys = jedis.keys("key?");
    System.out.println(matchKeys); // 执行结果:[key1, key2, key3]
}

4.4 expire 和 ttl(设置过期时间与查询剩余时间)

  • 功能:setex 可直接设置键值并指定过期时间(单位:秒);ttl 查询键的剩余过期时间(单位:秒)。
  • 代码示例:
private static void testExpireAndTTL(Jedis jedis) {
    // 设置key,过期时间60秒
    jedis.setex("key", 60, "value");
    
    // 查询key的剩余过期时间
    long remainingTime = jedis.ttl("key");
    System.out.println(remainingTime); // 执行结果:60(实际值可能因执行耗时略有偏差)
}

4.5 type(判断键类型)

  • 功能:返回键对应的值类型,支持 stringlisthashsetzset
  • 代码示例:
private static void testType(Jedis jedis) {
    // 1. string 类型
    jedis.set("key1", "value");
    System.out.println(jedis.type("key1")); // 执行结果:string
    
    // 2. list 类型
    jedis.lpush("key2", "a", "b", "c");
    System.out.println(jedis.type("key2")); // 执行结果:list
    
    // 3. hash 类型
    jedis.hset("key3", "name", "zhangsan");
    System.out.println(jedis.type("key3")); // 执行结果:hash
    
    // 4. set 类型
    jedis.sadd("key4", "111", "222", "333");
    System.out.println(jedis.type("key4")); // 执行结果:set
    
    // 5. zset 类型
    jedis.zadd("key5", 1, "aaa");
    System.out.println(jedis.type("key5")); // 执行结果:zset
}

5、字符串操作

针对 Redis 中 string 类型的专项操作,包含批量读写、拼接、截取等。

5.1 mset 和 mget(批量设置与获取)

  • 功能:mset 批量设置多个键值对,mget 批量获取多个键的值。
  • 代码示例:
private static void testMSetAndMGet(Jedis jedis) {
    // 批量设置3个键值对
    jedis.mset("key1", "value1", "key2", "value2", "key3", "value3");
    
    // 批量获取3个键的值
    List<String> values = jedis.mget("key1", "key2", "key3");
    System.out.println(values); // 执行结果:[value1, value2, value3]
}

5.2 append(字符串拼接)

  • 功能:在指定键的字符串末尾拼接内容,键不存在时会自动创建并设置初始值。
  • 代码示例:
private static void testAppend(Jedis jedis) {
    // 拼接内容到key(key不存在时,相当于 set key "aaa")
    jedis.append("key", "aaa");
    String value1 = jedis.get("key");
    System.out.println(value1); // 执行结果:aaa
    
    // 继续拼接内容
    jedis.append("key", "bbb");
    String value2 = jedis.get("key");
    System.out.println(value2); // 执行结果:aaabbb
}

5.3 getrange 和 setrange(字符串截取与替换)

  • 功能:getrange 截取字符串(区间为闭区间,包含起始和结束索引);setrange 从指定索引开始替换字符串。
  • 代码示例:
private static void testGetRangeAndSetRange(Jedis jedis) {
    // 设置初始字符串:abcdefg
    jedis.set("key", "abcdefg");
    
    // 截取索引1到4的字符(闭区间,对应 b、c、d、e)
    String subStr = jedis.getrange("key", 1, 4);
    System.out.println(subStr); // 执行结果:bcde
    
    // 从索引0开始替换,将 "xyz" 覆盖到原字符串
    jedis.setrange("key", 0, "xyz");
    String updatedValue = jedis.get("key");
    System.out.println(updatedValue); // 执行结果:xyzdefg
}

5.4 setnx(不存在时设置键)

  • 功能:set if not exists,仅当键不存在时才设置值,返回 1 表示设置成功,0 表示键已存在。
  • 代码示例:
private static void testSetnx(Jedis jedis) {
    // key不存在,设置成功
    long setResult1 = jedis.setnx("key", "value");
    System.out.println(setResult1); // 执行结果:1
    String value1 = jedis.get("key");
    System.out.println(value1);    // 执行结果:value
    
    // key已存在,设置失败
    long setResult2 = jedis.setnx("key", "value2");
    System.out.println(setResult2); // 执行结果:0
    String value2 = jedis.get("key");
    System.out.println(value2);    // 执行结果:value(值未被覆盖)
}

5.5 psetex 和 pttl(毫秒级过期时间)

  • 功能:psetex 以毫秒为单位设置键的过期时间;pttl 以毫秒为单位查询剩余过期时间(结果可能因执行耗时略有偏差)。
  • 代码示例:
private static void testPsetexAndPttl(Jedis jedis) {
    // 设置key,过期时间1000毫秒(1秒)
    jedis.psetex("key", 1000, "value");
    
    // 查询剩余过期时间(毫秒)
    long remainingMs = jedis.pttl("key");
    System.out.println(remainingMs); // 执行结果:998(示例值,实际因耗时略有差异)
}

5.6 incr 和 decr(整数自增/自减)

  • 功能:对存储整数的键进行自增(incr)或自减(decr),每次增减幅度为 1,键不存在时默认初始值为 0。
  • 代码示例:
private static void testIncrAndDecr(Jedis jedis) {
    // 设置初始值为0
    jedis.set("key", "0");
    
    // 自增1
    jedis.incr("key");
    System.out.println(jedis.get("key")); // 执行结果:1
    
    // 自减1
    jedis.decr("key");
    System.out.println(jedis.get("key")); // 执行结果:0
}

5.7 incrby 和 decrby(指定幅度增减)

  • 功能:incrby 按指定幅度自增,decrby 按指定幅度自减,支持自定义增减数值。
  • 代码示例:
private static void testIncrByAndDecrBy(Jedis jedis) {
    // 设置初始值为0
    jedis.set("key", "0");
    
    // 自增10
    jedis.incrBy("key", 10);
    System.out.println(jedis.get("key")); // 执行结果:10
    
    // 自减5
    jedis.decrBy("key", 5);
    System.out.println(jedis.get("key")); // 执行结果:5
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐