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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Redis常用命令对应的Spring中RedisTemplate操作方法
1、Spring配置文件:nnn&lt;?xml version="1.0" encoding="UTF-8"?&gt;n&lt;beans xmlns="http://www.springframework.org/schema/beans"n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"n xmlns:context="http:/...
RedisTemplate的各种操作(set、hash、list、string)
注入以下RedisTemplatennn@Autowirednprivate RedisTemplate&amp;lt;String,String&amp;gt; redisTemplate;nn1、保存和读取Set:nn代码示例:nnnSetOperations&amp;lt;String, String&amp;gt; set = redisTemplate.opsForSet();n set.add(&quot;set1&quot;,&quot;22...
spring redisTemplate 持久化到redis中数据更改为String类型
spring redisTemplate 持久化到redis中数据更改为String类型
spring中自动注入时 set 方法中的空指针异常
这种在注入map类型的testMap时,如果使用rnrnnsetTestMap(String value){rn this.testMap.put(value,value)rn}rn rn rn rn rn 会报空指针异常。rn修改为rn rnsetTestMap(String value){rn Map&amp;lt;String,String&amp;gt; tomap = new HashMap...
SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
今天给大家介绍一下SpringBoot中Redis的set、map、list、value等基本操作的具体使用方法nn想学习分布式、微服务、JVM、多线程、架构、java、python的童鞋,千万不要扫码,否则后果自负~nnnn上一节中给大家介绍了如何在SpringBoot中搭建Redis缓存数据库,这一节就针对于Redis的具体操作进行介绍。nn关于Redis的历史,以及目前的普及程度大家应该都比...
疑问
目录判断周几提取时间序列正则疑惑n判断周几n需要判断某一天是周几n# -*- coding: utf-8 -*- nfrom datetime import datetimenn# today = datetime.now().weekday()n# print(today)nnweek = datetime.strptime('20170801', '%Y%m%d').weekday() #w...
what、which的疑问代词_18
今天我们要讲一讲疑问词,它们会让你知道如何用英语来提问。nn我们来看看所有的疑问词:nnnWhat           WherennWhich         WhynnHow            WhennnWho           nnn疑问词非常重要、非常有用而且使用非常简单。它们用来组成那些表明想获得何种信息的问句。nn这次,我们将重点放在&quot;what&quot;和&quot;which&quot;上面。nn当存在...
疑问代词和关系代词
第二章、疑问代词和关系代词rn rn1. 疑问代词的用法rn(1) whorn[1] who的意思是“谁”,是主格,通常作主语。如:Who is that woman? 那个妇女是谁?Who are those people? 那些人是谁?rn[2] who在口语中可代替whom作宾语。如:Who did you ask about it? 关于那件事你问过谁了?rn(2) whomrnwhom ...
redistemplate
redis client, 用下看看吧.
关于人工智能的一些想法和疑问
假设:n多元学习:多维度输入比少维度/单维度输入的学习过程要有效的多n图像识别/事物分辨:X只学习了A, 分辨B是不是A 花了时间 t1,nY学习了A和B,分辨B是不是A花了时间t2,nt2 应远小于 t1nn...
10、Spring技术栈-整合Redis,使用RedisTemplate实现数据缓存实战
整合Redis,使用RedisTemplate实现数据缓存
R_M界面不稳定性LevelSet方法
R_M界面不稳定性LevelSet方法R_M界面不稳定性LevelSet方法
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
基于RedisTemplate的redis工具类
RedisTempla是一个spring-redis模块下的操作redis的工具类,有点类似于jdbcTemplate。n但是操作起来略显麻烦,于是封装一个稍微简单点的redis工具类,直接上代码:nimport org.springframework.data.redis.core.RedisTemplate;nimport org.springframework.data.redis.co
RedisTemplate添加List类型数据
在实际情况中,需要获取用户全部信息,是要从数据库中查询,现在使用缓存则是从缓存中获取数据。第一次查询数据时,显然是从数据库中进行获取的,缓存中是不存在该数据的,因此需要将数据库中查询出来的数据放在缓存中。所以,一调用查询方法,就需要判断缓存中是否有该缓存。nn该项目是 spring boot 整合 redis,使用的的 RedisTemplate,首先要判断缓存中是否存在key,其次存储 list...
RedisTemplate实现分布式锁
使用Redis的SETNX命令获取分布式锁的步骤:nnC1和C2线程同时检查时间戳获取锁,执行SETNX命令并都返回0,此时锁仍被C3持有,并且C3已经崩溃n C1 DEL锁n C1 使用SETNX命令获取锁,并且成功n C2 DEL锁n C2 使用SETNX命令获取锁,并且成功n ERROR : 由于竞态条件,C1和C2都获取到了锁n幸运的是,以下面的步骤完全可以避免这种情况发生,看看C4线程如...
RedisTemplate-Redis缓存工具类(自己封装的简单工具类)
前言    这个是基于redis的一个简单的缓存工具类 自己封装的,写的不合理的地方希望大家指出,使用起来也比较简介方便,移植性也比较好,如果换了redis,替换也方便数据准备:      1. redis框架       2.fastjosn框架1.Cacheable接口/**n * 缓存参数接口n * @param &amp;lt;T&amp;gt;n */npublic interface Cacheabl...
redisTemplate模糊匹配删除
 nnnSet&amp;lt;String&amp;gt; keys = redisTemplate.keys(&quot;noteUserListenedPoi:&quot; + &quot;*&quot;);nredisTemplate.delete(keys);n或者nnstringRedisTemplate.delete(stringRedisTemplate.keys(&quot;noteUserListenedPoi:&quot; + &quot;*&quot;));nn ...
【JAVA】来自Java编程题的疑问
Java问题n1.System.out.println((int)(char)(byte) -1); 结果是?nhttps://blog.csdn.net/pmcasp/article/details/80746598n-1不在表范围之内,怎么看啊?涉及到-1是补码,可以去看看基础书。nn...
基于redis的setnx()、get()、getset()方法 分布式锁
一.redis命令讲解:rn setnx()命令:rnsetnx的含义就是SET if Not Exists,其主要有两个参数 setnx(key, value)。rn该方法是原子的,如果key不存在,则设置当前key成功,返回1;如果当前key已经存在,则设置当前key失败,返回0。rn get()命令:rnget(key) 获取key的值,如果存在,则返回;如果不存在,则返回nil;rn ge
基于redisTemplate的redis的分布式锁正确打开方式
      最近在做项目中要用到redis锁,因为项目是集群部署,所以要考虑分布式锁,查了一些资料,发现有些会产生误导,所以还是记录一下redis分布式锁的正确打开方式,话不多说,先上代码nnnimport org.slf4j.Logger;nimport org.slf4j.LoggerFactory;nimport org.springframework.data.redis.core.Red...
【小家Spring】Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入失败的问题
前言nSpring为了简化我们对持久化层的操作,针对各种持久化方案提供了统一的Template进行操作。比如我们的熟悉的JdbcTemplate就是让我们方便的操作的关系型数据库的。n它有个Spring-Data的子项目,提供了各种SQL、NOSql的便捷操作。比如Redis、MongoDB、ES等等。然后本文主要针对于在SpringBoot中使用RedisTemplate来优雅的操作Redis数...
RedisTemplate常用方法总结
很多公司都将redisTemplate进行了封装,封装成业务所需要的RedisUtil工具类方便进行调用,本篇文章总结了redisTemplate常用的一些工具类。rnrnRedis最为常用的数据类型:rnrnStringrnHashrnListrnSetrnzSetrnSorted setrnrnStringrnrn...
Redis基本数据结构及SpringBoot中使用redisTemplate操作Redis
文章目录一、Redis环境1、环境:CentOS7.0,redis-4.0.22、首先启动redis服务二、Redis数据结构1、string(字符串)(1)键值对(2)使用mset和mget批量操作(3)过期时间设置和set扩展(4)计数2、list (列表)(1)队列,左进右出,先进先出(2)栈,左进左出,先进后出(3)慢操作3、hash(字典)4、set(集合)zset(有序集合)三、Spr...
RedisTemplate的简单使用
1. 定义一个对象npublic class User implements Serializable {nn private Integer id;n private String name;nn n public Integer getId() {n return id;n }nn public void setId(Integer id)
【redis】使用redisTemplate优雅地操作redis及使用redis实现分布式锁
前言:nn上篇已经介绍了redis及如何安装和集群redis,这篇介绍如何通过工具优雅地操作redis.nnLong Long ago,程序猿们还在通过jedis来操作着redis,那时候的猿类,一个个累的没日没夜,重复的造着轮子,忙得没时间陪家人,终于有一天猿类的春天来了,spring家族的redis template 解放了程序猿的双手,于是猿类从使用Jedis石器时代的进入自动化时代...n...
在ssm项目中使用redisTemplate
第一步,导入相关的jar包:需要注意jedis和data-redis的版本,否则容易出现报错n<dependency>n <groupId>redis.clients</groupId>n <artifactId>jedis</artifactId>n <version>2.4.1</version>n </dependency> n <dependency
redis在spring项目中的使用(RedisTemplate)
1、redis.properties配置文件rn# -----redis------nredis.host=xxx.xxx.xxx.xxxnredis.port=6379nredis.pass=xxxnredis.conf.maxActive=5000nredis.conf.maxIdle=100nredis.conf.maxWait=10000nredis.conf.testOnBorrow=f
Spring 篇:RedisTemplate 配置与使用
Maven 依赖n &amp;lt;!-- Redis 官方提供的 Java 驱动 --&amp;gt;n &amp;lt;dependency&amp;gt;n &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt;n &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt;n &amp;lt;version&amp;gt;2.9.0
Redis学习《2.RedisTemplate五种数据类型基本API操作》
Java中使用redis很少会去使用原始的jedis的API,除非是自己重构框架之类,所以使用spring有的RedisTemplate。nn一、maven引入依赖好,我是springboot项目,如下pom.xml文件:nnn &amp;lt;dependency&amp;gt;n &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;g...
ssm框架中使用原生RedisTemplate
①首先在maven中添加jar包nnn &amp;lt;dependency&amp;gt;n &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt;n &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt;n &amp;lt;version&amp;gt;2.4.1&amp;lt;/version&amp;gt;n &amp;lt;/depe
Spring Data Redis 单节点和集群配置和RedisTemplate用法
Spring Data Redis 单节点和集群配置和RedisTemplate用法标签(空格分隔): Spring-Data使用SpringData更加方便我们对关系型数据库和非关系型数据库更好的操作,封装了通用的代码,使得操作更加快捷简单。一、Spring Data Redis的配置引入相关jar包,注意依赖和冲突问题。nmaven 引入pom.xml:n<dependency>n <
Spring boot注入多个redisTemplate,并更改默认序列化策略
1、添加maven依赖        &amp;lt;dependency&amp;gt;n &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;n &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt;n &amp;lt;/dependency&amp;gt;2、配置文件中...
RedisTemplate geohash实践(网约车场景)
应用场景:移动出行,查找附近司机进行派单nnnpackage com.tencent.iov.lbsservice.util;nnimport org.springframework.beans.factory.annotation.Autowired;nimport org.springframework.data.geo.*;nimport org.springframework.data.r...
RedisTemplate的key默认序列化器问题
redis的客户端换成了spring-boot-starter-data-redis,碰到了一个奇怪的问题,在同一个方法中1.先hset,再hget,正常获得数据。在不同的方法中 先hset,再hget获取不到数据,通过redis的monitor监控发现了命令的问题:实际我的key为JK_HASH:csrk,hashkey为user,但是根据上图所示,实际执行的命令多了好多其他字符,这是什么原因呢...
Jedis操作单节点redis,集群及redisTemplate操作redis集群(一)
1,该文章主要介绍如何使用Jedis操作单节点redis数据,后续两篇文章将介绍Jedis操作redis集群及redisTemplate操作redis集群;码云上面地址:https://gitee.com/dream21th/dream21th-redis2,项目的pom文件如下:&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&amp;lt;project xml...
SpringBoot基本操作(四)——SpringBoot使用RedisTemplate整合Redis(有demo)
SpringBoot2.0笔记nn(一)SpringBoot基本操作——环境搭建及项目创建(有demo)nn(二)SpringBoot基本操作——使用IDEA打war包发布及测试nn(三)SpringBoot基本操作——SpringBoot整合SpringDataJpa(有demo)nn(四)SpringBoot基本操作——SpringBoot使用RedisTemplate整合Redis(有dem...
springboot使用protostuff进行序列化和反序列化整合redis的redisTemplate的各种方法的写法
1.加入gogole提供的工具包(序列化会用到)+redis包nnn&lt;!-- 工具库 --&gt;n&lt;dependency&gt;n &lt;groupId&gt;com.google.guava&lt;/groupId&gt;n &lt;artifactId&gt;guava&lt;/artifactId&gt;n &lt;version&gt;18.0&lt;/v...
使用RedisTemplate实现简易的分布式锁(仅供参考)
package com.*.lock;nnimport lombok.extern.log4j.Log4j2;nimport org.nutz.lang.Strings;nimport org.springframework.data.redis.core.RedisCallback;nimport org.springframework.data.redis.core.RedisTemplate...
redisTemplate 实现订阅与发布
npackage testMaven2;nnimport org.springframework.beans.factory.annotation.Autowired;nimport org.springframework.data.redis.connection.Message;nimport org.springframework.data.redis.connection.MessageL...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 数据库课程设计疑问 数据库课程设计疑问