Redis Java 基础键操作和字符串操作(基于 Jedis)
·
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 中, 进⾏如下配置:
- 右键云服务器的会话, 选择属性
- 找到隧道 -> 配置转移规则

- 使⽤该会话连接服务器.
此时, 访问本地的 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(判断键类型)
- 功能:返回键对应的值类型,支持
string、list、hash、set、zset。 - 代码示例:
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
}
更多推荐
所有评论(0)