Guava

牛逼,手撸一个SpringBoot缓存系统!

依然范特西╮ 提交于 2020-12-26 07:58:13
来源:cnblogs.com/jeffwongishandso me 缓存是最直接有效提升系统性能的手段之一。个人认为用好用对缓存是优秀程序员的必备基本素质。 本文结合实际开发经验,从简单概念原理和代码入手,一步一步搭建一个简单的二级缓存系统。 一、通用缓存接口 1、缓存基础算法 FIFO(First In First Out) ,先进先出,和OS里的FIFO思路相同,如果一个数据最先进入缓存中,当缓存满的时候,应当把最先进入缓存的数据给移除掉。 LFU(Least Frequently Used) ,最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。 LRU(Least Recently Used) ,最近最少使用,如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据移除。 2、接口定义 简单定义缓存接口,大致可以抽象如下: package com.power.demo.cache.contract; import java.util.function. Function ; /** * 缓存提供者接口 **/ public interface CacheProviderService { /** * 查询缓存 * * @param key 缓存键

我设计了一个牛逼的本地缓存!

百般思念 提交于 2020-12-17 20:54:24
点击上方 java项目开发 , 选择 设为星标 优质文章,及时送达 -- 作者:ksfzhaohui http://dwz.win/Ws4 最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能;当然如果拿来和专门的缓存框架如ehcache来对比可能稍有差距;本文我们将来整理一下实现一个本地缓存都应该需要考虑哪些东西。 考虑点 考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面我们来详细的介绍每个考虑点,以及该如何去实现; 1.数据结构 首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据;或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构; 2.对象上限 因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据; 3.清除策略 上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略; 4.过期时间 除了使用清除策略,一般本地缓存也会有一个过期时间设置

教你设计一个超牛逼的本地缓存!

瘦欲@ 提交于 2020-12-17 20:54:03
点击上方“ 掌上编程 ”,选择“ 置顶或者星标 ” 优质文章第一时间送达! 来源:ksfzhaohui juejin.im/post/5dd942e15188257324096fe7 前言 考虑点 如何实现 总结 前言 最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能;当然如果拿来和专门的缓存框架如ehcache来对比可能稍有差距;本文我们将来整理一下实现一个本地缓存都应该需要考虑哪些东西。 考虑点 考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面我们来详细的介绍每个考虑点,以及该如何去实现; 1.数据结构 首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据;或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构; 2.对象上限 因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据; 3.清除策略 上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用

手把手教设计一个牛逼的Java本地缓存

瘦欲@ 提交于 2020-12-17 19:28:40
点击蓝色“ Java后端编程 ”关注我哟 加个“ 星标 ”,每天下午 17:33,干货推送! 来源: ksfzhaohui | http://dwz.win/Ws4 最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能;当然如果拿来和专门的缓存框架如ehcache来对比可能稍有差距;本文我们将来整理一下实现一个本地缓存都应该需要考虑哪些东西。 考虑点 考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面我们来详细的介绍每个考虑点,以及该如何去实现; 1.数据结构 首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据;或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构; 2.对象上限 因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据; 3.清除策略 上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略; 4.过期时间 除了使用清除策略

guava异步回调处理(ListeningExecutorService、MoreExecutors.listeningDecorator、ListenableFuture、 Futures)

廉价感情. 提交于 2020-12-16 15:10:07
1)Fabi.java package org.example.guavalistener; import java.util.Random; import java.util.concurrent.Callable; public class Fabi implements Callable<Integer> { private int n; public Fabi(int n) { this.n = n; } public int f(int nParam) { if (nParam <= 2) { return 1; } return f(nParam - 1) + f(nParam - 2); } @Override public Integer call() throws Exception { Thread.sleep(1000); // 模拟抛出异常,看看java能否捕捉到 int num = new Random().nextInt(); if (num % 2 == 0) { throw new RuntimeException("num:" + num); } return f(this.n); } } 2)FutureDemo.java package org.example.guavalistener; import com.google.common

微服务三大利器之限流

∥☆過路亽.° 提交于 2020-12-11 05:47:03
背景 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。缓存、降级和限流是保护微服务系统运行稳定性的三大利器。 缓存:提升系统访问速度和增大系统能处理的容量 降级:当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉 限流:解决服务雪崩,级联服务发生阻塞时,及时熔断,防止请求堆积消耗占用系统的线程、IO等资源,造成其他级联服务所在服务器的崩溃 这里我们主要说一下限流,限流的目的应当是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率就可以拒绝服务、等待、降级。 首先,我们需要去了解最基本的两种限流算法。 限流算法 漏桶算法 令牌桶算法 计算器算法 这里主要是提一下,详细了解限流算法请参考下面链接 https://www.cnblogs.com/hopeiscoming/p/12297528.html 限流框架 下面说一下现有流行的限流工具 guava Google的Guava工具包中就提供了一个限流工具类——RateLimiter。RateLimiter是基于“令牌通算法”来实现限流的。 hystrix hystrix主要是通过资源池以及信号量来限流,暂时能支持简单的限流 sentinel 限流比较主流的三种算法:漏桶,令牌桶,滑动窗口。而Sentinel采用的是最后一种,滑动窗口来实现限流的。当然sentinel不仅仅局限于限流

Should Guava Splitters/Joiners be created each time they are used?

倖福魔咒の 提交于 2020-12-10 06:52:18
问题 Guava contains utilities for splitting and joining Strings, but it requires the instantiation of a Splitter/Joiner object to do so. These are small objects that typically only contain the character(s) on which to split/join. Is it a good idea to maintain references to these objects in order to reuse them, or is it preferable to just create them whenever you need them and let them be garbage collected? For example, I could implement this method in the following two ways: String joinLines(List

Oracle JDK vs OpenJDK

╄→гoц情女王★ 提交于 2020-12-05 10:54:49
OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。 Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能,例如从JRockit移植改造而来的Java Flight Recorder。预计以后JRockit的MissionControl移植到HotSpot之后,也会以Oracle JDK专有、闭源的形式提供。 Oracle的项目发布经理Joe Darcy在OSCON 2011上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码(如下图,注意图中提示了两者共同代码的占比要远高于图形上看到的比例),所以我们编译的OpenJDK,基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。 OpenJDK和JDK区别 https://www.cnblogs.com/straybirds/p/8746532.html 在大多数LINUX发行版本里,内置或者通过软件源安装的JDK,都是安装的OpenJDK, 一

【Redis系列8】如何利用一个支持元素删除的布隆过滤器来解决缓存穿透问题

元气小坏坏 提交于 2020-12-02 16:04:29
如何利用一个支持元素删除的布隆过滤器来解决缓存穿透问题 前言 缓存雪崩 解决方案 缓存击穿 解决方案 缓存穿透 解决方案 布隆过滤器(Bloom Filter) 什么是布隆过滤器 位图(Bitmap) 哈希碰撞 布隆过滤器的2大特点 fpp 布隆过滤器的实现(Guava) 布隆过滤器的如何删除 带有计数器的布隆过滤器 总结 前言 在我们日常开发中,Redis使用场景最多的就是作为缓存和分布式锁等功能来使用,而其用作缓存最大的目的就是为了降低数据库访问。但是假如我们某些数据并不存在于Redis当中,那么请求还是会直接到达数据库,而一旦在同一时间大量缓存失效或者一个不存在缓存的请求被恶意访问,这些都会导致数据库压力骤增, 这就是本文要讲述的缓存穿透,缓存击穿和缓存雪崩的问题,而布隆过滤器正是缓存穿透的一种解决方案 。 缓存雪崩 缓存雪崩指的是Redis当中的大量缓存在同一时间全部失效,而假如恰巧这一段时间同时又有大量请求被发起,那么就会造成请求直接访问到数据库,可能会把数据库冲垮。 缓存雪崩一般形容的是缓存中没有而数据库中有的数据,而因为时间到期导致请求直达数据库。 解决方案 解决缓存雪崩的方法有很多: 1、加锁,保证单线程访问缓存。这样就不会有很多请求同时访问到数据库。 2、失效时间不要设置成一样。典型的就是初始化预热数据的时候

redis-分布式布隆过滤器(Bloom Filter)详解(初版)

随声附和 提交于 2020-11-23 19:38:59
redis-分布式布隆过滤器(Bloom Filter)详解(初版) 1 布隆过滤器(Bloom Filter)原理以及应用 假设现在有50亿个电话号码,现在有1万个电话号码,需要快速判断这些电话号码是否已经存在? 现在有3中途径 1 通过数据库查询,但是不能快速查询。 2 把电话号码预先放在一个集合中,如果用long类型存储的话,50亿 * 8字节 = 大于需要40GB(内存浪费或者严重不够) 3 使用redis的hyperloglog,但是准确度不高。 类似的问题: 垃圾邮件过滤 文字处理中的错误单词检测 网络爬虫重复URL检测 会员抽奖 判断一个元素在亿级数据中是否存在 缓存穿透 而布隆过滤器则可以解决上述问题 1 什么是布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了: 如果这些点有任何一个 0,则被检索元素一定不在; 如果都是 1,则被检索元素很可能在。