redis设置过期时间后再set还用设置时间吗_redis setnx 过期时间

redis设置过期时间后再set还用设置时间吗_redis setnx 过期时间​​​​​​​java操作Redis缓存设置z过期时间转载:java操作Redis缓存设置过期时间-liuminchao-博客园关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间。在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是://生成tokenStringtoken=UUID.randomUUID().t..

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

​​​​​​​java操作Redis缓存设置z过期时间

转载:java操作Redis缓存设置过期时间 – liuminchao – 博客园

关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间。

在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是:

复制代码

//生成token
String token = UUID.randomUUID().toString();
//把用户信息写入redis
jedisClient.set(REDIS_USER_SESSION_KEY + ":" + token,JsonUtils.objectToJson(user));
//设置session的过期时间 时间单位是秒
jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, 1800);

复制代码

但这样做可能会出现问题,比如多并发上面,设置值和过期时间用了两步操作。可以将设置值和过期时间合并成一步操作,所以可以使用redis的设置值set的另外一个方法:

// NX是不存在时才set, XX是存在时才set, EX是秒,PX是毫秒
jedisClient.set(key, value, "NX", "EX", expireSecond);

取值的时候使用:

复制代码

    @Override
    public Result getUserByToken(String token) {
        //根据token从redis中查询用户信息
        String json = jedisClient.get(REDIS_USER_SESSION_KEY + ":" + token);
       //判断是否为空
       if (StringUtils.isBlank(json)) {
        return Result.build(400, "此session已经过期,请重新登录");
       }
       //更新过期时间
       jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, 1800);
       //返回用户信息
       return Result.ok(JsonUtils.jsonToPojo(json, TbUser.class));
    }

复制代码

其他使用方法:

复制代码

public void save(String key, String value, Long expireSecond) {
    boolean keyExist = jedisClient.exists(key);
    if (keyExist) {
        jedisCluster.del(key);
    }
 
    // NX是不存在时才set, XX是存在时才set, EX是秒,PX是毫秒
    jedisClient.set(key, value, "NX", "EX", expireSecond);
}

转载:

redis 设置过期时间 – Mr-Lee-long – 博客园

1.redis过期时间介绍

有时候我们并不希望redis的key一直存在。例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁。redis提供了一些命令,能够让我们对key设置过期时间,并且让key过期之后被自动删除

2.redis过期时间相关命令

