前面章节介绍了 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