RedisTemplate set方法疑问

jedis客户端中提供了设置值、设置失效时间、not exists的原子性方法
图片说明
可是RedisTemplate设置值setIfAbsent与设置失效时间是两个方法,能不能用RedisTemplate的方法实现jedis的set功能呢?求助

0

5个回答

请参考:
使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null

1
zwq_david9527
zwq_david9527 大佬,你有发现execute这个方法在集群模式redis下不可用吗
一年多之前 回复
u011489205
ai2018 回复zwq_david9527: 请参考我的github项目:https://github.com/xiaohu-liu/springboot-app
一年多之前 回复
u011489205
ai2018 回复zwq_david9527: 刚才我看了看源代码,其实redisTemplate中的execute方法是个突破点,具体看下面我的评论吧
一年多之前 回复
zwq_david9527
zwq_david9527 回复xiaohu-liu: jedis用的2.9.0 ,redisTemplate用的spring-boot-data-redis 1.5.8.RELEASE
一年多之前 回复
u011489205
ai2018 回复zwq_david9527: 麻烦提供一下你用的jedis的版本号,以及RedisTemplate对应的jar包的版本号
一年多之前 回复
zwq_david9527
zwq_david9527 回复xiaohu-liu: set("key", "value", "NX", "EX", 10L);这个方法是可以满足的
一年多之前 回复
zwq_david9527
zwq_david9527 回复xiaohu-liu: 如果key存在,就不让set
一年多之前 回复
u011489205
ai2018 回复zwq_david9527: 你对key存在和不存在这两种情况有不同的处理吗?
一年多之前 回复
zwq_david9527
zwq_david9527 redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);这个没有办法达到not exists啊
一年多之前 回复

RedisTemplate中有一个execute方法,如下图:

 @Override
    public Object execute(String command, byte[]... args) {
        Assert.hasText(command, "a valid command needs to be specified");
        try {
            List<byte[]> mArgs = new ArrayList<>();
            if (!ObjectUtils.isEmpty(args)) {
                Collections.addAll(mArgs, args);
            }

            ReflectionUtils.invokeMethod(SEND_COMMAND, client, Command.valueOf(command.trim().toUpperCase()),
                    mArgs.toArray(new byte[mArgs.size()][]));
            if (isQueueing() || isPipelined()) {
                Object target = (isPipelined() ? pipeline : transaction);
                @SuppressWarnings("unchecked")
                Response<Object> result = (Response<Object>) ReflectionUtils.invokeMethod(GET_RESPONSE, target,
                        new Builder<Object>() {
                            public Object build(Object data) {
                                return data;
                            }

                            public String toString() {
                                return "Object";
                            }
                        });
                if (isPipelined()) {
                    pipeline(newJedisResult(result));
                } else {
                    transaction(newJedisResult(result));
                }
                return null;
            }
            return client.getOne();
        } catch (Exception ex) {
            throw convertJedisAccessException(ex);
        }
    }

底层利用了反射原理去间接调用redis.clients.jedis.Client的set方法,在去调用redis.clients.jedis.BinaryClient 的sendCommand方法,所以如果自己要调用底层jedis的

set(final String key, final String value, final String nxxx, final String expx,
      final long time) 

我们需要对代码进行如下修改,这个是思路,我还没有测试:
代码的大概逻辑是这样

  RedisTemplate<String, String> template = new StringRedisTemplate(new JedisConnectionFactory());
        template.execute(new RedisCallback<Object>() {

            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.execute("set", new byte[][]{
                        SafeEncoder.encode("key"), SafeEncoder.encode("value"), SafeEncoder.encode("nxxx"),
                        SafeEncoder.encode("expx"), Protocol.toByteArray(10)});
            }
        });
1
zwq_david9527
zwq_david9527 挺好的一个思路,我实现试试
一年多之前 回复

请参考我的github项目:
https://github.com/xiaohu-liu/springboot-app/edit/master/redis-test/src/test/java/com/indi/spring/redis/RedisTest.java

 package com.indi.spring.redis;


import com.indi.spring.redis.mapper.impl.RedisServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = App.class)
@WebAppConfiguration
public class RedisTest {

    @Autowired
    private RedisServiceImpl redisService;


    @Test
    public void test1() {
        redisService.set("name", "xiaohu-liu");
        redisService.set("nickname2", "xiaohu-liu", "NX", "EX", 10);
    }


}

