Spring Data Redis 中,Value 类型的响应式接口为 ReactiveValueOperations,该接口定义的方法和 ValueOperations、BoundValueOperations 接口定义的方法非常类似。
我们可以通过 ReactiveRedisTemplate 的 opsForValue() 方法获取获取,代码如下:
ReactiveValueOperations<String,String> ops = reactiveRedisTemplate.opsForValue();
reactor.core.publisher.Mono<Boolean> set(K key, V value) 将给定的值设置到键
reactor.core.publisher.Mono<Boolean> set(K key, V value, Duration timeout) 将给定的值设置到键,且指定过期时间
reactor.core.publisher.Mono<Long> set(K key, V value, long offset) 用给定值覆盖从指定偏移量开始的键的部分。
reactor.core.publisher.Mono<Boolean> setBit(K key, long offset, boolean value) 将位设置在 key 中存储的值的偏移量处。
reactor.core.publisher.Mono<Boolean> setIfAbsent(K key, V value) 如果 key 不存在,则设置 key 以保存字符串值。
reactor.core.publisher.Mono<Boolean> setIfPresent(K key, V value) 如果 key 存在,则设置 key 以保存字符串值。
reactor.core.publisher.Mono<Boolean> multiSet(Map<? extends K,? extends V> map) 将参数Map中所有的键值对设置为多个值
reactor.core.publisher.Mono<Boolean> multiSetIfAbsent(Map<? extends K,? extends V> map) 仅当提供的键不存在时,才使用Map中提供的键值对将多个键设置为多个值。
示例:
@Test public void set() { CountDownLatch countDownLatch = new CountDownLatch(3); ReactiveValueOperations<String,String> ops = reactiveRedisTemplate.opsForValue(); // 异步设置值 ops.set("value-key", "value1").subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) { System.out.println(aBoolean ? "设置 value-key 成功" : "设置 value-key 失败"); countDownLatch.countDown(); } }); // 异步更新值 ops.getAndSet("value-key", "value2").subscribe(new Consumer<String>() { @Override public void accept(String s) { System.out.println("修改 value-key 失败,旧值:" + s); countDownLatch.countDown(); } }); // 异步批量设置值 Map<String,String> map = new HashMap<>(); map.put("value-key1", "value1"); map.put("value-key2", "value2"); map.put("value-key3", "value3"); ops.multiSet(map).subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) { System.out.println(aBoolean ? "批量设置成功" : "批量设置失败"); countDownLatch.countDown(); } }); try { // 等待设置值完成 countDownLatch.await(); // 同步获取数据 Mono<List<String>> mono = ops.multiGet(Arrays.asList( "value-key1", "value-key3", "value-key2")); List<String> list = mono.block(); for(String value : list) { System.out.println(value); } } catch (Exception e) { e.printStackTrace(); } }
运行示例,输出结果如下:
设置 value-key 成功 修改 value-key 失败,旧值:value1 批量设置成功 value1 value3 value2
reactor.core.publisher.Mono<Long> append(K key, String value) 将给定的值追加到键的值的尾部
示例:
@Test public void append() { CountDownLatch countDownLatch = new CountDownLatch(1); ReactiveValueOperations<String,String> ops = reactiveRedisTemplate.opsForValue(); // 同步添加一个值 Mono<Boolean> mono = ops.set("value-key", "hello world"); mono.block(); // 异步追加值到键 ops.append("value-key", " new value").subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) { ops.get("value-key").subscribe(new Consumer<String>() { @Override public void accept(String s) { System.out.println("新值:" + s); countDownLatch.countDown(); } }); } }); try { countDownLatch.await(); } catch (Exception e) { e.printStackTrace(); } }
运行示例,输出结果如下:
新值:hello world new value
reactor.core.publisher.Mono<String> get(K key, long start, long end) 从指定键中获取一个子字符串,子字符串从 bengin 到 end 范围内。
reactor.core.publisher.Mono<V> get(Object key) 获取指定键的值
reactor.core.publisher.Mono<V> getAndSet(K key, V value) 将值设置到键,且返回旧的值。
reactor.core.publisher.Mono<Boolean> getBit(K key, long offset) 获取键中指定下标的 Bit 位的值
reactor.core.publisher.Mono<List<V>> multiGet(Collection<K> keys) 批量获取键的值
示例:
@Test public void get() { CountDownLatch countDownLatch = new CountDownLatch(1); ReactiveValueOperations<String,String> ops = reactiveRedisTemplate.opsForValue(); // 同步添加一个值 Mono<Boolean> mono = ops.set("value-key", "hello world"); mono.block(); // 异步获取值 ops.get("value-key").subscribe(new Consumer<String>() { @Override public void accept(String s) { System.out.println("value-key=" + s); // 异步获取且设置新值 ops.getAndSet("value-key", "new value").subscribe(new Consumer<String>() { @Override public void accept(String s) { System.out.println("value-key=" + s); countDownLatch.countDown(); } }); } }); try { countDownLatch.await(); // 同步获取最新设置的值 String value = ops.get("value-key").block(); System.out.println("value-key=" + value); } catch (Exception e) { e.printStackTrace(); } }
运行示例,输出结果如下:
value-key=hello world value-key=hello world value-key=new value
reactor.core.publisher.Mono<Boolean> delete(K key) 删除给定的键
示例:
@Test public void delete() { CountDownLatch countDownLatch = new CountDownLatch(1); ReactiveValueOperations<String,String> ops = reactiveRedisTemplate.opsForValue(); // 同步添加数据 Mono<Boolean> mono = ops.set("value-key", "hello world"); Boolean flag = mono.block(); System.out.println(flag ? "添加成功" : "添加失败"); // 异步删除键 Mono<Boolean> mono2 = ops.delete("value-key"); mono2.subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) { System.out.println(aBoolean ? "删除成功" : "删除失败"); countDownLatch.countDown(); } }); try { countDownLatch.await(); } catch (Exception e) { e.printStackTrace(); } }
运行示例,输出结果如下:
添加成功 删除成功
reactor.core.publisher.Mono<Long> size(K key) 获取指定健存储值的长度
示例:
@Test public void size() { CountDownLatch countDownLatch = new CountDownLatch(1); ReactiveValueOperations<String,String> ops = reactiveRedisTemplate.opsForValue(); // 同步添加数据 Mono<Boolean> mono = ops.set("value-key", "hello world"); mono.block(); // 获取 value-key 存储值的长度 ops.size("value-key").subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) { System.out.println("size=" + aLong); countDownLatch.countDown(); } }); try { countDownLatch.await(); } catch (Exception e) { e.printStackTrace(); } }
运行示例,输出结果如下:
size=11