Redis能夠爲存儲在數據庫中的值設置過時時間,做爲一個緩存數據庫,這個特性是頗有幫助的。咱們項目中的token或其餘登陸信息,尤爲是短信驗證碼都是有時間限制的。redis
按照傳統的方法都是項目自己判斷過時,這樣無疑影響了系統性能。數據庫
redis能夠爲set或者expire兩種方式爲鍵設置過時時間緩存
1 Jedis jedis = new Jedis("localhost"); 2 //nxxx:nx是不存在是才set,xx是存在時才set 3 //expx:EX是秒,PX是毫秒 4 jedis.set("key","value","XX","PX",1000); 5 Thread.sleep(2000); 6 String value = jedis.get("key"); 7 if(value==null||"".equals(value)){ 8 System.out.println("已過時"); 9 }else{ 10 System.out.println(value); 11 } 12 jedis.set("key","value"); 13 jedis.expire("key",10000); 14 value = jedis.get("key"); 15 if(value==null||"".equals(value)){ 16 System.out.println("已過時"); 17 }else{ 18 System.out.println(value); 19 }
輸出結果dom
爲一個鍵設置了過時時間爲一個小時,那麼一個小時以後如何處理這個鍵呢?有兩種方式:按期刪除和惰性刪除性能
按期刪除:每隔必定的時間就在設置了過時時間的鍵裏面隨機挑選一些刪除spa
惰性刪除:已通過期了的鍵值沒有在按期刪除裏被刪掉,除非系統用get去查那個key纔會被刪除code
由此咱們能夠看到若是按期刪除留下了不少過時的key,又沒有及時去查讓惰性刪除發揮做用,就會在redis內存中佔用大量空間,致使redis內存塊被耗盡。blog
爲了解決這個問題,redis提供了內存淘汰策略。token
redis提供了6種內存淘汰策略內存
一、voilate-lru:在設置了過時時間的數據裏面挑選最近最少被使用的刪除
二、voilate-ttl:在設置了過時時間的數據裏面挑選將要過時的刪除
三、voilate-random:在設置了過時時間的數據裏面隨機挑選一些刪除
四、allkeys-lru:在全部數據裏面挑選最近最少被使用的刪除
五、allkeys-random:在全部數據裏面隨機挑選一些刪除
六、no-eviction:禁止驅逐數據,不容許新數據插入
4.0版本以後增長了兩種
七、violate-lfu:在設置了過時時間的數據裏面挑選最不常使用的刪除
八、allkeys-lfu:在全部數據裏面挑選最不常使用的刪除