关于数据计时和泛型的一点总结

最近接触到了一些关于数据计时的功能,比如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>();
    }
}

但是这样,就会报错,实践表明,果然是不允许这样操作的

 

posted @ 2020-10-26 13:26  无心大魔王  阅读(74)  评论(0编辑  收藏  举报