關於資料計時和泛型的一點總結
阿新 • • 發佈:2020-10-26
最近接觸到了一些關於資料計時的功能,比如TCP長連線中的心跳等,有一種方案是可以使用redis的資料過期來實現。我不禁開始思考,redis是如何完成這項工作的呢?
通過查閱資料得知了三種資料過期的策略,具體名字忘記了... ...下面記錄一下我對三種策略的理解。
第一種,是對該資料進行監聽,保證資料可以及時被過期處理。
第二種,是當使用到該資料時,再判斷該資料是否過期。
第三種,是定期判斷設定了過期時間的資料是否過期。
據某文章描述,redis正是採用了第二種和第三種策略的結合,雖然沒看過redis原始碼(主要是感覺自己這點水平估計讀不懂),但聽上去感覺挺合理的。
最近機緣巧合之下,接觸了一下時間戳的概念,實際上早在N久之前就接觸過時間戳,但是一直沒有重視。由於這一次的認真瞭解,我誕生了一個猜測,如果脫離redis的資料過期機制該如何實現資料過期呢?
首先,對資料進行儲存,儲存時附帶時間戳與過期時間。然後依舊採用第二種和第三種策略的結合,每次使用到該資料時,都用當前時間的時間戳與儲存的時間戳相減,再與儲存的過期時間相對比,如果資料過期,則直接將其刪除。
設定一個校驗週期,定期採用時間戳相減對比過期時間的方式處理掉過期資料。
目前這只是我的一個猜測,不曉得有沒有人用相同的思路解決過問題,期待某一天能夠實踐一下。
在java中子類例項是可以賦給父類宣告的,但是,如果是一個子類泛型的例項是不允許賦值給父類泛型的宣告的。
自己動手簡單測試了一下:
public class AnyType<T> { }
上面一個簡單的泛型類
publicclass First { }
一個簡單的父類
public class Second extends First { }
一個簡單的子類
public class Boot { public static void main(String[] args) { AnyType<First> param = new AnyType<First>(); } }
這樣是沒問題的
public class Boot { public static void main(String[] args) { AnyType<First> param = new AnyType<>(); } }
這樣也是沒問題的
public class Boot { public static void main(String[] args) { AnyType<First> param = new AnyType<Second>(); } }
但是這樣,就會報錯,實踐表明,果然是不允許這樣操作的