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 client, 用下看看吧.
set方法
使用unset方法消除数组中的元素   验证代码: echo "unset数组变量"; $arr=array("name"=>"HOUSE","value"=>6.3); unset($arr["value"]); var_dump($arr);   验证结果: array (size=1) 'name' => string 'HOUSE' (length=5)   总结:
Set方法
新增加的数据类型 类似于数组 但是和数组不同的地方就是 里面不会存在相同的值,在里面 NaN都只能出现一个,但是里面有一个问题,就是引用类型的值是不会相等的 let set = new Set(); set.add({}); set.size // 1 set.add({}); set....
RedisTemplate 用法
详细介绍RedisTemplate5种数据结构,并且有每种不同数据结构的用法的例子
RedisTemplate的简单使用
1. 定义一个对象 public class User implements Serializable { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id)
RedisTemplate操作
SpringBoot是Spring推出的一种微架构的开发框架,在现在的项目开发之中使用非常普遍,并且也是现在所有企业开发的基础要求,在本课程之中将为读者完整的分析传统系统开发的问题缺陷,以及SpringBoot所带来的系统开发的改良优势。
RedisTemplate工具类
基于spring和redis的redisTemplate工具类 针对所有的hash 都是以h开头的方法 针对所有的Set 都是以s开头的方法 针对所有的List 都是以l开头的方法
get和set方法
java中 当定义了一个私有的成员变量的时候,如果需要访问或者获取这个变量的时候,就可以编写set或者get方法去调用。 set()是给属性赋值的,get()是取得属性值的  被设置和存取的属性一般是私有  主要是起到封装的作用,不允许直接对属性操作  set()和get()不一定同时存在,看程序需求 释一:属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句
Set方法举例
<br />import java.util.*; public class Test{ public static void main(String[] args){ Set s1 = new HashSet(); Set s2 = new HashSet(); s1.add("a"); s1.add("b"); s1.add("c"); s2.add("a"); s2.add("b"); s2.add("d"); Set sn = new Ha
封装set方法
封装set方法 @interface Student : NSObject { // 成员变量尽量不要用@public // @public int age; //@public // 只读(readonly):只允许外界访问我的no,不允许外界修改我的no int no; // 只需要提供get方法 } // /* set方法 1.作用:
get方法和set方法
定义一个类,该类有一个私有成员变量,通过构造方法将其进行赋初值,并提供该成员的getXXX()和setXXX()方法 提示:假设有privateStringname;则有 publicvoidsetName(Stringname){this.name=name;} publicStringgetName(){returnthis.name;} p...
RedisTemplate实现分布式锁
使用Redis的SETNX命令获取分布式锁的步骤: C1和C2线程同时检查时间戳获取锁,执行SETNX命令并都返回0,此时锁仍被C3持有,并且C3已经崩溃 C1 DEL锁 C1 使用SETNX命令获取锁,并且成功 C2 DEL锁 C2 使用SETNX命令获取锁,并且成功 ERROR : 由于竞态条件,C1和C2都获取到了锁 幸运的是,以下面的步骤完全可以避免这种情况发生,看看C4线程如...
RedisTemplate访问Redis数据结构
附上SDR api地址:https://docs.spring.io/spring-data/data-redis/docs/1.2.1.RELEASE/api/org/springframework/data/redis/core/RedisTemplate.html Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set...
基于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 提
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的注入
静态redisTemplate的注入
redisTemplate的有序集合(zset)实例
//场景是这样的,现在需要记录用户最近浏览的职位,按浏览的时间倒序排序,只记录最近浏览的5条//redisTemplate怎么用就不多说了 @Resource(name = "jdkRedisTemplate") private RedisTemplate redisTempalte; @Override public void addRecentBrowsingP
扩展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...
redistemplate实现事务问题
https://www.cnblogs.com/zxf330301/p/6889202.html   SessionCallback&amp;lt;Object&amp;gt;   sessionCallback=new SessionCallback&amp;lt;Object&amp;gt;(){     @Override      public Object execute(RedisOperations ope...
RedisTemplate缓存用法小记
https://blog.csdn.net/wxx151556/article/details/78493147 1、下载一个客户端:Redis Desktop Manager 2、redis的引用包: &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt; &amp;lt;artifac...
笔记redisTemplate基本用法
//将数据插入末尾 redisTemplate.opsForList().rightPushAll(key, value); //根据下标和key获取redis 数据 redisTemplate.opsForList().range(key, 0, -1); //判断redis 中是否存在当前key redisTemplate.hasKey(key) //出现一个问题当前方法偶尔会报空指针异常,百...
redis实现分布式锁(redisTemplate)
转自https://blog.csdn.net/zl_momomo/article/details/83655811 https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/
set方法与内存管理
局部变量,使用完以后不再使用就release; 全局变量,在dealloc里面release。 指针对象要自己操作自己。 retainCount指的是对象引用计数。 self赋值方式: Computer *cmp = [[Computer alloc] init];//cmp对象retainCount = 1 self.computer = cop;//computer 对象r
memset方法
void *memset(void *s, int ch, size_t n); 将s中的前n个字节用ch替换。   一。 memset的方法初始化数组,是设置每个字节的值. 所以如果对int型数组进行初始化,会出错. 但是如果初始化为0,是可以的。 int intArr[100]; memset(intArr,1,sizeof(intArr));
copy的set方法
要知道数组和字典的正确修饰符,首先需要理清以下几点: 1.为什么要存在属性,属性是set和get方法的简写。 2.copy的set方法怎么写? 3.mutableCopy和Copy的区别 现在先解释上边的几点: 1.copy的set方法写法: -setName:(NSString*)name { if(_name != name) { [_n
set方法的内存管理
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------  set方法的代码规范 /*  1> 基本数据类型:直接赋值    - (void)setAge:(int)age  {     _age = age;  }    2> OC对象类型    - (voi
Paint 的set方法
//重置Paint。 reset()//设置一些标志,比如抗锯齿,下划线等等。 setFlags(int flags)//设置抗锯齿,如果不设置,加载位图的时候可能会出现锯齿状的边界,如果设置,边界就会变的稍微有点模糊,锯齿就看不到了。 setAntiAlias(boolean aa)//设置是否抖动,如果不设置感觉就会有一些僵硬的线条,如果设置图像就会看的更柔和一些, setDither(
set方法和构造函数
public class TestDemo {     public static void main(String[] args)     {           Test t=new Test(-1);         System.out.println(t.getAge());//-1,setAge()内的条件对构造函数初始化无影响,因为new一个对象后紧跟着执行构造函数        ...
get ,set方法
[code=Java]rnrnpublic TextArea getTextArea()rn return ta; rn rnrn[/code]rnrn这个程序里面的方法是要一定写为getTextArea么?一定要是get+类型名么?
对象的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模板的使用(一)
一、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模糊删除实现
redis 没有直接提供模糊删除的实现,我们可以根据现有的指令进行组合实现: /**  * @author huoNan  * @version 1.0  * @package com.cyipp.skynet.dcms  * @className AppTest  * @description 测试类  * @time 2018/8/16 16:24  */ @RunWith(SpringR...
自定义序列化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 />
RedisTemplate最全的常用方法总结
Redis常用的数据类型: String Hash List Set zSet Sorted set String类型 判断是否有key所对应的值,有则返回true,没有则返回false redisTemplate.hasKey(key) 有则取出key值所对应的值 redisTemplate.opsForValue(...
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo