2019-06-27 缓存更新策略实践

前言

       缓存在计算机的世界中是一个非常宽泛的概念,因为处处是缓存的身影。操作系统可能缓存DNS的解析结果,浏览器可能缓存页面静态元素,用户访问的资源可能缓存在CDN中, CPU可能会缓存操作数所属的内存块,数据库的查询结果也可能是缓存好的。总之不管是在系统架构中的哪一层级,都有缓存的实现。所以,抛开具体应用谈缓存是没有意义的,那样过于空泛,但可以肯定的是,所有的缓存都是利用了数据的冗余提高性能,空间换时间,计算机的世界充斥着trade off。

       本博文基于项目中的实际应用整理而来,仅讨论在DB和业务代码之间的缓存服务,主要分析笔者经历的项目中,根据不同的业务,采用了哪些更新策略(注,不讨论缓存的替换策略,如LRU等)。


c compile

图片来源

阅读全文

2019-06-24 Java语法糖-条件编译

前言


       条件编译,顾名思义,就是有条件地对代码进行编译,对于一套源代码,不同条件可能会编译出不同的两套目标代码。 条件完全不同于if语句。if语句属于代码逻辑,不管哪个代码分支都会被编译。而条件编译只会编译满足条件的分支的代码。

       条件编译广泛存在于需要跨平台运行的程序里,在真正开始编译之前,预处理过程会把代码扫描一遍,进行初步转换,其中一项任务就是执行条件编译。 在C和C++中,由预处理命令实现条件编译。预处理命令由#开头,比如#ifdef:

//程序处于调试阶段,可以将调试日志打印出来 
#ifdef DEBUG

       因C\C++的编译会最终生成目标机器的可执行文件,可执行文件是与平台极其相关的,因此C\C++程序可能会出现同一份代码需要分别根据平台进行编译的情况。

c compile

图片来源

阅读全文

2019-06-21 Java语法糖-assert

       在谈断言之前,必须要谈谈2种编程方式:防御性编程与契约式编程。防御性编程来自于《代码大全》,契约式编程由伯特兰·迈耶于1986年提出。

       防御性编程强调不信任外部输入的参数,要对所有可能出现问题的数据加以判断,这种编程方式的代码中,通常存在大量重复的if语句。

       契约式编程强调系统内各组件必须按规定实现各自的逻辑,在组件交互的过程中不对参数进行校验,如果发现参数不符合要求,程序将立即终止执行。 现代编程语言通过断言的机制实现契约式编程,这种编程方式的代码比较简洁。

       然而在现今的软件开发过程中,不可能实现契约式编程:人员流动大、不愿意写文档、不愿意看文档、需求迭代快。 当然防御性编程也做的不好,否则就不会由bug了。甚至有时候某种做法属于防御性编程还是契约式编程都不清晰,比如使用注解式参数校验框架,看似属于契约式编程:代码简洁、快速失效。 而当反编译过后,实则大量基础if判断。

       防御性编程与契约式编程思想的出现,都算的上是软件开发思想的进步,而受制于当时的知识背景,难免在今天略显过时。就此结束讨论,进入正题。

阅读全文

2019-06-19 一种基于redis的登录态的设计与实现

1.前言


       本文浅析一种可行的、实现简单的登录态方案。登录态几乎是所有系统都要考虑的问题,旨在维护用户登录之后的状态。 “用户登录”这个功能已经发展很多年了,伴随着“用户登录”的演进,登录态的实现也在不断完善。从最简单的在url后加一个参数作为标记,到现在大型站点的SSO, 登录态方案从单应用单机到多应用集群,不断满足不同架构的需求,也不断满足安全方面的需求。

       由于用户登录功能和登录态涉及的面非常广,比如密码的传输和存储、session共享、SSO、网络安全、第三方授权登录等,笔者见识尚浅,无法进行全面分析, 故本文仅就“登录态在服务器端的维护”一点进行阐述,上述方面不在本文讨论范围之内。笔者使用的redis版本为2.8.19,spring-data-redis版本为2.1.9。


login cache


阅读全文

2019-06-13 Java语法糖-内部类

       Java中有5种内部类,公有静态内部类,私有静态内部类,公有内部类,私有内部类,匿名内部类。这里我们不谈各种内部类的使用场景,不对比优劣,仅从语法糖的角度学习Java是怎么实现内部类的。

1.静态内部类

       静态内部类的初始化,不依赖于外部类的实例,并且不能访问外部类的实例变量,不能调用外部类的实例方法。

公有静态内部类

       测试代码如下所示:

 
public class TestPubStaticInnerClass {
    private static int priStaticValue = 3;
    public static int pubStaticValue = 3;

    private static void priFOut() {

    }

    public static void pubFOut() {

    }

    public static class PubStaticInnerClass {
        private int fPubStaticInnerClass() {
            priFOut();
            pubFOut();
            return priStaticValue + pubStaticValue;
        }
    }

    public static void main(String[] args) {
        PubStaticInnerClass pubStaticInnerClass = new PubStaticInnerClass();
    }
}

阅读全文