redis中键的生存时间(expire)
Posted Zhan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis中键的生存时间(expire) 相关的知识,希望对你有一定的参考价值。
1、redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它
expire 设置生存时间(单位/秒)
pexpire 设置生存时间(单位/毫秒)
ttl/pttl 查看键的剩余生存时间
persist 取消生存时间
expireat [key] unix时间戳1351858600
pexpireat [key] unix时间戳(毫秒)1351858700000
2、应用场景
限时的优惠活动
网站数据缓存(对于一些需要定时更新的数据)
限制网站访客访问频率(例如:1分钟最多访问10次)
/** * 限制网站访客访问频率(例如:1分钟最多访问10次),其中: 访客通过IP标识,即同一个IP在1分钟内仅能访问10次 */ @Test public void test4(){ final String ip = "127.0.0.1" ; Jedis redis = null; //模拟同一个用户连续访问20次 for(int i =0;i <20;i ++){ boolean t = validate(ip); if(t ){ System. out.println("恭喜你,购票成功!" +i ); } else{ //获取当前ip过期时间 redis = getRedis(); break; } } while(true &&redis.ttl(ip)>0){ System. out.println("抱歉,你访问过度频繁,请" +redis .ttl(ip )+"秒后再来访问!" ); try { Thread. sleep(1000); } catch (InterruptedException e ) { e.printStackTrace(); } } System. out.println("你可以再次访问了" ); } /** * * @param ip * @return true: 可以访问,false: 表示已经达到最大上线 */ public boolean validate( String ip ) { Jedis jedis = getRedis(); String value = jedis.get( ip); if(value ==null||value.length()==0){ //第一次访问 jedis.setex( ip, 60,String. valueOf(0)); } else{ int v = Integer.parseInt (value ); if(v >=10){ return false ; } } jedis.incr( ip); return true ; } /** * @return */ public Jedis getRedis() { jedisPool = getJedisPool(); Jedis jedis = jedisPool.getResource(); return jedis ; } /** * */ public JedisPool getJedisPool() { JedisPoolConfig poolConfig = new JedisPoolConfig(); // 控制一个pool最多有多少个 jedis实例。 poolConfig.setMaxTotal(1000); // 控制一个pool最多有多少个状态为idle(空闲的)的 jedis实例。 poolConfig.setMaxIdle(10); // 表示当borrow(引入)一个 jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException; poolConfig.setMaxWaitMillis(200000); // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的 jedis实例均是可用的; poolConfig.setTestOnBorrow(true); return new JedisPool(poolConfig, host, port); }
以上是关于redis中键的生存时间(expire) 的主要内容,如果未能解决你的问题,请参考以下文章
Redis 基础 -- 数据自动过期(EXPIREPEXPIRESET命令的EX选项和PX选项EXPIREATPEXPIREATTTL PTTL:获取键的剩余生存时间)