【缓存服务】⭐️自定义实现一个简易的数据缓存

目录

🍸前言

🍻手写缓存服务

        (1)缓存实体类

        (2)缓存工具类

        (3)测试缓存服务

🍷已有的缓存工具

🍹章末


🍸前言

        俗话说 有轮子不用 就是玩

        开个玩笑,通过手写缓存服务可以帮助我们更好的了解,缓存需要哪些东西,比如内存的持久化,还有支持缓存的数据自动过期清除。对于简单的数据缓存,可以自行编写一套缓存服务,缓存通常的使用如下:

🍻手写缓存服务

        (1)缓存实体类

        要实现缓存功能,首先要有对象接收数据,数据包含的基本内容有键值和过期时间等,代码如下:

import lombok.Data;/*** @author ben.huang*/
@Data
public class CacheEnity {/*** 缓存的key值*/private String key;/*** 缓存的value值*/private Object value;/*** 缓存的过期时间*/private Long expireTime;
}
        (2)缓存工具类

        接收数据的对象有了之后,需要有一个操作缓存的工具,包括存放数据,获取数据,删除数据,定期清理已过期缓存等操作,定期清理操作通过创建一个定时线程任务每隔一段时间查询筛除已过期的数据,工具类代码如下:

import java.time.Duration;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/*** @author ben.huang*/
public class CacheUtil {/*** 缓存容器*/private final static Map<String, CacheEnity> CACHE_MAP = new ConcurrentHashMap<>();private static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();/*** 存放缓存,过期时间为当前时间加上传入的过期时间** @param key* @param value* @param expireTime 过期时间(毫秒)*/public static void put(String key, Object value, long expireTime) {CacheEnity cacheEnity = new CacheEnity();cacheEnity.setKey(key);cacheEnity.setValue(value);if (expireTime > 0) {Long expire = System.currentTimeMillis() + Duration.ofSeconds(expireTime).toMillis();cacheEnity.setExpireTime(expire);}CACHE_MAP.put(key, cacheEnity);}/*** 默认永不过期的存放** @param key* @param value*/public static void put(String key, Object value) {put(key, value, 0);}/*** 缓存获取,没有则返回null** @param key* @return*/public static Object get(String key) {if (CACHE_MAP.containsKey(key)) {return CACHE_MAP.get(key).getValue();}return null;}/*** 删除缓存** @param key*/public static void remove(String key) {CACHE_MAP.remove(key);}/*** 定期清理操作,筛掉已过期的数据*/public static void clearCache() {//没有数据直接返回,提升性能if (CACHE_MAP.size() == 0) {return;}//过期时间不为空,并且已经过期CACHE_MAP.entrySet().removeIf(entry -> entry.getValue().getExpireTime() != null && entry.getValue().getExpireTime() <= System.currentTimeMillis());}//注册一个定时线程任务,服务启动1秒之后,每隔500毫秒执行一次清理方法static {executor.scheduleAtFixedRate(CacheUtil::clearCache, 1000, 500, TimeUnit.MILLISECONDS);}
}
        (3)测试缓存服务

         存放三个数据,第一个数据设置过期时间 3 秒,第二个数据过期时间设置 6 秒,第三个数据不设置过期时间,也就是永不过期,然后分多次时间查询,结果如下:

public class TestCache {public static void main(String[] args) {CacheUtil.put("user1","张山",3);CacheUtil.put("user2","李斯",6);CacheUtil.put("user3","汪芜");System.out.println("第一次查询 user1:"+CacheUtil.get("user1"));System.out.println("第一次查询 user2:"+CacheUtil.get("user2"));System.out.println("第一次查询 user3:"+CacheUtil.get("user3"));try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("\n第二次查询 user1:"+CacheUtil.get("user1"));System.out.println("第二次查询 user2:"+CacheUtil.get("user2"));System.out.println("第二次查询 user3:"+CacheUtil.get("user3"));try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("\n第三次查询 user1:"+CacheUtil.get("user1"));System.out.println("第三次查询 user2:"+CacheUtil.get("user2"));System.out.println("第三次查询 user3:"+CacheUtil.get("user3"));}
}

🍷已有的缓存工具

        缓存又分为本地缓存和分布式缓存,这里主要看本地缓存

        当你还在造轮子的时候,何不抬头看看,眼前已经停了一堆法拉犁了

