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);
        }

猜你喜欢

转载自blog.csdn.net/laiyuan999/article/details/81136936
今日推荐