当前位置: 首页 > news >正文

光明做网站菏泽市建设局网站电话

光明做网站,菏泽市建设局网站电话,lol英雄介绍网站模板,wordpress文章页的宽度在我们的互联世界中#xff0c;我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利#xff0c;他们的表现就会很好#xff0c;每个人都会感到高兴。 但是太多次#xff0c;我们不得不使用延迟小于最佳延迟的 API。 当然#xff0c;答案是缓存该数据 。 但是我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利他们的表现就会很好每个人都会感到高兴。 但是太多次我们不得不使用延迟小于最佳延迟的 API。 当然答案是缓存该数据 。 但是您不知道何时过时的缓存是很危险的事情因此这不是一个适当的解决方案。 因此我们陷入困境。 我们需要习惯于等待页面加载或者投资一个非常好的微调器来招待用户等待数据。 还是……是吗 如果为一个较小的经过计算的折衷而又使用相同的缓慢生成器可以达到期望的性能该怎么办 我想每个人都听说过后写式缓存。 它是高速缓存的一种实现该高速缓存注册了将异步发生的写操作在对后台任务执行写操作的同时调用者可以自由地继续其业务。 如果我们将这个想法用于问题的阅读方面该怎么办。 让我们为慢速生产者提供一个后置缓存 。 合理警告 此技术仅适用于我们可以在有限数量的请求中提供过时的数据。 因此如果您可以接受您的数据将是“ 最终新鲜的 ”则可以应用此数据。 我将使用Spring Boot来构建我的应用程序。 可以在GitHub上访问所有提供的代码 https : //github.com/bulzanstefan/read-behind-presentation 。 在实施的不同阶段有3个分支。 代码示例仅包含相关的行以简化操作。 现状 分支机构现状 因此我们将从现状开始。 首先我们有一个缓慢的生产者它接收URL参数。 为了简化此过程我们的生产者将睡眠5秒钟然后返回一个时间戳当然这不是低变化数据的一个很好的示例但是出于我们的目的尽快检测到数据是有用的 。 public static final SimpleDateFormat SIMPLE_DATE_FORMAT new SimpleDateFormat( HH:mm:ss.SSS ); GetMapping String produce(RequestParam String name) throws InterruptedException { Thread. sleep (5000); return name : SIMPLE_DATE_FORMAT. format (new Date()); } 在消费者中我们只是致电生产者 //ConsumerController .java GetMapping public String consume(RequestParam(required false ) String name) { return producerClient.performRequest(ofNullable(name).orElse( default )); } //ProducerClient .java Component class ProducerClient { public String performRequest(String name) { return new RestTemplate().getForEntity( http://localhost:8888/producer?name {name} , String.class, name) .getBody(); } } 简单缓存 分支简单缓存 为了在Spring启用简单的缓存 我们需要添加以下内容 依赖org.springframework.boot:spring-boot-starter-cache 在application.properties中启用缓存 spring.cache.type simple 将EnableCaching注解添加到您的Spring Application主类 将Cacheable(cacheName)添加到要缓存的方法中 现在我们有一个简单的缓存表示。 这也适用于分布式缓存 但是在此示例中我们将坚持使用内存中的缓存。 使用者将缓存数据并且在第一次调用后等待时间消失了。 但是数据很快就会过时 没有人将其逐出。 我们可以做得更好 接听电话 分行硕士 我们需要做的下一件事是在发生呼叫时对其进行拦截而不管是否将其缓存。 为了做到这一点我们需要 创建一个自定义注释 ReadBehind 注册一个方面该方面将拦截以ReadBehind注释的方法调用 因此我们创建了注释并将其添加到performRequest方法 ReadBehind Cacheable(value CACHE_NAME, keyGenerator myKeyGenerator ) public String performRequest(String name) { 如您所见定义了一个CACHE_NAME常量。 如果需要动态设置缓存名称则可以使用CacheResolver和配置。 同样为了控制密钥结构我们需要定义一个密钥生成器。 Bean KeyGenerator myKeyGenerator() { return (target, method, params) - Stream.of(params) .map(String::valueOf) .collect(joining( - )); } 此外为了添加方面我们需要 将依赖项添加到org.springframework.boot:spring-boot-starter-aop 创建方面类 我们需要实现Ordered接口并为getOrder方法返回1。 即使在值已经存在于高速缓存中时高速缓存机制将抑制方法的调用方面也需要启动 Aspect Component public class ReadBehindAdvice implements Ordered { Before( annotation(ReadBehind) ) public Object cacheInvocation(JoinPoint joinPoint) { ... Override public int getOrder() { return 1; } 现在我们可以拦截所有对ReadBehind方法的调用。 记住电话 现在有了调用我们需要保存所有需要的数据以便能够从另一个线程调用它。 为此我们需要保留 被称为豆 参数调用 方法名称 Before( annotation(ReadBehind) ) public Object cacheInvocation(JoinPoint joinPoint) { invocations.addInvocation(new CachedInvocation(joinPoint)); return null; } public CachedInvocation(JoinPoint joinPoint) { targetBean joinPoint.getTarget(); arguments joinPoint.getArgs(); targetMethodName joinPoint.getSignature().getName(); } 我们将这些对象保留在另一个bean中 Component public class CachedInvocations { private final SetCachedInvocation invocations synchronizedSet(new HashSet()); public void addInvocation(CachedInvocation invocation) { invocations.add(invocation); } } 我们将调用保持在一个集合中并且我们有一个计划的工作以固定的速率处理这些调用这一事实将给我们带来一个很好的副作用即限制了对外部API的调用。 安排落后的工作 现在我们知道执行了哪些调用我们可以开始计划的作业以接听这些调用并刷新缓存中的数据 为了在Spring Framework中安排工作我们需要 在您的Spring应用程序类中添加注释EnableScheduling 使用Scheduled注释的方法创建作业类 Component RequiredArgsConstructor public class ReadBehindJob { private final CachedInvocations invocations; Scheduled(fixedDelay 10000) public void job() { invocations.nextInvocations() .forEach(this::refreshInvocation); } } 刷新缓存 现在我们已经收集了所有信息我们可以对后读线程进行真正的调用并更新缓存中的信息。 首先我们需要调用real方法 private Object execute(CachedInvocation invocation) { final MethodInvoker invoker new MethodInvoker(); invoker.setTargetObject(invocation.getTargetBean()); invoker.setArguments(invocation.getArguments()); invoker.setTargetMethod(invocation.getTargetMethodName()); try { invoker.prepare(); return invoker.invoke(); } catch (Exception e) { log.error( Error when trying to reload the cache entries , e); return null; } } 现在我们有了新数据我们需要更新缓存 首先 计算 缓存密钥 。 为此我们需要使用为缓存定义的密钥生成器。 现在我们拥有所有信息来更新缓存让我们获取缓存参考并更新值 private final CacheManager cacheManager; ... private void refreshForInvocation(CachedInvocation invocation) { var result execute(invocation); if (result ! null) { var cacheKey keyGenerator.generate(invocation.getTargetBean(), invocation.getTargetMethod(), invocation.getArguments()); var cache cacheManager.getCache(CACHE_NAME); cache.put(cacheKey, result); } } 至此我们完成了“隐藏式”想法的实施。 当然您仍然需要解决其他问题。 例如您可以执行此实现并立即在线程上触发调用。 这样可以确保在第一时间刷新缓存。 如果过时的时间是您的主要问题则应该这样做。 我喜欢调度程序因为它也可以作为一种限制机制 。 因此如果您一遍又一遍地进行相同的呼叫则后读调度程序会将这些呼叫折叠为一个呼叫 运行示例代码 先决条件已安装Java 11 下载或克隆代码https://github.com/bulzanstefan/read-behind-presentation 构建生产者 mvnw package or mvnw.bat package 运行生产者 java -jar target\producer.jar 构建使用者 mvnw package or mvnw.bat package 运行使用者 java -jar target\consumer.jar 访问生产者 http// localhost8888 / producername test 访问使用者 http// localhost8080 / consumername abc 使用者将在约15秒后10秒调度程序5 –新请求返回更新后的值但在首次呼叫后不应看到任何延迟 。 警告 就像我在本文开头所说的那样在实现read-behind时您应该注意一些事情。 另外如果您负担不起最终的一致性 请不要这样做 这适用于具有 低频变化 API的高频读取 如果API实现了某种ACL 则需要在缓存键中添加用于发出请求的用户名。 否则可能会发生非常糟糕的事情。 因此请仔细分析您的应用程序并仅在适当的地方使用此想法。 翻译自: https://www.javacodegeeks.com/2019/12/take-control-your-slow-producers-read-behind-cache.html
http://www.zqtcl.cn/news/721802/

