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