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

目录

🍸前言

🍻手写缓存服务

        (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,一经查实,立即删除!

相关文章

条件生成对抗网络(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;它…

手撕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 映射表

如何优雅地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

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…

tokio多任务绑定cpu(绑核)

tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢&#xff1f; 首先我们先写一段简单的多任务程序。 use tokio; use tokio::runtime; use core_affinity;fn tokio_sample() {let rt runtime::Builde…

【软考】UML中的关系

目录 1. 说明2. 依赖3. 关联4. 泛化5. 实现 1. 说明 1.UML中有4种关系&#xff1a;依赖、关联、泛化和实现2.这 4种关系是 UML,模型中可以包含的基本关系事物。它们也有变体&#xff0c;例如&#xff0c;依赖的变体有精化、跟踪、包含和延伸 2. 依赖 1.依赖(Dependency)。2.…

【InternLM实战营---第六节课笔记】

一、本期课程内容概述 本节课的主讲老师是【樊奇】。教学内容主要包括以下三个部分&#xff1a; 1.大模型智能体的背景及介绍 2. Lagent&AgentLego框架介绍 3.Lagent&AgentLego框架实战 二、学习收获 智能体出现的背景 智能体的引入旨在克服大模型在应对复杂、动态任…

【设计模式】使用中介者模式优化表单交互

我们想象一下机场的指挥塔&#xff0c;如果没有指挥塔的存在&#xff0c;每一架飞机要和方圆 100 公里内的所有飞机通信&#xff0c;才能确定航线以及飞行状况&#xff0c;后果是不可想象的。现实中的情况是&#xff0c;每架飞机都只需要和指挥塔通信。指挥塔作为调停者&#x…

93页 | 数据中台标准技术体系方案(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 数据中台标准技术体系方案 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT解决方案&#…

文件上传漏洞-白名单检测

如何确认是否是白名单检测 上传一张图片与上传一个自己构造的后缀&#xff0c;如果只能上传图片不能上传其它后缀文件&#xff0c;说明是白名单检测。 绕过技巧 可以利用 00 截断的方式进行绕过&#xff0c;包括 %00 截断与 0x00 截断。除此之外如果网站存在文件包含漏洞&…

ElasticSearch总结二

正向索引和倒排索引&#xff1a; 正向索引&#xff1a; 比方说我这里有一张数据库表&#xff0c;那我们知道对于数据库它一般情况下都会基于i d去创建一个索引&#xff0c;然后形成一个b树。 那么你根据i d进行检索的速度&#xff0c;就会非常的快&#xff0c;那么这种方式的…