1. 程式人生 > 實用技巧 >關於資料計時和泛型的一點總結

關於資料計時和泛型的一點總結

最近接觸到了一些關於資料計時的功能,比如TCP長連線中的心跳等,有一種方案是可以使用redis的資料過期來實現。我不禁開始思考,redis是如何完成這項工作的呢?

通過查閱資料得知了三種資料過期的策略,具體名字忘記了... ...下面記錄一下我對三種策略的理解。

第一種,是對該資料進行監聽,保證資料可以及時被過期處理。

第二種,是當使用到該資料時,再判斷該資料是否過期。

第三種,是定期判斷設定了過期時間的資料是否過期。

據某文章描述,redis正是採用了第二種和第三種策略的結合,雖然沒看過redis原始碼(主要是感覺自己這點水平估計讀不懂),但聽上去感覺挺合理的。

最近機緣巧合之下,接觸了一下時間戳的概念,實際上早在N久之前就接觸過時間戳,但是一直沒有重視。由於這一次的認真瞭解,我誕生了一個猜測,如果脫離redis的資料過期機制該如何實現資料過期呢?

首先,對資料進行儲存,儲存時附帶時間戳與過期時間。然後依舊採用第二種和第三種策略的結合,每次使用到該資料時,都用當前時間的時間戳與儲存的時間戳相減,再與儲存的過期時間相對比,如果資料過期,則直接將其刪除。

設定一個校驗週期,定期採用時間戳相減對比過期時間的方式處理掉過期資料。

目前這只是我的一個猜測,不曉得有沒有人用相同的思路解決過問題,期待某一天能夠實踐一下。


在java中子類例項是可以賦給父類宣告的,但是,如果是一個子類泛型的例項是不允許賦值給父類泛型的宣告的。

自己動手簡單測試了一下:

public class AnyType<T> {
}

上面一個簡單的泛型類

public
class 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>();
    }
}

但是這樣,就會報錯,實踐表明,果然是不允許這樣操作的