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的底层运行原理。但是这一目标对于现在的我来说难度过大,希望通过不断的学习,将来的我能够做到这一点。

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 基于Krack的网络攻击「建议收藏」

    基于Krack的网络攻击「建议收藏」更新软件包apt-getupdate安装相应的环境apt-getinstalllibnl-3-devlibnl-genl-3-devpkg-configlibssl-devnet-toolsgitsysfsutilspython-scapypython-pycryptodome下载Krack运行脚本gitclonehttps://github.com/…

  • Android NDK开发:打包so库及jar包供他人使用

    Android NDK开发:打包so库及jar包供他人使用Android的NDK开发相信各位已经精通各种姿势了。不过基本上都是那种native代码和java代码都在同一个工程中,因为应用从头到脚都是我们自己的,也不需要分离。但有时候可能需要我们自己把某些库打包起来供别人使用,或者使用别人提供给我们的库。本篇文章及下篇文章就讲讲so库如何打包。一、目标及方式这篇文章会讲第一种方式来打包so库,这种方式是基于jni层的,需要我们同时提供接口的jar包…

  • SP_EXECUTESQL 输出参数[通俗易懂]

    SP_EXECUTESQL 输出参数[通俗易懂]usepubsgodeclare@countintdeclare@sqlnvarchar(4000)set@sql=’select@count=count(*)fromtitles’execsp_executesql@sql,N’@countintoutput’,@countoutput–请注意字符串前一定要加Nselect@count

  • 初次了解ListNode,针对ListNode的理解「建议收藏」

    初次了解ListNode,针对ListNode的理解「建议收藏」关于ListNodepublicclassListNode{intval;ListNodenext;//链表指向的下一个值的指针ListNode(intx){val=x;}//这个方式赋值}我想到的几点事项定义链表ListNode时,链表的首个值不能为0,当首个参数为0时,代表着链表为空。 只需要定义一个List…

    2022年10月27日
  • 在Windows Server 2012 中安装 .NET 3.5 Framework「建议收藏」

    在Windows Server 2012 中安装 .NET 3.5 Framework「建议收藏」现在仍然有许多程序和应用需要依靠.NET3.5framework来运行。比如sqlserver在WindowsServer2012中,微软提供了.NET3.5和.NET4.5的安装选项以为你的应用程序提供支持。但在安装.NET3.5组件时提示如下信息!当使用服务器管理器来安装.NET3.5时你可能会遇到下面的提示信息,指出源文件无法找到安装其他的功能在添加时并不需要我们提供源…

  • EBS安装完成后,对数据库相关配置的改动

    EBS安装完成后,对数据库相关配置的改动

    2021年11月14日

发表回复

您的电子邮箱地址不会被公开。

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