0

stringRedisTemplate.opsForValue().set(key, value);
stringRedisTemplate.expire(key,expires,tu);

expires是时间数值 tu是单位(TimeUnit),时分秒等,这个是设个存留时间,比如,缓存两小时
还可以设置到期时间,比如,设置今天晚上十点失效
public Boolean expire(K key, final long timeout, final TimeUnit unit) {
final byte[] rawKey = rawKey(key);
final long rawTimeout = TimeoutUtils.toMillis(timeout, unit);

    return execute(new RedisCallback<Boolean>() {

        public Boolean doInRedis(RedisConnection connection) {
            try {
                return connection.pExpire(rawKey, rawTimeout);
            } catch (Exception e) {
                // Driver may not support pExpire or we may be running on Redis 2.4
                return connection.expire(rawKey, TimeoutUtils.toSeconds(timeout, unit));
            }
        }
    }, true);
}

public Boolean expireAt(K key, final Date date) {
    final byte[] rawKey = rawKey(key);

    return execute(new RedisCallback<Boolean>() {

        public Boolean doInRedis(RedisConnection connection) {
            try {
                return connection.pExpireAt(rawKey, date.getTime());
            } catch (Exception e) {
                return connection.expireAt(rawKey, date.getTime() / 1000);
            }
        }
    }, true);
}
0
 Boolean success = redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            RedisSerializer defaultSerializer = redisTemplate.getDefaultSerializer();
            Object result = connection.set(defaultSerializer.serialize("name"),
                    defaultSerializer.serialize("my name"),
                    Expiration.from(1000, TimeUnit.SECONDS),
                    RedisStringCommands.SetOption.ifAbsent());

            return (Boolean) result;
        });
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
通过自定义RedisTemplate修改Redis的序列化方式
Redis的默认配置在org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration中,Spring启动时会自动加载默认配置。对于RedisTemplate,如果系统中没有指定的Bean,则会加载默认的RedisTemplate,如下: @Bean @ConditionalOnMissingBean( ...
RedisTemplate的各种操作(set、hash、list、string)
注入以下RedisTemplate @Autowired private RedisTemplate&amp;lt;String,String&amp;gt; redisTemplate; 1、保存和读取Set: 代码示例: SetOperations&amp;lt;String, String&amp;gt; set = redisTemplate.opsForSet(); set.add(&quot;set1&quot;,&quot;22...
Redis中使用RedisTemplate.set设置值后到客户端取不到值
一、问题出现原因      1、出现问题代码:       package com.hubena.redis.redistemplate; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.s...
Redis常用命令对应的Spring中RedisTemplate操作方法
1、Spring配置文件: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http:/...
spring redisTemplate 持久化到redis中数据更改为String类型
spring redisTemplate 持久化到redis中数据更改为String类型
使用stringRedisTemplate操作redis hash结构数据只能存储String类型的问题
最近在学习redis,但是在使用stringRedisTemplate模板的时候发现只能存储string的类型。 private StringRedisTemplate stringRedisTemplate; @Autowired(required = false) public void setStringRedisTemplate(StringRedisTemplat
spring中自动注入时 set 方法中的空指针异常
这种在注入map类型的testMap时,如果使用 setTestMap(String value){ this.testMap.put(value,value) }          会报空指针异常。 修改为   setTestMap(String value){ Map&amp;lt;String,String&amp;gt; tomap = new HashMap...
疑问
目录判断周几提取时间序列正则疑惑 判断周几 需要判断某一天是周几 # -*- coding: utf-8 -*- from datetime import datetime # today = datetime.now().weekday() # print(today) week = datetime.strptime('20170801', '%Y%m%d').weekday() #w...
what、which的疑问代词_18
今天我们要讲一讲疑问词,它们会让你知道如何用英语来提问。 我们来看看所有的疑问词: What           Where Which         Why How            When Who            疑问词非常重要、非常有用而且使用非常简单。它们用来组成那些表明想获得何种信息的问句。 这次,我们将重点放在&quot;what&quot;和&quot;which&quot;上面。 当存在...
spring-data-redis 使用pipeline批量设置过期时间的bug
redis没有批量设置过期时间的命令,所以当我们需要为多个key设置过期时间时,只能循环调用expire或pExpire命令为每个key设置过期时间,为了提高性能,我打算使用pipeline来批量操作,我使用的是spring-data-redis的stringRedisTemplate,版本为1.6.4-release,代码如下:final String[] keys = {"key1", "key
疑问代词和关系代词
第二章、疑问代词和关系代词   1. 疑问代词的用法 (1) who [1] who的意思是“谁”,是主格,通常作主语。如:Who is that woman? 那个妇女是谁?Who are those people? 那些人是谁? [2] who在口语中可代替whom作宾语。如:Who did you ask about it? 关于那件事你问过谁了? (2) whom whom ...
redistemplate
redis client, 用下看看吧.
R_M界面不稳定性LevelSet方法
R_M界面不稳定性LevelSet方法R_M界面不稳定性LevelSet方法
10、Spring技术栈-整合Redis,使用RedisTemplate实现数据缓存实战
整合Redis,使用RedisTemplate实现数据缓存
RedisTemplate常用方法总结
很多公司都将redisTemplate进行了封装,封装成业务所需要的RedisUtil工具类方便进行调用,本篇文章总结了redisTemplate常用的一些工具类。 Redis最为常用的数据类型: String Hash List Set zSet Sorted set String ...
机器学习疑问整理
回答一: 感觉logistic模型的优点有如下: 1. logistic是线性模型,在相同的条件下线性模型的稳定要优于非线性模型; 2. logistic模型的效果评价除了验证数据集外,还有统计学的验证,感觉更严谨; 3. logistic是基于统计学原理的,更容易让统计和数学背景的人接受; 4. 模型参数的解释更科学,比如某变量的影响直接用发生比就能解释; 5.
RedisTemplate添加List类型数据
在实际情况中,需要获取用户全部信息,是要从数据库中查询,现在使用缓存则是从缓存中获取数据。第一次查询数据时,显然是从数据库中进行获取的,缓存中是不存在该数据的,因此需要将数据库中查询出来的数据放在缓存中。所以,一调用查询方法,就需要判断缓存中是否有该缓存。 该项目是 spring boot 整合 redis,使用的的 RedisTemplate,首先要判断缓存中是否存在key,其次存储 list...
RedisTemplate访问Redis数据结构(四)——Set
引用:Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。此处我们使用redisTemplate,配置如下(详情请见链接:RedisTemplate访问Redis数据结构(前言))&amp;amp;lt;bean id=&amp;amp;quot;redisTemplate&amp;amp;quot; class=&amp;amp;quot;org.springfra
【C++】经典问题解析三之关于赋值的疑问
文章目录来源问题原因解决总结: 来源 https://blog.csdn.net/qq_37375427/article/details/79124030 问题 第一个疑问是: 什么时候需要重载赋值操作符 编译器是否提供默认的赋值操作? 解答: 编译器为每个类默认重载了赋值操作符 默认的赋值操作符仅完成了浅拷贝 当需要进行深拷贝时,就需要进行赋值操作符的重载 赋值操作符与拷贝构造函数有相同的...
RedisTemplate的简单使用
1. 定义一个对象 public class User implements Serializable { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id)
RedisTemplate-Redis缓存工具类(自己封装的简单工具类)
前言    这个是基于redis的一个简单的缓存工具类 自己封装的,写的不合理的地方希望大家指出,使用起来也比较简介方便,移植性也比较好,如果换了redis,替换也方便数据准备:      1. redis框架       2.fastjosn框架1.Cacheable接口/** * 缓存参数接口 * @param &amp;lt;T&amp;gt; */ public interface Cacheabl...
基于RedisTemplate的redis工具类
RedisTempla是一个spring-redis模块下的操作redis的工具类,有点类似于jdbcTemplate。 但是操作起来略显麻烦,于是封装一个稍微简单点的redis工具类,直接上代码: import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.co
基于redisTemplate的redis的分布式锁正确打开方式
@Component public class RedisDistributedLock { @Resource private RedisTemplate&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;String, Object&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; redisTemplate; public synchronized boolean lock(String key, Str
RedisTemplate实现分布式锁
@Component public class RedisDistributedLockUtils { private static final String NX = "NX"; private static final String EX = "EX"; private static final String LOCK_OK = "OK"; private sta...
Springboot与RedisTemplate集成以及编写的工具类
第一步.导入依赖 &amp;amp;amp;lt;dependency&amp;amp;amp;gt; &amp;amp;amp;lt;groupId&amp;amp;amp;gt;org.springframework.boot&amp;amp;amp;lt;/groupId&amp;amp;amp;gt; &amp;amp;amp;lt;artifactId&amp;amp;amp;gt;spring-boot-starter-data-redis&amp;amp;amp;lt;/artifactI
【小家Spring】Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入失败的问题
前言 Spring为了简化我们对持久化层的操作,针对各种持久化方案提供了统一的Template进行操作。比如我们的熟悉的JdbcTemplate就是让我们方便的操作的关系型数据库的。 它有个Spring-Data的子项目,提供了各种SQL、NOSql的便捷操作。比如Redis、MongoDB、ES等等。然后本文主要针对于在SpringBoot中使用RedisTemplate来优雅的操作Redis数...
jedis工具类
package com.iscas.r1.utils; import com.google.gson.Gson; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.Serializab...
Spring 篇:RedisTemplate 配置与使用
Maven 依赖 &amp;lt;!-- Redis 官方提供的 Java 驱动 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.9.0
redisTemplate模糊匹配删除
  Set&amp;lt;String&amp;gt; keys = redisTemplate.keys(&quot;noteUserListenedPoi:&quot; + &quot;*&quot;); redisTemplate.delete(keys); 或者 stringRedisTemplate.delete(stringRedisTemplate.keys(&quot;noteUserListenedPoi:&quot; + &quot;*&quot;));  ...
RedisTemplate访问Redis数据结构(二)——List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边),此处我们使用redisTemplate,配置如下(详情请见链接:RedisTemplate访问Redis数据结构(前言))&amp;amp;lt;bean id=&amp;amp;quot;redisTemplate&amp;amp;quot; class=&amp;amp;quot;org.springframework.data.redis.core.RedisTemplate&amp;amp;q
RedisTemplate序列化已实现存取对象
存取对象实现类(RedisTemplate操作封装)请去这里拿(https://mp.csdn.net/postedit/86991991)已经实现存取对象 所需jar包 &amp;lt;!-- 工具库 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt; &amp;lt;arti...
RedisTemplate的使用说明(常用接口方法)
在RedisTemplate中提供了几个常用的接口方法的使用,分别是:private ValueOperations<K, V> valueOps; private ListOperations<K, V> listOps; private SetOperations<K, V> setOps; private ZSetOperations<K, V> zSetOps;
redisTemplate 实现订阅与发布
package testMaven2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageL...
Redis学习《2.RedisTemplate五种数据类型基本API操作》
Java中使用redis很少会去使用原始的jedis的API,除非是自己重构框架之类,所以使用spring有的RedisTemplate。 一、maven引入依赖好,我是springboot项目,如下pom.xml文件: &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;g...
【redis】使用redisTemplate优雅地操作redis及使用redis实现分布式锁
前言: 上篇已经介绍了redis及如何安装和集群redis,这篇介绍如何通过工具优雅地操作redis. Long Long ago,程序猿们还在通过jedis来操作着redis,那时候的猿类,一个个累的没日没夜,重复的造着轮子,忙得没时间陪家人,终于有一天猿类的春天来了,spring家族的redis template 解放了程序猿的双手,于是猿类从使用Jedis石器时代的进入自动化时代... ...
spring整合redis
spring 整合redis 封装redistemplate工具类
Redis之RedisTemplate常用接口详解
以下主要讲3个使用的接口。 1、RedisOperations 这个接口的实现类就是RedisTemplate,提供了一些对Redis命令的一些操作。 2、ValueOperations 这个接口的实现类为:DefaultValueOperations. 在RedisTemplate中,已经提供了一个工厂方法:opsForValue()。这个方法会返回一个默认的操作类。另外,我们可以直接通过注解@Resource(name = “redisTemplate”)来进行注入。 //声明 @Resource(
Redis-RedisTemplate 缓存操作具体实现代码
package cn.com.doone.tx.cloud.activity.service.redis; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ann
ssm框架中使用原生RedisTemplate
①首先在maven中添加jar包 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4.1&amp;lt;/version&amp;gt; &amp;lt;/depe
Jedis操作单节点redis,集群及redisTemplate操作redis集群(二)
1,码云上面地址:https://gitee.com/dream21th/dream21th-redis2,application.properties配置文件信息如下#redisCluterredis.cluster.nodes=192.168.1.102:7000,192.168.1.102:7001,192.168.1.102:7002,192.168.1.102:7003,192.168....