        来看看都有哪些好用的工具

        🍧 1. 谷拉利 -----  基于 Guava Cache 实现本地缓存 (稍次之)   

  • 支持最大容量限制

  • 支持两种过期删除策略(插入时间和读取时间)

  • 支持简单的统计功能

  • 基于 LRU 算法实现

        🍫 2. 咖拉利 ---- 基于 Caffeine 实现本地缓存 (推荐使用)

        可以看作是 Guava Cache 的增强版,功能上两者类似,不同的是 Caffeine 采用了一种结合 LRU、LFU 优点的算法:W-TinyLFU,在性能上有明显的优越性。

        

        🍬 3. En拉利 ----  基于 Encache 实现本地缓存  (了解)

  • 支持多种缓存淘汰算法,包括 LRU、LFU 和 FIFO

  • 缓存支持堆内存储、堆外存储、磁盘存储(支持持久化)三种

  • 支持多种集群方案,解决数据共享问题

🍹章末

         文章到这里就结束了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebStorm 中调试 (Debug) JavaScript 文件(js)

WebStorm 中调试 (Debug) JavaScript 文件(js) 在 WebStorm 中调试 JavaScript 文件&#xff0c;您可以设置断点&#xff0c;启动调试会话&#xff0c;并使用浏览器中的开发者工具来查看变量和执行流程。以下是详细步骤&#xff1a; 设置断点 打开您的 JavaScript 文件。 在…

使用 vllm 本地部署 Llama3-8b-Instruct

使用 vllm 本地部署 Llama3-8b-Instruct 0. 引言1. 安装 vllm2. 本地部署 Llama3-8b-Instruct 0. 引言 此文章主要介绍使用 vllm 运行 Llama3-8b。 1. 安装 vllm 创建虚拟环境&#xff0c; conda create -n myvllm python3.11 -y conda activate myvllm安装 Ray 和 Vllm&am…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展&#xff0c;生成对抗网络&#xff08;GAN&#xff09;作为其中的一个重要分支&#xff0c;在图像生成、图像修复等领域展现出了强大的能力。其中&#xff0c;条件生成对抗网络&#xff08;cGAN&#xff09;通过引入条件变量来控制生成模型的输出&am…

Spring SpringBoot(详解)

1. Spring简介 1.1 Spring 核心设计思想 1.1.1 Spring 是什么&#xff1f; Spring 是包含了众多⼯具⽅法的 IoC 容器。Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;Spring ⽀持⼴泛的应⽤场景&#xff0c;它…

SIT3088E:3.0V~5.5V 供电,14Mbps 半双工 RS485/RS422 收发器

特点&#xff1a; 3.0V~5.5V 宽电源范围&#xff0c;半双工&#xff1b;  总线端口 ESD 保护能力 HBM 达到 15kV 以上&#xff1b;  总线容错耐压达到15V&#xff1b;  1/8 单位负载&#xff0c;允许最多 256 个器件连接到总线&#xff1b;  驱动器短路输出保护&…

手撕AVL树(map和set底层结构)(1)

troop主页 今日鸡汤&#xff1a;Action may out always bring happiness;but there is no happiness without action. 行动不一定能带来快乐&#xff0c;但不行动一定不行 C之路还很长 手撕AVL树 一 AVL树概念二 模拟实现AVL树2.1 AVL节点的定义 三 插入更新平衡因子&#xff0…

SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)

一、配置Java环境变量 在启动Kafka之前,你需要先正确配置好你的Java环境变量。可以在终端输入java -version检查java环境变量是否配置正确,在Mac上如何配置java环境变量,请读者自行网上搜索操作之,此处不赘叙。 二、下载安装Kafka 1、下载Kafka:Apache Kafka,这两个版本…

四川赢涟电子商务有限公司深耕抖音电商服务

在当今数字化、网络化高速发展的时代&#xff0c;电子商务行业异军突起&#xff0c;成为推动经济增长的重要力量。四川赢涟电子商务有限公司凭借其敏锐的市场洞察力和创新精神&#xff0c;专注于抖音电商服务&#xff0c;致力于为广大消费者提供便捷、高效、个性化的购物体验&a…

Paddle 1.8 与 Paddle 2.0 API 映射表

