博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Lambda表达式与回调函数简化缓存操作
阅读量:7062 次
发布时间:2019-06-28

本文共 1345 字,大约阅读时间需要 4 分钟。

1. 缓存操作流程

对一些写低频,读高频的数据操作我们经常需要用到缓存,通常的缓存操作流程如下:

7605774cdc0149f25aea844ae588a253.png

2. 通常的缓存处理方式

通常我们对上面流程的实现,伪代码如下:

public Object getObject(String key) {    //1. 尝试从缓存读取    Object obj = readFromCache(key);    //缓存命中直接返回    if (obj != null) {       return obj;    }    //2.如果缓存未命中,读数据库    obj = readFromDB();    //3. 回写入缓存,并返回    saveToCache(key,obj);    return obj;}

 

对于不同缓存的处理上面步骤1、3是重复的,步骤2是取决于缓存内容变化的,我们无法使用普通方法将上面的流程提取出一个工具函数,而不得不在每一次缓存操作时重复上面步骤1、3的代码。

3. 使用Lambda表达式与回调函数简化缓存操作

这种场景可以利用回调函数的方式将步骤2做为回调函数参数传入,即可将步骤1、3提取成一个工具函数消除这部分重复,并利用Lambda表达式将整个缓存操作简化到一行代码。

这里我使用jdk8自带的java.util.function.Supplier 类做为回调接口类(较低jdk版本的话也可以自己写一个类似接口),利用该类实现java的回调函数,在这个接口类函数实现中进行读DB操作。

利用回调函数方式完成的缓存操作工具类伪代码如下:

public Object getObjectUtil(String key, Supplier
supplier) { //1. 尝试从缓存读取 Object obj = readFromCache(key); if (obj == null) { //2.如果缓存未命中,调用回调函数读数据库 obj = supplier.get(); //3. 回写入缓存,并返回 saveToCache(key,obj); } return obj;}

 

通过上面的工具类,进行缓存操作时,我们只需要关心读DB的回调函数接口实现,不需要重复手动判断缓存是否存在等操作。

利用上面的工具类进行缓存操作伪代码如下:

public Object getObject() {   return getObjectUtil("key",new Supplier() {        @Override        public SerializeObject get() {             return readFromDB();        }   });}//使用Lambda表达式简化语法:public Object getObject() {   return getObjectUtil("key",() -> readFromDB());}

 

这样,利用Lambda表达式以及回调函数的方式,我们增加一个业务的缓存操作只需要一行代码即可实现。

 

转载地址:http://jtfll.baihongyu.com/

你可能感兴趣的文章
ibm服务器报警指示灯含意
查看>>
Nginx Location简单语法与配置
查看>>
嵌入式C语言自我修养 06:U-boot镜像自拷贝分析:section属性
查看>>
nginx反向代理和认证反向代理
查看>>
《破阵子·程序人生》
查看>>
迭代算法求平方根
查看>>
generatorConfig.xml for mariadb
查看>>
netstat命令
查看>>
超全超实用的Javascript类库和jQuery插件大全之一:Web印刷排版
查看>>
Android自定义控件CustomView2 扩展控件、组合控件
查看>>
独立 View Composer 的硬件要求
查看>>
修改登陆Jenkins后session过期的时间
查看>>
导入的maven项目添加maven依赖
查看>>
bash实现“多进程”(转)
查看>>
用nginx搭建http透明代理
查看>>
linux一切皆文件
查看>>
三层交换配路由不同(VLAN)6台PC之间通信(华为)
查看>>
2018.4.25 六周第一次课 (正则grep-过滤指定关键词)
查看>>
自动化运维系列之Ansible的简介与安装
查看>>
Python编写判断成绩的程序
查看>>