redisTemplate.opsForValue()中方法讲解

本文详细介绍了RedisTemplate的ValueOperations接口,包括set、setIfAbsent、get、getAndSet等17个方法的使用,涉及字符串操作、过期时间设置、批量操作及增量计算等,帮助理解RedisTemplate在Spring中操作Redis的常用方法。
部署运行你感兴趣的模型镜像

查看源码可以看到redisTemplate.opsForValue()中的方法都定义在ValueOperations<K, V> 中,该接口中一共有17个方法:

public interface ValueOperations<K, V> {
	void set(K key, V value);
	void set(K key, V value, long timeout, TimeUnit unit);
	Boolean setIfAbsent(K key, V value);
	void multiSet(Map<? extends K, ? extends V> map);
	Boolean multiSetIfAbsent(Map<? extends K, ? extends V> map);
	V get(Object key);
	V getAndSet(K key, V value);
	List<V> multiGet(Collection<K> keys);
	Long increment(K key, long delta);
	Double increment(K key, double delta);
	Integer append(K key, String value);
	String get(K key, long start, long end);
	void set(K key, V value, long offset);
	Long size(K key);
	Boolean setBit(K key, long offset, boolean value);
	Boolean getBit(K key, long offset);
	RedisOperations<K, V> getOperations();
}

下面我们一个一个来讲解

void set(K key, V value)

方法含义:新增一个字符串类型的值,key是键,value是值

使用方法:

redisTemplate.opsForValue().set("stringkey", "stringvalue");

void set(K key, V value, long timeout, TimeUnit unit)

方法含义:新增一个字符串类型的值,并且设置变量值的过期时间。key是键,value是值,timeout 过期时间,unit 过期时间单位。

unit 过期时间单位取值如下:

DAYS:天时间单元代表24小时
HOURS:小时时间单元代表60分钟
MICROSECONDS:微秒时间单元代表千分之一毫秒
MILLISECONDS:毫秒时间单元代表千分之一秒
MINUTES:分钟时间单元代表60秒
NANOSECONDS:纳秒时间单元代表千分之一微秒

SECONDS:时间单元代表1秒

使用方法,把timeoutkey对应的值设置过期时间为10秒

redisTemplate.opsForValue().set("timeoutkey", "timeoutvalue", 10, TimeUnit.SECONDS);

 Boolean setIfAbsent(K key, V value)

方法含义:如果键不存在则新增,存在则不改变已经有的值。

使用方法:

redisTemplate.opsForValue().setIfAbsent("newkey", "newvalue");

V get(Object key)

方法含义:获取key键对应的值

使用方法:

redisTemplate.opsForValue().get("stringkey");

  String get(K key, long start, long end)

 方法含义:截取key键对应值的字符串,从开始下标位置开始到结束下标的位置(包含结束下标)的字符串。下标从1开始,如果stringkey对应的值为value,那么下面这个方法返回为:al

使用方法:

redisTemplate.opsForValue().get("stringkey", 2, 3);

 V getAndSet(K key, V value)

方法含义:获取原来key键对应的值并重新赋新值

使用方法:

redisTemplate.opsForValue().getAndSet("stringkey", "newvalue");

 void set(K key, V value, long offset)

方法含义:覆盖从指定位置开始的值

使用方法:

redisTemplate.opsForValue().set("stringkey", "a", 1); 

如下三个方法放在一起讲:

void multiSet(Map<? extends K, ? extends V> map)

Boolean multiSetIfAbsent(Map<? extends K, ? extends V> map)

List<V> multiGet(Collection<K> keys)

方法含义: multiSet:设置map集合到redis;multiSetIfAbsent:如果对应的map集合名称不存在,则添加,如果存在则不做修改;multiGet:根据集合取出对应的value值。

先使用multiSet设置相应的值,如下:

        Map map = new HashMap();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        redisTemplate.opsForValue().multiSet(map);

在使用multiGet获得相应的值

        List list = new ArrayList();
        list.add("key1");
        list.add("key2");
        list.add("key3");
        List<String> valueList = redisTemplate.opsForValue().multiGet(list);
        for (String value2 : valueList) {
            System.out.println("通过multiGet(Collection<K> keys)方法获取map值:" + value2);
        }

打印结果如下:

 使用multiSetIfAbsent 设置相应的值,map集合中的key与之前一样,valeu设置的不一样

        Map map1 = new HashMap();
        map1.put("key1", "value11");
        map1.put("key2", "value22");
        map1.put("key3", "value33");
        List list1 = new ArrayList();
        list1.add("key1");
        list1.add("key2");
        list1.add("key3");
        redisTemplate.opsForValue().multiSetIfAbsent(map1);
        List<String> valueList1 = redisTemplate.opsForValue().multiGet(list1);
        for (String value1 : valueList1) {
            System.out.println("通过multiGet(Collection<K> keys)方法获取map值:" + value1);
        }

打印结果如下,我们可以看到没有做任何修改

