最近接触到了一些关于数据计时的功能,比如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>(); } }
但是这样,就会报错,实践表明,果然是不允许这样操作的