⑴ jedis怎么获取key的失效时间
KEYS pattern
查找所有符合给定模式 pattern 的 key 。
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。
⑵ 往redis存数据的时候不设置过期时间 是不是这条数据就永久
不会过期。 但是这样说有点绝对。一般情况是这样,当你配置中开启了超专出最大内存限属制就写磁盘的话,那么这些没有设置过期时间的key可能会被写到磁盘上。 假如没设置。那么REDIS将使用LRU机制,将内存中的老数据删除,并写入新数据。
可以用sorted set,把要过期的member和key的信息放在sorted set的member里,把过期时间放在score中。跑个任务用zrangebyscore遍历就行了。用sorted set好处是只需要遍历过期的member,不用扫描整个过期member集合。
⑶ java怎么模拟redis缓存超时
从expires中查找key的过期时间,如果不存在说明对应key没有设置过期时间,直接返回。
如果是slave机器,则直接返回,因为Redis为了保证数据一致性且实现简单,将缓存失效的主动权交给Master机器,slave机器没有权限将key失效。
如果当前是Master机器,且key过期,则master会做两件重要的事情:1)将删除命令写入AOF文件。2)通知Slave当前key失效,可以删除了。
master从本地的字典中将key对于的值删除。
主动失效机制
主动失效机制也叫积极失效机制,即服务端定时的去检查失效的缓存,如果失效则进行相应的操作。
我们都知道Redis是单线程的,基于事件驱动的,Redis中有个EventLoop,EventLoop负责对两类事件进行处理:
一类是IO事件,这类事件是从底层的多路复用器分离出来的。
一类是定时事件,这类事件主要用来事件对某个任务的定时执行。
⑷ redis怎么用java设定一定缓存时间作为该数据的存活时间
大方向两种方案:
1.脚本同步:
自己写脚本将数据库数据写入到redis/memcached。
这就涉及到实时数据变更的问题(mysql
row
binlog的实时分析),binlog增量订阅Alibaba
的canal
,以及缓存层数据
丢失/失效
后的数据同步恢复问题。
⑸ jedis里怎么设置数据的有效期
1、下载redis安装包,解压后进入redis目录,执行命令redis-server.exe redis.windows.conf,redis解压后目录如图。回
⑹ java redistemplate怎样获取redis改动时间
我遇到的原因是spring.xml配置有问题,应该为:
错误配置:
⑺ 怎么查看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)
⑻ java编程代码 redisTemplate过期时间问题
我以前项目中的做法是在保存的对象上,增加一个过期时间属性,get之后,判断系统时间是否超过过期时间,超过的话就删掉这个key,或者是从DB重新加载。
⑼ redis中hset(key,field,value)存储的数据怎么设置过期时间,针对field设置
过期时间删除的方法有三种:
1、删除这个key,使用del command
2、用set or getset 命令会将key的expiration清空,事实上set和getset命令是回替换了key对应的value,所以答key的过期时间也就不复存在。所以,需要注意的是:incr,LPUSH,HSET命令是不会改变key的过期时间的。原来是多久,这三条命令执行完之后还是多久。
3、使用persist命令清楚key的过期时间。
rename命令是将keyA变为keyB,无论keyB是否已经存在,keyA的过期时间都会被keyB继承过去。
⑽ 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占用的内存小于设定值。