大厂面试真题-如果使用guava limiter实现实例级别的缓存

news/2024/11/7 22:48:24/

Guava库中的RateLimiterCache是两个不同的组件,分别用于控制访问频率和实现缓存功能。RateLimiter用于流量控制,确保系统在处理请求时不会超过指定的速率,而Cache则用于存储数据以加快访问速度。

由于RateLimiter本身并不直接支持实现缓存功能,因此你无法直接使用RateLimiter来实现实例级的本地缓存。但是,你可以结合Guava的CacheRateLimiter来实现一个既具有缓存功能又受流量控制的系统。

以下是一个使用Guava的CacheRateLimiter来实现实例级本地缓存的示例:

import com.google.common.cache.Cache;  
import com.google.common.cache.CacheBuilder;  
import com.google.common.util.concurrent.RateLimiter;  import java.util.concurrent.TimeUnit;  public class CachedService {  // 创建一个缓存实例,设置缓存的最大容量为100,并且设置写入后5分钟过期  private Cache<String, String> cache = CacheBuilder.newBuilder()  .maximumSize(100)  .expireAfterWrite(5, TimeUnit.MINUTES)  .build();  // 创建一个RateLimiter实例,设置每秒允许2个请求  private RateLimiter rateLimiter = RateLimiter.create(2.0);  // 模拟从某个数据源获取数据的方法  private String fetchDataFromSource(String key) {  // 这里可以是数据库查询、HTTP请求等  return "Data for " + key;  }  // 获取数据的方法,首先尝试从缓存中获取,如果缓存中没有则通过RateLimiter控制后从数据源获取  public String getData(String key) {  // 尝试从缓存中获取数据  String cachedData = cache.getIfPresent(key);  if (cachedData != null) {  System.out.println("Cache hit for key: " + key);  return cachedData;  }  // 如果缓存中没有数据,则通过RateLimiter获取许可  rateLimiter.acquire(); // 这会阻塞当前线程直到获取到许可  // 尝试再次从缓存中获取数据(以防在获取许可期间有其他线程已经更新了缓存)  cachedData = cache.getIfPresent(key);  if (cachedData != null) {  return cachedData;  }  // 如果仍然没有数据,则从数据源获取  System.out.println("Fetching data from source for key: " + key);  String newData = fetchDataFromSource(key);  // 将新数据放入缓存中  cache.put(key, newData);  return newData;  }  public static void main(String[] args) {  CachedService service = new CachedService();  // 模拟多个线程同时访问数据  for (int i = 0; i < 10; i++) {  new Thread(() -> {  String key = "exampleKey";  String data = service.getData(key);  System.out.println("Thread " + Thread.currentThread().getId() + " got data: " + data);  }).start();  }  }  
}

在这个示例中,CachedService类有一个Cache实例用于存储数据,并且有一个RateLimiter实例用于控制对数据源的访问频率。getData方法首先尝试从缓存中获取数据,如果缓存中没有数据,则通过RateLimiter获取许可,然后再次检查缓存(因为可能在获取许可期间有其他线程已经更新了缓存),如果仍然没有数据,则从数据源获取并更新缓存

请注意,这个示例中的RateLimiter是全局的,意味着它会限制所有对getData方法的调用。如果你想要对每个不同的键或每个不同的实例有独立的流量控制,你需要为每个键或实例创建单独的RateLimiter实例。然而,这通常不是推荐的做法,因为它可能会增加复杂性和资源消耗。相反,你应该根据业务需求和系统架构来选择合适的流量控制策略。


http://www.ppmy.cn/news/1545180.html

相关文章

SpringBoot健身房管理:功能与优势分析

3系统分析 3.1可行性分析 通过对本健身房管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本健身房管理系统采用SSM框架&#xff0c;JAVA作为开发语言&a…

使用Visors2导航系统实现目标区域的精准TMS(经颅磁)个体化定位

前言 笔者在进行进行经颅磁刺激(TMS)研究时&#xff0c;想要将元分析得到的目标脑区&#xff08;MNI标准空间中&#xff09;精确定位到被试的个体化T1上&#xff08;原始空间&#xff09;。再基于visor2的TMS仿真导航系统进行干预&#xff0c;在这里分享一下如何基于ANTs配准工…

实验室小车学习使用记录

一、建立基于库函数的工程 在工程文件夹中新建Library文件夹 打开固件库的文件夹&#xff0c;打开Libraries, 主函数main.c中的程序&#xff1a; #include "stm32f10x.h" // Device header #include "delay.h" /*开关1&#xff1a;OF…

react->Antd->Table调整checkbox默认样式

checkbox默认不展示&#xff0c;hover此行时&#xff0c;出现checkbox,选中后不消失&#xff1a; hover前&#xff0c;设置透明边框&#xff1b; hover时&#xff0c;checkbox出现 选中后 代码块&#xff1a; .ant-checkbox {.ant-checkbox-inner {border: transparent;}}.ant…

2024年三个月自学网络安全(黑客技术)进阶手册。

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…

用环形数组实现队列(多种高级方法,由浅入深)

同普通数组实现的队列相比&#xff0c;普通数组的头结点和尾节点都是固定的&#xff0c;在进行移除的时候如果移除了一个节点&#xff0c;后面所有节点都需要进行移除操作&#xff0c;需要的时间复杂度更高 在环形数组中&#xff0c;确定了头尾指针的环形数组很好地解决了这一…

js下载excel示例demo

<Buttontype{"primary"}key"out"onClick{async ()>{const ExportJsonExcel require("js-export-excel");const datas selectedRowsState //确保勾到的数据是一个列表&#xff0c;列表中每个值是字典const option {};const dataTable […

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…