Jedis 操作字符串

前面章节介绍了 Jedis 的基础用法,以及 Jedis 线程池、客户端分片等知识,本章将介绍怎样通过 Jedis 操作字符串。Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。

注意:为了便于测试,将使用 JUnit 单元测试进行功能验证。

设置值

使用 jedis 设置一个 key-value 键值对到 Redis,以及设置键的过期时间、根据偏移量设置键的值等。方法定义如下:

  • String set(String key, String value) 将字符串值设置为键的值。

  • String set(String key, String value, SetParams params) 将字符串值设置为键的值。

  • String set(byte[] key, byte[] value) 已弃用。将字符串值设置为键的值。

  • String set(byte[] key, byte[] value, SetParams params) 已弃用。将字符串值设置为键的值。

  • String setex(String key, long seconds, String value) 该命令完全等效于以下一组命令:SET + EXPIRE。

  • Long setnx(String key, String value) SETNX 的工作方式与 SET 完全相同,唯一的区别是如果键已存在,则不执行任何操作。

  • Long setrange(String key, long offset, String value) 从 offset 偏移量开始出设置值。

示例:

// 简单设置 key1 的值为 value1
jedis.set("key1", "value1");

SetParams setParams = new SetParams();
// 设置指定的过期时间(以秒为单位)
//setParams.ex(120);
// 设置指定的过期时间(以毫秒为单位)
setParams.px(120 * 1000);
jedis.set("key2", "value2", setParams);

// 设置 key3 过期时间为 120 秒
jedis.setex("key3", 120, "value3");

jedis.setnx("key3", "value3-new");
// 如果 key4 不存在,则设置 key4;存在,则不设置
if(jedis.setnx("key4", "value4") == 1) {
   System.out.println("设置成功");
}

// 从指定的偏移量处开始设置值
jedis.set("key5", "Hello World");
jedis.setrange("key5", 6, "Jedis");

// 输出所有 key 的值
Set<String> keys = jedis.keys("*");
for(String key : keys) {
   System.out.println(key + "=" + jedis.get(key) + " (ttl=" + jedis.ttl(key) + ")");
}

运行结果:

设置成功
key1=value1 (ttl=-1)
key2=value2 (ttl=120)
key5=Hello Jedis (ttl=-1)
key3=value3 (ttl=120)
key4=value4 (ttl=-1)

批量设置

支持一次性设置多个键的值,方法定义如下:

  • String mset(String... keysvalues) 批量设置键值对

  • Long msetnx(String... keysvalues) 批量设置键值对,如果键已存在,则什么也不做。

注意:如果 mset 和 msetnx 方法参数的个数不是偶数(即一个键对应一个值,如:mset(键1,值1,键2,值2)),则会抛出 “redis.clients.jedis.exceptions.JedisDataException: ERR wrong number of arguments for MSET” 错误。

示例:

// 相当于批量执行 set
jedis.mset("key1", "value1", "key2", "value2");

// 相当于批量执行 setnx
jedis.msetnx("key3", "value3", "key2", "value2", "key4", "value4");

Set<String> keys = jedis.keys("*");
System.out.println(Arrays.toString(keys.toArray())); // [key1, key2]

注意,上面示例运行后,Redis 只存在 key1 和 key2,key4 不会被添加到 Redis,因为 msetnx 方法中 key2 已经存在,则什么也不做,后续键将不会被添加到 Redis。

获取值

一次从 Redis 服务中获取一个或多个值,方法定义如下:

  • String get(String key)  获取指定键的值。如果键不存在,则返回特殊值 'nil'。如果存储在 key 中的值不是字符串,则返回错误,因为 GET 只能处理字符串值。

  • String getrange(String key, long startOffset, long endOffset)  获取指定键的值中 startOffset 到 endOffset 之间的字符串。

  • String getSet(String key, String value)  执行一个 GETSET 命令,GETSET 是一个原子设置该值并返回旧值命令。

  • List<String> mget(String... keys)  获取所有指定键的值。

示例:

// 准备点数据
jedis.set("key1", "value1");
jedis.set("key2", "value2");
jedis.set("key3", "value3");

// 获取 key1 的值
String key1Val = jedis.get("key1");
System.out.println("key1=" + key1Val); // key1=value1

// 获取 key2 偏移量从 2 到 4 的子字符串值
String rangeVal = jedis.getrange("key2", 2, 4);
System.out.println("rangeVal=" + rangeVal); // rangeVal=lue

// 批量获取 key1、key2 和 key3 的值
List<String> valueList = jedis.mget("key1", "key2", "key3");
System.out.println("valueList=" + Arrays.asList(valueList.toArray()));
// valueList=[value1, value2, value3]

// 获取值的同时,设置一个新值
String oldValue = jedis.getSet("key1", "new value1");
System.out.println("old key1=" + oldValue); // old key1=value1
System.out.println("new key1=" + jedis.get("key1")); // new key1=new value1

获取长度

获取指定键存储值的长度,方法定义如下:

  • Long strlen(String key)

示例:

// 准备点数据
jedis.set("name", "人人编程网");
jedis.set("url", "www.hxstrive.com");

// 获取 name 和 url 键的值的长度
long nameLen = jedis.strlen("name");
System.out.println("nameLen=" + nameLen); // nameLen=15

long urlLen = jedis.strlen("url");
System.out.println("urlLen=" + urlLen); // urlLen=16

追加

将指定的字符串追加到指定键存储的值的后面,方法定义如下:

  • Long append(String key, String value)  如果键已经存在并且是字符串,则此命令将提供的值附加到字符串的末尾。如果键不存在,则创建并设置为空字符串,因此在这种特殊情况下,APPEND 将非常类似于 set。

示例:

// 准备点数据
jedis.set("name", "人人编程网");

// 追加网址
jedis.append("name", "(www.hxstrive.com)");

String value = jedis.get("name");
System.out.println(value); // 人人编程网(www.hxstrive.com)

// 追加到一个不存在键中
jedis.append("not_exist_key", "hello redis");
value = jedis.get("not_exist_key");
System.out.println(value); // hello redis

自增自减

Redis 允许直接对存储的值进行自增自减,该操作是原子操作,注意值必须可以转换成数字,方法定义如下:

  • Long incr(String key)  将存储在键上的数字加1。如果该键不存在或包含错误类型的值,则先将该键值设置为“0”,再进行加 1 操作。注意:INCR 命令仅限于64位有符号整数。注意:这实际上是一个字符串操作,也就是说,在 Redis 中没有 “integer” 类型。简单地说,存储在键中的字符串被解析为以 10 为基数的 64 位有符号整数,然后加 1,然后转换回字符串。

  • Long incrBy(String key, long increment) 和 incr 类似,只是允许我们指定增量大小。

  • Long decr(String key)  将存储在键上的数字减1。如果键值不存在或类型错误,先将键值设置为 “0”,再执行减 1 操作。

  • Long decrBy(String key, long decrement) 和 decr 类似,该方法允许我们指定递减大小。

  • Double incrByFloat(String key, double increment) 和 decr 类似,该方法允许我们指定递减大小。

示例:

// 准备点数据
jedis.set("count", "0");

// 自增1
jedis.incr("count");
System.out.println(jedis.get("count")); // 1

// 自减1
jedis.decr("count");
System.out.println(jedis.get("count")); // 0

// 自增10
jedis.incrBy("count", 10);
System.out.println(jedis.get("count")); // 10

// 自减10
jedis.decrBy("count", 10);
System.out.println(jedis.get("count")); // 0
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号