安装2.6的paddlepaddle之后总是报fluid的错误&#xff0c;查询得知这个接口已经弃用了&#xff0c;但是一直找不到替换接口&#xff0c;偶然查询报错信息的时候找到了映射表&#xff0c;转存一下。 Paddle 1.8 与 Paddle 2.0 API 映射表

Debian 12.5(代号 “Bookworm“)中安装中文支持

在 Debian 12.5&#xff08;代号 "Bookworm"&#xff09;中安装中文支持通常涉及以下几个步骤&#xff1a; 1. **选择语言**&#xff1a; 在安装过程中&#xff0c;安装程序会询问您选择界面语言&#xff0c;您可以选择中文。 2. **安装中文语言包**&#xff1a…

如何优雅地Spring事务编程

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 在开发中&#xff0c;有时候我们需要对 Spring 事务的生命周期进行监控&#xff0c;比如在事务提交、回滚或挂起时触发特定的逻辑处理。那么如何实现这种定制化操作呢&am…

直播报名 | 科技出海新势力,遥感+AI助力一带一路

遥感技术的出海之路顺畅吗&#xff1f; 国内外遥感应用的关注点相同吗&#xff1f; 目前珈和主要辐射哪些海外国家&#xff1f; … 上周数据赋农季第三期《科技出海&#xff0c;遥感AI赋能“一带一路”提升种植园规模效益》直播预告一出&#xff0c;小伙伴们纷纷来咨询珈和的海…

CentOS安装htop工具

启用 EPEL Repository 安装Htop 首先启用 EPEL Repository: yum -y install epel-release启用 EPEL Repository 后, 可以用 yum 直接安裝 Htop: 安装htop yum -y install htop安装成功 输入htop使用工具 htop安装glances工具 yum install glances

汉译英早操练-(十六)

hello大家好&#xff0c;又到了一周一度的汉译英早操练时间。今天是周三你感觉怎么样&#xff1f;什么&#xff1f;你不想学英语&#xff0c;来来来 操练起来&#xff0c;今天是一个小练习&#xff0c;讲西藏的一个小篇幅说明文&#xff0c;虽然老生常谈&#xff0c;但谁说简…

达梦(DM)数据库管理表

达梦DM数据库管理表 管理表管理表的准则表的存储空间上限表的存储位置 创建表创建普通表指定表的聚集索引查询建表更改表删除表清空表查看表定义查看表空间使用 表是数据库中数据存储的基本单元&#xff0c;是对用户数据进行读和操纵的逻辑实体&#xff0c;表由列和行组成&…

Vue的列表渲染和双向绑定(初学vue之v-for以及v-model)

目录 一、列表渲染&#xff08;v-for&#xff09;介绍&#xff1a; 1.概念 2.好处 3.作用 4.应用 5.用法 二、双向绑定&#xff08;v-model&#xff09;介绍&#xff1a; 1.概念 2.好处 3.作用 4.应用 5.用法 三、v-for和v-model具体用法 1.v-for的基本使用 2.v…

Springboot+Vue项目-基于Java+MySQL的企业客户管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

前端零代码开发实践:页面嵌套+逻辑连线0开发扩展组件,实现切换开关控制扇叶转动。能无代码封装扩展组件,有别于常规的web组态或低代码平台

前言&#xff1a; 官网:http://www.uiotos.net/ 什么是 UIOTOS&#xff1f; 这是一款拥有独创专利技术的前端零代码工具&#xff0c;专注于解决前端界面开发定制难题&#xff0c;原型即应用&#xff01;具有页面嵌套、属性继承、节点连线等全新特性&#xff0c;学习门槛低…

网络安全之SQL注入及防御(下篇)

目录 什么是SQL注入&#xff1f; 一&#xff0c;SQL注入会导致什么呢&#xff1f; 二&#xff0c;SQL注入思想与步骤 三&#xff0c;SQL注入的绕过 四&#xff0c;sqlmap工具的使用 五&#xff0c;sql注入的防御方法 总结 什么是SQL注入&#xff1f; SQL注入&#xff08;…

第二证券|股票做短线要关注什么?

在股市中短线交易因其快速的盈利时机而招引了众多投资者&#xff0c;但做短线想要挣钱也不是那么容易的。对于股票做短线要重视什么&#xff0c;第二证券下面就为我们具体介绍一下。 短线交易需重视&#xff1a; 1、商场短期趋势。短线投资者首先需要重视的是全体商场趋势&am…