使用multiSetIfAbsent 设置相应的值,map集合中的key,valeu设置的都不一样

        Map map1 = new HashMap();
        map1.put("key11", "value11");
        map1.put("key21", "value22");
        map1.put("key31", "value33");
        List list1 = new ArrayList();
        list1.add("key11");
        list1.add("key21");
        list1.add("key31");
        redisTemplate.opsForValue().multiSetIfAbsent(map1);
        List<String> valueList1 = redisTemplate.opsForValue().multiGet(list1);
        for (String value1 : valueList1) {
            System.out.println("通过multiGet(Collection<K> keys)方法获取map值:" + value1);
        }

 打印结果如下,我们可以看到新增了3个key:

 备注说明:multiSetIfAbsent 只要map中有一个key存在,则都不做修改。

  Long increment(K key, long delta)
  Double increment(K key, double delta) 

方法含义:以增量的方式将值存储在变量中,第二个参数为递增因子

使用方法:

       redisTemplate.opsForValue().set("doublevalue", 1);
        redisTemplate.opsForValue().increment("doublevalue", 1.2);//以1.2递增,递增后为2.2
        redisTemplate.opsForValue().increment("doublevalue", 1);//以1递增,递增后为3.2

Integer append(K key, String value)

方法含义:在原有的值基础上新增字符串到末尾

使用方法:

redisTemplate.opsForValue().set("stringkey", "value");
redisTemplate.opsForValue().append("stringkey", "appendValue");

 备注说明:如果append方法不起效果需要进行配置将 template.setValueSerializer(jackson2JsonRedisSerializer);修改为:template.setValueSerializer(new StringRedisSerializer());这个是因为序列化的原因,RedisTemplateput进去的值是序列化成二进制后的,但是append的值是直接加的。所以get的时候反序列化直接变成空值了。如果你存的值是字符串类型,建议直接使用StringRedisTemplate,这个不会序列化成二进制,append是可以用的。而且直接在redis客户端存的值也能取到

   Long size(K key)

方法含义: 获取指定字符串的长度

使用方法:

Long size = redisTemplate.opsForValue().size("stringkey");

 Boolean setBit(K key, long offset, boolean value)
 Boolean getBit(K key, long offset)

方法含义:setBit: key键对应的值value对应的ascii码,在offset的位置(从左向右数)变为value;getBit:判断指定的位置ASCII码的bit位是否为true或者false

使用方法:

        redisTemplate.opsForValue().set("stringkey", "value");
        redisTemplate.opsForValue().setBit("stringkey", 1, true);
        boolean flag= redisTemplate.opsForValue().getBit("stringkey", 1);

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

`redisTemplate.opsForValue()` 是 Spring Data Redis 提供的一个操作接口,用于对 Redis 中的字符串(String)类型数据进行操作。它封装了 Redis 的字符串相关命令,允许开发者以更简洁的方式与 Redis 进行交互。 ### 主要作用 - **设置键值对** 可以使用 `set(K key, V value)` 方法将一个键值对存储到 Redis 中。例如: ```java redisTemplate.opsForValue().set("stringkey", "value"); ``` 此方法会覆盖已存在的键对应的值。 - **条件写入** 使用 `setIfAbsent(K key, V value)` 方法可以在键不存在时才设置值,常用于实现分布式锁等场景。 ```java Boolean result = redisTemplate.opsForValue().setIfAbsent("mykey", "myvalue"); ``` - **获取值** 通过 `get(Object key)` 方法可以从 Redis 中获取指定键的值。 ```java Object value = redisTemplate.opsForValue().get("mykey"); ``` - **原子性增减操作** 支持对数值类型的键进行原子性的增加或减少操作,适用于计数器等场景。 ```java Long incrementedValue = redisTemplate.opsForValue().increment("mykey", 5); Long decrementedValue = redisTemplate.opsForValue().decrement("mykey", 3); ``` - **位操作** `setBit(K key, long offset, boolean value)` 和 `getBit(K key, long offset)` 方法可以对字符串中的特定位进行操作,适用于某些特定业务逻辑,如用户签到记录等。 ```java redisTemplate.opsForValue().setBit("stringkey", 1, true); boolean flag = redisTemplate.opsForValue().getBit("stringkey", 1); ``` - **追加内容** 使用 `append(K key, String value)` 方法可以在原有字符串值的基础上追加新的内容。 ```java Integer newLength = redisTemplate.opsForValue().append("mykey", "newvalue"); ``` - **获取并设置新值** `getAndSet(K key, V value)` 方法可以设置新值并返回旧值,适用于需要替换值并记录旧值的场景。 ```java Object oldValue = redisTemplate.opsForValue().getAndSet("mykey", "newvalue"); ``` - **批量获取** 通过 `multiGet(Collection<K> keys)` 方法可以一次性获取多个键的值,提高效率。 ```java List<Object> values = redisTemplate.opsForValue().multiGet(Arrays.asList("key1", "key2", "key3")); ``` - **绑定操作** 如果需要多次操作同一个键,可以使用 `boundValueOps(String key)` 方法绑定该键,后续操作无需重复传入键名。 ```java redisTemplate.boundValueOps("key3").set("value"); ``` 这些方法使得在 Java 应用中与 Redis 进行交互变得简单且高效,同时保证了线程安全和原子性操作[^2]。 ```java // 示例:设置键值对并设置过期时间 redisTemplate.opsForValue().set("session:token", "value"); redisTemplate.expire("session:token", Duration.ofMinutes(30)); ``` 上述代码片段演示了如何结合 `opsForValue()` 和 `expire()` 方法为某个键设置过期时间[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值