相关文章:

  • 专业定制网站开发公司中堂东莞网站建设
  • 如何提交网站给百度建立类似淘宝的网站
  • 苏州企业建站公司网站建设属于广告费吗
  • 做网站找企业信息管理平台
  • 泉州企业制作网站网站建设竞价托管外包
  • 如何建立电子商务网站网站制作地点
  • 网站建设设计目的memcached wordpress
  • 潍坊作风建设年网站上海到北京火车时刻表查询
  • 网站建设 项目要求手机软件app
  • 什么是做网站wordpress 七牛视频
  • 家乡网站建设策划书angular做的网站
  • 土豆网网站开发源代码thinkphp5做的网站
  • lng企业自建站wordpress 分页 美化
  • 手机版网站如何做新闻类网站怎么做百度推广
  • 网站开发工程师 上海合肥网站到首页排名
  • 商城网站后续费用请人代做谷歌外贸网站
  • 汽车网站有哪些3d家装效果图制作软件
  • 荆门做网站公众号的公司网站百度不收录的原因
  • 专门做羽毛球的网站福州seo网站排名
  • 网站返回503的含义是门户网站开发合同
  • 自己做网站的成本要哪些东西wordpress模板如何管理系统
  • 做一般的网站要多久wordpress写文章页面无法显示
  • 人和兽做的网站视频汽车建设网站开发流程
  • 长春市建设工程造价管理协会网站厦门网站建设费用
  • 广东建设信息公开网站怎样策划一个营销型网站
  • 魔兽做图下载网站如何经营一个购物网站
  • 深圳做网站哪个平台好一级消防工程师考试题型
  • 网站婚礼服务态网站建设论文网站设计有限公司是干嘛的
  • 邯郸网站建设效果好广西做网站的公司
  • 网站logo上传营销型网站制作方案