RedisTemplate set方法疑问

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

5个回答

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

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

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)});
            }
        });
zwq_david9527
zwq_david9527 挺好的一个思路,我实现试试
接近 2 年之前 回复

请参考我的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);
    }


}

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);
}
 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;
        });
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
redistemplate
redis client, 用下看看吧.
Set方法
新增加的数据类型 类似于数组 但是和数组不同的地方就是 里面不会存在相同的值,在里面 NaN都只能出现一个,但是里面有一个问题,就是引用类型的值是不会相等的 let set = new Set(); set.add({}); set.size // 1 set.add({}); set....
RedisTemplate的简单使用
1. 定义一个对象 public class User implements Serializable { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id)
RedisTemplate 用法
详细介绍RedisTemplate5种数据结构,并且有每种不同数据结构的用法的例子
RedisTemplate工具类
基于spring和redis的redisTemplate工具类 针对所有的hash 都是以h开头的方法 针对所有的Set 都是以s开头的方法 针对所有的List 都是以l开头的方法
RedisTemplate操作
SpringBoot是Spring推出的一种微架构的开发框架,在现在的项目开发之中使用非常普遍,并且也是现在所有企业开发的基础要求,在本课程之中将为读者完整的分析传统系统开发的问题缺陷,以及SpringBoot所带来的系统开发的改良优势。
RedisTemplate模板的使用(一)
一、Map =======boundHashOps (1)主方法,向redis当中存储Map值 @Resource private RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate; private static final Long EXPIRED_MINUTE = new Long(1); private static final St...
自定义序列化RedisTemplate
1.实现序列化 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * @Author:h...
redisTemplate api讲解
这是一套2019录制的关于Redis分布式缓存和Springboot深度整合的视频,课堂巧用类比法对比了Redis和Mysql、MongoDB、Memcached等其他<br />rn&nbsp;数据库的区别,从学员角度出发,通过各种方法让学员无缝学习和掌握。课程主要包括部分:NOSQL Redis分布式缓存概念,分布式缓存Redis内存管理<br />rn&nbsp;方案和持久化策略,实操讲解Redis五种数据类型以及Redis消息订阅,Redis事务和Mysql事务异同,以及Mysql事务隔离<br />rn&nbsp;机制的实现原理和MVCC,Springboot与Redis深度整合,Redis api源码剖析,手把手带你编写Springboot Cache ,Redis如何扛住万级访问,Redis实战如何实现高并发高可用排行榜等。同时在学习的过程中有任何不明白的地方,加客服qq351228901都可以进群向我咨询,我会积极帮助大家解决问题。<br />
set方法与内存管理
局部变量,使用完以后不再使用就release; 全局变量,在dealloc里面release。 指针对象要自己操作自己。 retainCount指的是对象引用计数。 self赋值方式: Computer *cmp = [[Computer alloc] init];//cmp对象retainCount = 1 self.computer = cop;//computer 对象r
redisTemplate的有序集合(zset)实例
//场景是这样的,现在需要记录用户最近浏览的职位,按浏览的时间倒序排序,只记录最近浏览的5条//redisTemplate怎么用就不多说了 @Resource(name = "jdkRedisTemplate") private RedisTemplate redisTempalte; @Override public void addRecentBrowsingP
静态redisTemplate的注入
静态redisTemplate的注入
redisTemplate 实现订阅与发布
package testMaven2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageL...
redistemplate 乐观锁实践
public Object testRedisWatch() { try { stringRedisTemplate.execute(new SessionCallback() { @Override public Object execute(RedisOperations...
扩展redisTemplate实现分布式锁
依赖jar包compile group: 'redis.clients', name: 'jedis', version:'2.8.1' compile group: 'org.springframework.data', name: 'spring-data-redis', version:'1.6.5.RELEASE'/** * Redis的分布式锁对象 * Created by zhen...
RedisTemplate模板的使用(二)
在RedisTemplate中提供了几个常用的接口方法的使用,分别是: private ValueOperations&amp;lt;K, V&amp;gt; valueOps; private ListOperations&amp;lt;K, V&amp;gt; listOps; private SetOperations&amp;lt;K, V&amp;gt; setOps; private ZSetOperations&amp;lt;K, V...
Redistemplate切换数据库
java后台Redistemplate切换数据库 @Autowired private RedisTemplate redisTemplate; @GetMapping("/test") @ResponseBody String queryVisitArticleStatistics(Long cgfId){ JedisConnectionFactory connectionFact...
Paint 的set方法
//重置Paint。 reset()//设置一些标志,比如抗锯齿,下划线等等。 setFlags(int flags)//设置抗锯齿,如果不设置,加载位图的时候可能会出现锯齿状的边界,如果设置,边界就会变的稍微有点模糊,锯齿就看不到了。 setAntiAlias(boolean aa)//设置是否抖动,如果不设置感觉就会有一些僵硬的线条,如果设置图像就会看的更柔和一些, setDither(
get ,set方法
[code=Java]rnrnpublic TextArea getTextArea()rn return ta; rn rnrn[/code]rnrn这个程序里面的方法是要一定写为getTextArea么?一定要是get+类型名么?
get和set方法
Python基础入门视频教程:本课程从Python入门到纯Python项目实战。超100以上课时,内容非常详细,覆盖了Python知识的方方面面,学完后不仅对Python知识有个系统化的了解,更能利用Python做出类似于“密码加密存储管理系统”、“2048游戏”这种实际项目。让你从Python小白编程大牛!
set方法和构造函数
public class TestDemo {     public static void main(String[] args)     {           Test t=new Test(-1);         System.out.println(t.getAge());//-1,setAge()内的条件对构造函数初始化无影响,因为new一个对象后紧跟着执行构造函数        ...
copy的set方法
要知道数组和字典的正确修饰符,首先需要理清以下几点: 1.为什么要存在属性,属性是set和get方法的简写。 2.copy的set方法怎么写? 3.mutableCopy和Copy的区别 现在先解释上边的几点: 1.copy的set方法写法: -setName:(NSString*)name { if(_name != name) { [_n
RedisTemplate实现分布式锁
使用Redis的SETNX命令获取分布式锁的步骤: C1和C2线程同时检查时间戳获取锁,执行SETNX命令并都返回0,此时锁仍被C3持有,并且C3已经崩溃 C1 DEL锁 C1 使用SETNX命令获取锁,并且成功 C2 DEL锁 C2 使用SETNX命令获取锁,并且成功 ERROR : 由于竞态条件,C1和C2都获取到了锁 幸运的是,以下面的步骤完全可以避免这种情况发生,看看C4线程如...
基于RedisTemplate的redis工具类
RedisTempla是一个spring-redis模块下的操作redis的工具类,有点类似于jdbcTemplate。 但是操作起来略显麻烦,于是封装一个稍微简单点的redis工具类,直接上代码: import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.co
redistemplate事务返回问题
redistemplate在执行exec() 方法后,如果事务中都是对redis的set,那么不论事务是否执行成功,都返回空。n目前的解决办法是,事务中set后,添加get。如果返回list为空。说明事务执行失败。循环再执行。nn请问大神们,你们是如何解决的?
RedisTemplate 自动注册之旅
RedisTemplate 是 Spring Boot 访问 Redis 的核心组件,底层通过 RedisConnectionFactory 对多种驱动进行集成,上层通过 XXOperations 提
对象的set方法
今天看到一段代码,关于去除空格的,给大家分享下: 代码中x1输入三个空格即x1=“   ”; 打印出来结果如下:大家赶紧有点奇怪吧、、、 扒拉代码发现,NodeInfo实体类中在定义set方法用了个三元运算,直接去空格了。学到了吧、、、、 对上面的三元运算做个简单的解释: this.nodeNa  定义一个变量 nodeNm==null成立时,nodeNm==null,否则...
set方法注入
<p>n  <span style="color:#333333;font-size:14px;background-color:#FFFFFF;">Spring是一个开源框架,它由</span><a href="https://baike.baidu.com/item/Rod%20Johnson">Rod Johnson</a><span style="color:#333333;font-size:14px;background-color:#FFFFFF;">创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。 <span style="color:#333333;font-size:14px;background-color:#FFFFFF;">Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。本视频详细讲解了springAOP的多种实现方式,IOC在项目中的实际应用。</span></span>n</p>
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常用方法总结
很多公司都将redisTemplate进行了封装,封装成业务所需要的RedisUtil工具类方便进行调用,本篇文章总结了redisTemplate常用的一些工具类。 Redis最为常用的数据类型: String Hash List Set zSet Sorted set String ...
RedisTemplate常用函数解析和使用
RedisTemplate常用函数解析和使用 1.String 操作函数 void set(K var1, V var2); void set(K var1, V var2, long var3, TimeUnit var5); // 是否存在值或者key @Nullable Boolean setIfAbsent(K var1, V var2);...
RedisTemplate设置过期时间问题
redisTemplate.opsForHash().put(vid, photoType)上传图片rn属性分别为 key,照片类型,路径rn第一个为 A 自拍照 xxxrn第二个为 A 全身照rn但是根据 redisTemplate.expire(vid, time, TimeUnit.SECONDS);rn他是按照vid进行设置过期时间rn这样会出现一个问题即使 假如我第一个图片过期时间为5分钟rn过了4分钟后rn我又重新添加了一个图片,设置了过期时间5分钟rn这样不就是一直救活了快要过期的自拍照;rn有什么解决的办法吗?rn
RedisTemplate在项目中的应用
如下主要通去年无聊做的 "涂涂影院后台管理系统" 一个 demo,看 RedisTemplate 的使用。 体验地址:http://video.71xun.com:8080 账户:niceyoo 密码:123456 主要用到地方:视频首页轮播图的获取,以及搜索检索界面,如下图所示: 由于是非maven非springboot项目,故配置有所繁琐,但正所谓有繁才有简,在下面会带...
个人笔记之redisTemplate常用操作
redisTemplate常用操作 不足之处欢迎留言 1、1+5个接口 总接口:RedisOperations&amp;amp;amp;amp;amp;amp;amp;lt;K, V&amp;amp;amp;amp;amp;amp;amp;gt; 源码中redisTemplate实现自总接口,内部以下5个接口分别对应操作5中数据类型 接口1:ValueOperations&amp;amp;amp;amp;amp;amp;amp;lt;K, V&amp;amp;amp;amp;amp;amp;amp;gt;-
get方法和set方法
要操作私有类型的变量,有两种方法。 1)用public构造方法,对其赋值, 2)用get,set方法。 例如: private String name; public void getName(){ this.name=name; } public String setName(){ return name; } ...
set方法总结
a = t | s:幷集 a = t & s:交集 a = t - s:差集,在t中不在s中 a = t ^ s:對稱差集,在t中或者s中,但是不同時在二者中   第一組:對set本身的操作,無返回值 1.  t.add()   加一項 2.  t.update(s)   會將s拆成多項 3. t.intersection_update(
RectF的inset方法
1分都不行了,其实这个我想0积分分享出去的,也不是什么很牛的代码
RedisTemplate的封装使用
1.RedisService的工具类import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Service; import java.io.Serializab...
redis工具类(redisTemplate实现)
package cn.common.utils; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; imp...
redisTemplate 报空指针异常
redisTemplate  报空指针异常 原因分析 1.是否引入正常jar包 2.调用redis工具类的时候是否@Resource自动注入 pom.xml                     org.springframework.boot             spring-boot-starter-data-redis         applicatio
相关热词 c# login 居中 c# 考试软件 c# 自然语言分析 c# 分段读取文件 c# 泛型反射 c#打断点 c# 时间转多少秒 c# 线程函数加参数 c# modbus 读取 c#查询集合表