1.EXPIRE PEXPIRE 

    EXPIRE 接口定义:EXPIRE key “seconds”
    接口描述:设置一个key在当前时间”seconds”(秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。

 
    PEXPIRE 接口定义:PEXPIRE key “milliseconds”
    接口描述:设置一个key在当前时间”milliseconds”(毫秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。

1

2

3

4

5

6

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIRE aa 60

(integer) 1

127.0.0.1:6379> EXPIRE aa 600

(integer) 1

2.EXPIREAT PEXPIREAT

    EXPIREAT 接口定义:EXPIREAT key “timestamp”
    接口描述:设置一个key在”timestamp”(时间戳(秒))之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。

    PEXPIREAT 接口定义:PEXPIREAT key “milliseconds-timestamp”
    接口描述:设置一个key在”milliseconds-timestamp”(时间戳(毫秒))之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间

1

2

3

4

5

6

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIREAT aa 1586941008

(integer) 1

127.0.0.1:6379> PEXPIREAT aa 1586941008000

(integer) 1

3.TTL PTTL

    TTL 接口定义:TTL key
    接口描述:获取key的过期时间。如果key存在过期时间,返回剩余生存时间(秒);如果key是永久的,返回-1;如果key不存在或者已过期,返回-2。

    PTTL 接口定义:PTTL key
    接口描述:获取key的过期时间。如果key存在过期时间,返回剩余生存时间(毫秒);如果key是永久的,返回-1;如果key不存在或者已过期,返回-2。

1

2

3

4

5

6

7

8

9

10

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIRE  aa 60

(integer) 1

127.0.0.1:6379> ttl aa

(integer) 58

127.0.0.1:6379> ttl aa

(integer) 56

127.0.0.1:6379> pttl aa

(integer) 40395

4.PERSIST

    PERSIST 接口定义:PERSIST key
    接口描述:移除key的过期时间,将其转换为永久状态。如果返回1,代表转换成功。如果返回0,代表key不存在或者之前就已经是永久状态。

1

2

3

4

5

6

7

8

9

10

127.0.0.1:6379> set aa bb

OK

127.0.0.1:6379> EXPIRE  aa 600

(integer) 1

127.0.0.1:6379> ttl aa

(integer) 596

127.0.0.1:6379> PERSIST aa

(integer) 1

127.0.0.1:6379> ttl aa

(integer) -1

5.SETEX

  SETEX 接口定义:SETEX key “seconds” “value”
  接口描述:SETEX在逻辑上等价于SET和EXPIRE合并的操作,区别之处在于SETEX是一条命令,而命令的执行是原子性的,所以不会出现并发问题。

1

2

3

4

5

6

127.0.0.1:6379> SETEX aa 100 bb

OK

127.0.0.1:6379> pttl aa

(integer) 95834

127.0.0.1:6379> ttl aa

(integer) 81

3.redis如何清理过期key 

  redis出于性能上的考虑,无法做到对每一个过期的key进行即时的过期监听和删除。但是redis提供了其它的方法来清理过期的key。

  1.被动清理

  当用户主动访问一个过期的key时,redis会将其直接从内存中删除。

  2.主动清理

  在redis的持久化中,我们知道redis为了保持系统的稳定性,健壮性,会周期性的执行一个函数。在这个过程中,会进行之前已经提到过的自动的持久化操作,同时也会进行内存的主动清理。
  在内存主动清理的过程中,redis采用了一个随机算法来进行这个过程:简单来说,redis会随机的抽取N(默认100)个被设置了过期时间的key,检查这其中已经过期的key,将其清除。同时,如果这其中已经过期的key超过了一定的百分比M(默认是25),则将继续执行一次主动清理,直至过期key的百分比在概率上降低到M以下。

  3.内存不足时触发主动清理

  在redis的内存不足时,也会触发主动清理。

4.redis内存不足时的策略

  redis是一个基于内存的数据库,如果存储的数据量很大,达到了内存限制的最大值,将会出现内存不足的问题。redis允许用户通过配置maxmemory-policy参数,指定redis在内存不足时的解决策略

redis设置过期时间后再set还用设置时间吗_redis setnx 过期时间

      1.volatile-lru 使用LRU算法删除一个键(只针对设置了过期时间的key
  2.allkeys-lru 使用LRU算法删除一个键
  3.volatile-lfu 使用LFU算法删除一个键(只针对设置了过期时间的键)
  4.allkeys-lfu 使用LFU算法删除一个键
  5.volatile-random 随机删除一个键(只针对设置了过期时间的键)
  6.allkeys-random 随机删除一个键
  7.volatile-ttl 删除最早过期的一个键
  8.noeviction 不删除键,返回错误信息(redis默认选项)

  对于只针对设置了过期时间的键进行删除的策略,在所有的可被删除的键(非永久的键)都被删除时内存依然不足,将会抛出错误。
  其中,LRU算法—>最近最少使用算法,较为注重于时间;LFU算法—>最近最不常用算法,较为注重于被访问频率。

  redis的内存置换算法和操作系统中的内存置换算法类似,就不在这里展开了。

5.redis过期时间总结

  redis的过期时间还有许多的细节值得去深入了解,例如持久化时对过期时间的处理,redis周期性的常规操作等等,只有这样才能更准确的定位问题,解决问题。

  而想进一步的理解这些知识,除了仔细的思考外,最好的办法就是通过阅读源代码,理解redis的底层运行原理。但是这一目标对于现在的我来说难度过大,希望通过不断的学习,将来的我能够做到这一点。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189257.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot——MyBatisPlus

    SpringBoot——MyBatisPlusSpringBoot——MyBatisPlus

    2022年4月23日
    53
  • 流水线设计的方法和作用「建议收藏」

    流水线设计的方法和作用「建议收藏」流水线设计从某种程度上可以提高系统频率,因此常用于高速信号处理领域,如果某个信号可以分为若干步骤处理,而且整个数据处理过程是单项的,即没有反馈运算和迭代运算,前一个步骤的输出就是下一个步骤的输入,可以考虑流水线设计来提高系统的频率。如下图所示:典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其当她是…

    2022年4月19日
    43
  • CSS绘画三角形

    CSS绘画三角形本案例使用CSS绘画了一个三角形的图案。预览演示地址:https://tympanus.net/codrops-playground/SaraSoueidan/kFTn9yJk/editor将下面的代码复制到演示地址对应位置即可查看效果<!–HTML–><divclass="container"><divclass="eleme…

    2022年6月26日
    28
  • 英伟达,老版本显卡查询接口

    英伟达,老版本显卡查询接口英伟达显卡 老版本显卡驱动查询接口 支持分页 https gfwsl geforce com services toolkit services com nvidia services AjaxDriverSe php func DriverManual amp psid 101 amp pfid 817 amp osID 19 amp languageCode 2052 amp beta 0 amp isWHQL 1 amp dltype 1 amp dch 0 amp u

    2025年8月28日
    6
  • linux设置node环境变量,Linux 安装最新 Node.js 并配置环境变量「建议收藏」

    linux设置node环境变量,Linux 安装最新 Node.js 并配置环境变量「建议收藏」今天准备在服务器上构建一个前端项目,我的服务器用的Linux是CentOS7,我通过Yum安装了Nodejs。在运行构建命令的时候出现了一堆错误信息,项目也无法成功构建,其中的一段错误信息如下:npmERR!Makesureyouhavethelatestversionofnode.jsandnpminstalled.我使用node-v查看了一下No…

    2022年6月3日
    142
  • php-cli和php-fpm的关系是什么?

    php-cli和php-fpm的关系是什么?

    2021年9月23日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号