什么是Jedis
Jedis是一个Java语言编写的Redis客户端库,为 Java 开发者提供了与 Redis 服务器进行交互的便捷方式。通过 Jedis,我们可以轻松地操作 Redis 的各种功能,并实现缓存、会话管理、计数器、排行榜等业务需求。无论是新手还是有经验的开发者,都可以通过 Jedis 快速上手并利用 Redis 的强大功能
例子
使用Jedis需要引入依赖,在 Maven 项目的 pom.xml 文件中添加以下依赖项
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.9.0</version>
</dependency>
一、简单例子
当使用 Jedis 时,务必在使用完成后调用 close() 方法释放资源,以避免资源泄漏。由于 Jedis 实例是非线程安全的,因此在多线程环境中共享同一个 Jedis 实例会导致并发问题,主要原因是底层共享了一个输入输出流。为了避免这个问题,可以使用 Jedis Pool 来管理多个 Jedis 实例。Jedis Pool 类似于数据库连接池或线程池的思想,它维护了一定数量的 Jedis 实例,需要时从池中获取,使用完成后归还给池。这样可以减少 Jedis 实例的创建和销毁开销,提高性能和资源利用率。
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.13.31", 6379);
jedis.set("testKey", "testValue");
System.out.println(jedis.get("testKey"));
// jedis.close() 的目的是释放Jedis实例所占用的资源
jedis.close();
}
结果:

