zoukankan      html  css  js  c++  java
  • 关于数据计时和泛型的一点总结

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

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

  • 相关阅读:
    signals系列之一——基本用法
    libevent系列之一——libevent介绍
    memcached完全剖析系列——一、memcached基础
    分布式算法一——一致性hash算法
    spring容器启动过程
    dubbo源码之四——服务发布二
    dubbo源码之四——dubbo服务发布
    dubbo源码之三——dubbo重构
    dubbo源码之三-模块依赖
    [模板](luogu P3387)縮點
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13878002.html
Copyright © 2011-2022 走看看