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

简介: 1. 缓存操作流程 对一些写低频,读高频的数据操作我们经常需要用到缓存,通常的缓存操作流程如下: 2. 通常的缓存处理方式 通常我们对上面流程的实现,伪代码如下: public Object getObject(String key) { //1.

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<T> 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表达式以及回调函数的方式,我们增加一个业务的缓存操作只需要一行代码即可实现。

 

目录
相关文章
|
1月前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
|
3月前
|
存储 缓存 算法
数据结构与算法面试题:实现一个 LRU 缓存,支持如下操作:获取值、更新值、删除键值对和插入键值对
数据结构与算法面试题:实现一个 LRU 缓存,支持如下操作:获取值、更新值、删除键值对和插入键值对
28 0
|
4月前
|
存储 缓存 Java
java如何实现一个LRU(最近最少使用)缓存? 要求:设计一个LRU缓存,支持get和put操作。当缓存满时,需要淘汰最近最少使用的元素。要求使用双向链表+哈希表的数据结构来实现,并保证get和put操作的时间复杂度为O(1)。
java如何实现一个LRU(最近最少使用)缓存? 要求:设计一个LRU缓存,支持get和put操作。当缓存满时,需要淘汰最近最少使用的元素。要求使用双向链表+哈希表的数据结构来实现,并保证get和put操作的时间复杂度为O(1)。
28 1
|
canal 缓存 负载均衡
应用多级缓存模式支撑海量数据的读操作
应用多级缓存模式支撑海量数据的读操作
216 0
应用多级缓存模式支撑海量数据的读操作
|
存储 缓存 Java
【框架】[Hibernate]多表操作与缓存技术
【框架】[Hibernate]多表操作与缓存技术
123 0
|
canal 缓存 关系型数据库
高并发先操作数据库,还是先操作缓存?5 个方案告诉你!
在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,先操作数据库还是先操作缓存呢? 先思考一下,可能会存在哪些问题,再往下看。下面我分几种方案阐述。
高并发先操作数据库,还是先操作缓存?5 个方案告诉你!
|
缓存 数据库
究竟先操作缓存,还是数据库?
缓存存储,也是数据的冗余。
603 0
|
缓存 JavaScript Java
jquery 操作HTML data全局属性缓存的坑
jquery 操作HTML data全局属性缓存的坑data-* 全局属性 是一类被称为自定义数据属性的属性,它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力,并可以通过脚本(一般指JavaScript) 与 HTML 之间进行专有数据的交换。
916 0
|
NoSQL Java Redis
在Java中使用redisTemplate操作缓存
背景 在最近的项目中,有一个需求是对一个很大的数据库进行查询,数据量大概在几千万条。但同时对查询速度的要求也比较高。 这个数据库之前在没有使用Presto的情况下,使用的是Hive,使用Hive进行一个简单的查询,速度可能在几分钟。

热门文章

最新文章