⑴ java设置 redis 失效时间多久
EXPIRE命令返回1表示成功,返回0表示键值不存在或设置失败。
同时这里还有一个比较常用的命令是ttl,用于查看一个键还有多久时间会被删除。返回的是剩余时间(秒数)。
这里就不贴代码了,有一点需要说明的是,ttl命令在键不存在或被删除之后,会返回-2,在没有为键设置生存时间(即永久存在,建一个键之后的默认情况)时返回的是-1。大家可以亲自操作一把。
如果想要把一个设置过过期时间的键取消过期时间设置,则需要使用persist命令。
redis > SET session:27e7a id1234
OK
redis > EXPIRE session:27e7a 1200
(integer) 1
redis > TTL session:27e7a
(integer) 1092
redis > PERSIST session:27e7a
(integer) 1
redis > TTL session:27e7a
(integer) -1
这里需要说明一点的是,除了使用persist命令外,使用set、getset命令为键赋值,也会同时消除键的生存时间,如果需要可以重新使用expire命令为键设置生存时间。而其他对键的操作命令(如incr、lpush、hset、zrem)都不会影响键的生存时间。
expire命令的单位是秒,而且这个参数必须为整数,如果需要更精准的时间的话,需要使用pexpire命令设置,其单位为毫秒,同理也需要用pttl命令来看键的剩余毫秒数。当然使用expire命令设置的过期时间也是可以用pttl看键的剩余毫秒数的。
访问限制
有时候我们会有一个需求是需要限制一个用户对一个资源的访问频率,我们假定一个用户(用IP作为判断)每分钟对一个资源访问次数不能超过10次。
我们可以使用一个键,每次用户访问则把值加1,当值加到10的时候,我们设定键的过期时间为60秒,并且禁止访问。这时候下次访问发现值为10,则不让访问了,然后60秒后键被删除,这时候再次创建键。这样就可以解决,但是其实这样时间并不精准,问题还是挺大的。
我们还有一个方案:使用队列。前面的章节也说到了,使用列表类型可以用作队列。
我们设定一个队列rate.limiting.192.168.1.1(假定是这个IP),我们把每次的访问时间都添加到队列中,当队列长度达到10以后,判断当前时间与队列第一个值的时间差是否小于60,如果小于60则说明60秒内访问次数超过10次,不允许访问;否则说明可以访问,则把队列头的值删除,队列尾增加当前访问时间。
这种方法可以比较精准的实现访问限制,但是当限制的次数比较大时,这种方法占用的存储空间也会比较大。
缓存
有时候会把一些对CPU或IO资源消耗比较大的操作结果缓存起来,并设置一定时间的自动过期。比如我们设定一个微博外链的最热站点缓存放于新浪微博的首页,这样我们不可能每次访问都重新计算最热的外链站点,所以我们可以设定两小时更新一次。每次访问是判断这个键有没有,如果存在则直接返回,如果没有则通过计算把内容存入键中,并设定两小时的过期时间。
然而在很多场合这种方法会很恐怖,当服务器内存有限的时候,大量使用缓存切设置生存时间过长就会导致redis占用太多内存,而redis有时候会把系统内存都吃掉,导致系统崩溃。但是设置时间过短又会导致缓存的命中太低。
所以我们最好的办法是设定缓存的淘汰规则。这种方式比较适用于将redis用作缓存系统的时候比较好。
具体就是:修改配置文件中的maxmemory参数,限制redis的最大内存,当超出后会按照maxmemory-policy参数指定的策略删除不需要的键,直到redis占用的内存小于设定值。
⑵ redis缓存有多久
在Redis中的数据一般在内存中进行存取,在没有进行持久化之前这些数据都有过期时间,对于Redis的过期时间需要通过对key设置过期时间,一般时间的设置需要根据项目改变,可以设置一段时间后或者永久不失效。
redis过期时间
redis过期时间介绍有时候我们并不希望redis的key一直存在。例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁。redis提供了一些命令,能够让我们对key设置过期时间,并且让key过期之后被自动删除。
5.SETEXSETEX接口定义:SETEX key "seconds" "value"接口描述:SETEX在逻辑上等价于SET和EXPIRE合并的操作,区别之处在于SETEX是一条命令,而命令的执行是原子性的,所以不会出现并发问题。
⑶ Redis缓存过期机制
一、针对与设置了过期时间的key值
1.(主动)定期删除:定时随机的检查过期的key,如果过期则清理删除
redis.conf(每秒检查的次数1-500)配置: hz 10
2.(被动)惰性删除:当客户端请求到一个已经过期的key时,redis会检查是否过期并删除
所以,虽然key过期了,但是没被清理的话,还是会占内存的。
二、内存淘汰管理机制Memory Management
当内存占满之后,redis提供缓存淘汰机制。
redis.conf: maxmemory <bytes>
* noeviction:旧缓存永不过期,新缓存设置不了,返回错误
* allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用)
* allkeys-random:在所有的缓存中随机删除(不推荐)
* volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
* volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
* volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
⑷ redis 怎么设置过期时间为每天24:00
PEXPIREAT KEY_NAME TIME_IN_MILLISECONDS_IN_UNIX_TIMESTAMP
设置成功返回 1 。 当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。
例子:
pexpireat redisKey ovar_time
redisKey :是redis 的key值 over_time 是当天的24点
var over_time = (Timer.getDayHour(Timer.now(), 0, 0, 0) * Timer._M_SEC) + Timer.OneDay;
Timer._M_SEC = 1000 这里设置的 ms数
Timer.OneDay = 24*60*60*1000; //86400000
Timer.now():当前时间 可以根据不同的语言更换对应的取值方式
/**
* @Brief: 获取指定时间( 秒数)当天某时候的秒数
*
* @param {Number} timeStampe 时间毫秒数
* @param {Number} hour 小时
* @param {Number} min 分钟
* @param {Number} sec 秒
* */
Timer.getDayHour = function (timeStampe, hour, min, sec) {
var nowDate = new Date(timeStampe);
nowDate.setHours(hour);
nowDate.setMinutes(min);
nowDate.setSeconds(sec);
return Math.floor(nowDate.getTime() / _M_SEC);
};
⑸ 2022-03-12 SpringBoot 使用redis做缓存,设置失效时间以及序列化
SpringBoot的cache缓存,是针对返回值的一种操作
springboot使用redis做缓存时,默认只需要导入redis依赖,即可实现使用redis做缓存
不需要导入cache依赖
在启动类上加上 @EnableCaching 即可开启缓存功能
关于各个注解的使用,这里不再细说,网上详细的教程很多,这里主要讲一下如何指定过期时间
默认是永不过期,如果需要指定过期时间,则需要增加配置类
⑹ redis设置过期时间等
//向redis里存入数据和设置缓存时间
//val做-1操作
//根据key获取缓存中的val
//val +1
//根据key获取过期时间
//根据key获取过期时间并换算成指定单位
//根据key删除缓存
//检查key是否存在,返回boolean值
//向指定key中存放set集合
//设置过期时间
//根据key查看集合中是否存在指定数据
//根据key获取set集合
//验证有效时间
⑺ redis一般过期时间设置为多少合适
1. 在小于2.1.3的redis版本里,只能对key设置一次expire。redis2.1.3和之后的版本里,可以多次对key使用expire命令,更新key的expire time。
2. redis术语里面,把设置了expire time的key 叫做:volatile keys。 意思就是不稳定的key。
3. 如果对key使用set或del命令,那么也会移除expire time。尤其是set命令,这个在编写程序的时候需要注意一下。
4. redis2.1.3之前的老版本里,如果对volatile keys 做相关写入操作(LPUSH,LSET),和其他一些触发修改value的操作时,redis会删除该key。
⑻ redis里怎样设置过期时间
通过EXPIRE 命令或者PEXPIRE 命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间( Time To Live , TTL) ,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键:
redis> SET key value
OK
redis> EXP 工RE key 5
(integer) 1
redis> GET key // 5 秒之内"value"
redis> GET key // 5 秒之后
(nil)
注意
SETEX 命令可以在设直一个字符串键的同时为键设直过期时间,因为这个命令是一个类型限定的命令(只能用于字符串键),但SETEX 命令设置过期时间的原理和EXPIRE命令设置过期时间的原理是完全一样的。
与EXPlRE 命令和PEXPIRE 命令类似,客户端可以通过EXPlREAT 命令或PEXPlREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire time)。
过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键:
redis> SET key value
OK
redis> EXPIREAT key 1377257300
(integer) 1
redis> TIME
1)"1377257296"2)"296543"
redis> GET key // 1377257300 之前"value"
redis> TIME
1)"1377257303"2)"230656 "
redis> GET key // 1377257300 之后
(nil)
TTL 命令和PTTL 命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间:
redis> SET key va1ue
OK
redis> EXPlRE key 1000
(integer) 1
redis> TTL key
(integer) 997
redis> SET another_key another_value
OK
⑼ redis需要设置过期时间吗
通过expire
命令或者pexpire
命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(
time
to
live
,
ttl)
,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键:
redis>
set
key
value
ok
redis>
exp
工re
key
5
(integer)
1
redis>
get
key
//
5
秒之内"value"
redis>
get
key
//
5
秒之后
(nil)
注意
setex
命令可以在设直一个字符串键的同时为键设直过期时间,因为这个命令是一个类型限定的命令(只能用于字符串键),但setex
命令设置过期时间的原理和expire命令设置过期时间的原理是完全一样的。
与explre
命令和pexpire
命令类似,客户端可以通过explreat
命令或pexplreat命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire
time)。
过期时间是一个unix时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键:
redis>
set
key
value
ok
redis>
expireat
key
1377257300
(integer)
1
redis>
time
1)"1377257296"2)"296543"
redis>
get
key
//
1377257300
之前"value"
redis>
time
1)"1377257303"2)"230656
"
redis>
get
key
//
1377257300
之后
(nil)
ttl
命令和pttl
命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间:
redis>
set
key
va1ue
ok
redis>
explre
key
1000
(integer)
1
redis>
ttl
key
(integer)
997
redis>
set
another_key
another_value
ok
⑽ redis需要设置过期时间吗
看需求吧,如果你缓存的数据是静态的,随着时间不会变化或者变化比较小,以后一直会用到,那就不用设置。但是如果缓存的数据具有时效新,或者是动态的,不停追加,那么最好设置或者自己定时删除,不然内存会撑爆的