1. 首页
  2. bug人生

redis中键的生存时间(expire)

1、redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它
expire 设置生存时间(单位/秒)
pexpire 设置生存时间(单位/毫秒)
ttl/pttl 查看键的剩余生存时间
persist 取消生存时间
expireat [key] unix时间戳1351858600
pexpireat [key] unix时间戳(毫秒)1351858700000

2、应用场景
限时的优惠活动
网站数据缓存(对于一些需要定时更新的数据)
限制网站访客访问频率(例如:1分钟最多访问10次)

3、代码演示

/** 
     * 限制网站访客访问频率(例如: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);  
    }  

原创文章,作者:维尼兔,如若转载,请注明出处:https://www.v2v0.com/?p=110

发表评论

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

联系我们

 

工作时间:周一至周五,09:30-17:00,节假日休息