为了避免频繁地创建和销毁连接,通常会使用连接池(例如 JedisPool)来管理连接。
二、线程池
简单例子
public static void main(String[] args) {
// 创建 Jedis 连接池配置对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10); // 设置最大连接数
poolConfig.setMaxIdle(5); // 设置最大空闲连接数
// 创建 Jedis 连接池
JedisPool jedisPool = new JedisPool(poolConfig, "192.168.13.31", 6379);
// 获取 Jedis 实例
try (Jedis jedis = jedisPool.getResource()) {
// 执行 Redis 操作
jedis.set("example_key", "example_value");
System.out.println(jedis.get("example_key"));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭 Jedis 连接池
jedisPool.close();
}
}
其他数据类型
public static void main(String[] args) {
// 配置 Jedis 连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10);
JedisPool jedisPool = new JedisPool(poolConfig, "192.168.13.31");
// 从连接池获取 Jedis 实例
try (Jedis jedis = jedisPool.getResource()) {
// 设置值
jedis.set("key1", "value1");
jedis.set("key2", "value2");
// 获取值
String value1 = jedis.get("key1");
System.out.println("key1: " + value1);
// 列表操作
jedis.lpush("list1", "item1", "item2", "item3");
List<String> list1 = jedis.lrange("list1", 0, -1);
System.out.println("List1: " + list1);
// 哈希表操作
jedis.hset("hash1", "field1", "value1");
jedis.hset("hash1", "field2", "value2");
Map<String, String> hash1 = jedis.hgetAll("hash1");
System.out.println("Hash1: " + hash1);
// Set 操作
jedis.sadd("set1", "member1", "member2", "member3");
Set<String> set1 = jedis.smembers("set1");
System.out.println("Set1: " + set1);
// ZSet 操作
jedis.zadd("zset1", 1.0, "member1");
jedis.zadd("zset1", 2.0, "member2");
jedis.zadd("zset1", 3.0, "member3");
// 获取 ZSet 中的所有成员和分数
Set<String> zsetMembers = jedis.zrange("zset1", 0, -1);
System.out.println("ZSet1: " + zsetMembers);
// 获取 ZSet 中指定成员的分数
Double member1Score = jedis.zscore("zset1", "member1");
System.out.println("ZSet1 中member1 的分数: " + member1Score);
// 获取 ZSet 中指定分数范围内的成员
Set<String> membersWithScoreInRange = jedis.zrangeByScore("zset1", 1.0, 2.0);
System.out.println("ZSet1 中得分在 1.0 到 2.0 之间的成员: " + membersWithScoreInRange);
// 删除键
jedis.del("key1");
// 检查键是否存在
boolean keyExists = jedis.exists("key1");
System.out.println("Key1 存在? " + keyExists);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接池
jedisPool.close();
}
}
Jedis 中常用的一些 API
这些 API 提供了对 Redis 数据结构的基本操作,包括字符串、哈希表、集合、有序集合等的操作
| 方法 | 描述 |
|---|---|
set(String key, String value) | 将指定键的值设置为给定的字符串值。 |
get(String key) | 返回指定键的值。 |
del(String... keys) | 删除一个或多个键。 |
exists(String key) | 检查给定键是否存在。 |
expire(String key, int seconds) | 设置键的过期时间(以秒为单位)。 |
ttl(String key) | 返回键的剩余生存时间(以秒为单位)。 |
hset(String key, String field, String value) | 将哈希表中指定字段的值设置为给定值。 |
hget(String key, String field) | 返回哈希表中指定字段的值。 |
hdel(String key, String... fields) | 删除哈希表中一个或多个字段。 |
hexists(String key, String field) | 检查哈希表中是否存在指定字段。 |
hgetAll(String key) | 返回哈希表中所有字段的值。 |
incr(String key) | 将指定键的值递增1。如果键不存在,则将其初始化为0后再递增。 |
decr(String key) | 将指定键的值递减1。如果键不存在,则将其初始化为0后再递减。 |
incrBy(String key, long increment) | 将指定键的值按指定增量递增。如果键不存在,则将其初始化为0后再递增。 |
decrBy(String key, long decrement) | 将指定键的值按指定减量递减。如果键不存在,则将其初始化为0后再递减。 |
sadd(String key, String... members) | 将一个或多个成员添加到集合中。 |
srem(String key, String... members) | 从集合中删除一个或多个成员。 |
smembers(String key) | 返回集合中的所有成员。 |
sismember(String key, String member) | 检查成员是否存在于集合中。 |
scard(String key) | 返回集合中的成员数。 |
zadd(String key, double score, String member) | 将成员及其分数添加到有序集合中。 |
zrange(String key, long start, long stop) | 按分数递增的顺序返回有序集合中指定范围内的成员。 |
zrem(String key, String... members) | 从有序集合中删除一个或多个成员。 |
zscore(String key, String member) | 返回有序集合中成员的分数。 |
zcard(String key) | 返回有序集合中的成员数。 |
append(String key, String value) | 将指定值追加到键的值末尾。如果键不存在,则相当于设置键的值为指定值。 |
strlen(String key) | 返回键值的长度。 |
小结
列举了一些简单例子,进一步的自己取探索把~~~
除了基本的连接、操作和连接池管理外,Jedis 还提供了一些进阶的用法,包括管道(pipeline)、事务(transaction)、发布订阅(pub/sub)等功能
下面简要介绍一些 Jedis 的进阶用法:
管道(Pipeline):管道可以将多个命令打包在一起发送到 Redis 服务器,减少网络往返时间,提高效率。在 Jedis 中,可以通过 Pipeline 类来实现。使用管道时,可以将一系列的 Redis 命令按顺序添加到管道中,然后一次性发送到服务器执行,最后通过 sync() 方法获取执行结果。
事务(Transaction):事务可以将一组命令打包成一个原子操作,在执行过程中不会被其他客户端的命令中断。在 Jedis 中,可以通过 Transaction 类来实现事务。使用事务时,可以使用 multi() 方法开始事务,然后添加多个命令,最后使用 exec() 方法执行事务。
发布订阅(Pub/Sub):发布订阅模式用于实现消息的发布与订阅,发布者将消息发送到指定的频道,订阅者订阅感兴趣的频道以接收消息。在 Jedis 中,可以使用 subscribe() 方法订阅一个或多个频道,并通过监听器接收消息;使用 publish() 方法向指定频道发布消息。
Lua 脚本执行:Jedis 支持执行 Lua 脚本,可以将多个命令打包成一个 Lua 脚本,在服务器端原子性地执行。可以使用 eval() 方法执行 Lua 脚本,并传递参数。
Key 操作:Jedis 提供了丰富的 key 操作方法,包括获取 key 列表、模糊匹配、设置过期时间等。
管道池和事务池:除了连接池外,Jedis 还提供了管道池和事务池,用于管理管道和事务的资源,提高并发性能。
觉得有用的可以留个关注❤

2202

被折叠的 条评论
为什么被折叠?



