Guava

面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场

此生再无相见时 提交于 2021-01-29 03:02:21
摘要: Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力;(2)区间查询很低效。如何对这两个限制进行优化呢?这就轮到本文介绍的主角,LSM树,出场了。 我们通过 append-only log 的数据结构,实现了一个具备高写入性能的key-value数据库。 append-only log 之所以有很高的写入性能,主要 得益于磁盘的顺序写入 。这可能违反了我们对磁盘的认知,因为在我们的印象中,写磁盘总是很慢。其实不然,准确地说应该是 随机写磁盘很慢 ,因为在写之前可能会进行多次寻址。如果只是顺序写磁盘,性能是非常的高,如下的一个ACM报告中显示,顺序写磁盘甚至比随机写内存的性能还要高! 举个例子,Kafka是一个高性能的消息队列,它的厉害之处就在于极致地利用磁盘的顺序写入性能,如果生产者和消费者的速率相当,消息甚至可以在操作系统的Page Cache层面就完成了传递。所以,以后别再认为写磁盘很慢了! append-only log 大幅提升了数据写入性能,但是随之而来的是,非常低的数据读取性能。针对这一点,我们采用Hash索引进行了优化,优化的效果也非常的显著。然而,Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力;(2)区间查询很低效。如何对这两个限制进行优化呢?这就轮到本文介绍的主角

Spring MVC mapping Guava Multimap

风格不统一 提交于 2021-01-28 19:07:19
问题 My controller can't map a Google Guava Multimap coming from the frontend. I send from my Javascript this object: {1:[true,false], 2:[false,true], ...}. If I use a standard java.util.Map<Long, List<Boolean>> everything works fine. But not with the Guava Multimap . Do I have to configure Spring to use some custom converter, or what is the problem? The controller is: @RequestMapping(path = "/myurl", method = RequestMethod.POST, produces = CotrollerKonstanten.JSON_UTF8) public long myMethod(

人人都能看懂的 6 种限流实现方案!(纯干货)

淺唱寂寞╮ 提交于 2021-01-27 21:14:13
为了上班方便,去年我把自己在北郊的房子租出去了,搬到了南郊,这样离我上班的地方就近了,它为我节约了很多的时间成本,我可以用它来做很多有意义的事,最起码不会因为堵车而闹心了,幸福感直线上升。 但即使这样,生活也有其他的烦恼。南郊的居住密度比较大,因此停车就成了头痛的事,我租的是路两边的非固定车位,每次只要下班回来,一定是没有车位停了,因此我只能和别人的车并排停着,但这样带来的问题是,我每天早上都要被挪车的电话给叫醒,心情自然就不用说了。 但后来几天,我就慢慢变聪明了,我头天晚上停车的时候,会找第二天限行的车并排停着,这样我第二天就不用挪车了,这真是限行给我带来的“巨大红利”啊。 而 车辆限行就是一种生活中很常见的限流策略 ,他除了给我带来了以上的好处之外,还给我们美好的生活环境带来了一丝改善,并且快速增长的私家车已经给我们的交通带来了巨大的“负担 ” ,如果再不限行,可能所有的车都要被堵在路上,这就是限流给我们的生活带来的巨大好处。 从生活回到程序中,假设一个系统只能为 10W 人提供服务,突然有一天因为某个热点事件,造成了系统短时间内的访问量迅速增加到了 50W,那么导致的直接结果是系统崩溃,任何人都不能用系统了, 显然只有少人数能用远比所有人都不能用更符合我们的预期,因此这个时候我们要使用「限流 」 了 。 限流分类 限流的实现方案有很多种,磊哥这里稍微理了一下, 限流的分类

Is a Guava Table thread safe when its backing maps are thread safe?

此生再无相见时 提交于 2021-01-26 19:24:55
问题 Will Guava's Tables.newCustomTable(Map, Supplier) method return thread safe tables when supplied with thread safe maps? For example: public static <R, C, V> Table<R, C, V> newConcurrentTable() { return Tables.newCustomTable( new ConcurrentHashMap<R, Map<C, V>>(), new Supplier<Map<C, V>>() { public Map<C, V> get() { return new ConcurrentHashMap<C, V>(); } }); } Does that code actually return concurrent tables? 回答1: From the doc: "If multiple threads access this table concurrently and one of

Is a Guava Table thread safe when its backing maps are thread safe?

大兔子大兔子 提交于 2021-01-26 19:24:18
问题 Will Guava's Tables.newCustomTable(Map, Supplier) method return thread safe tables when supplied with thread safe maps? For example: public static <R, C, V> Table<R, C, V> newConcurrentTable() { return Tables.newCustomTable( new ConcurrentHashMap<R, Map<C, V>>(), new Supplier<Map<C, V>>() { public Map<C, V> get() { return new ConcurrentHashMap<C, V>(); } }); } Does that code actually return concurrent tables? 回答1: From the doc: "If multiple threads access this table concurrently and one of

Is a Guava Table thread safe when its backing maps are thread safe?

梦想的初衷 提交于 2021-01-26 19:23:36
问题 Will Guava's Tables.newCustomTable(Map, Supplier) method return thread safe tables when supplied with thread safe maps? For example: public static <R, C, V> Table<R, C, V> newConcurrentTable() { return Tables.newCustomTable( new ConcurrentHashMap<R, Map<C, V>>(), new Supplier<Map<C, V>>() { public Map<C, V> get() { return new ConcurrentHashMap<C, V>(); } }); } Does that code actually return concurrent tables? 回答1: From the doc: "If multiple threads access this table concurrently and one of

Is a Guava Table thread safe when its backing maps are thread safe?

那年仲夏 提交于 2021-01-26 19:22:21
问题 Will Guava's Tables.newCustomTable(Map, Supplier) method return thread safe tables when supplied with thread safe maps? For example: public static <R, C, V> Table<R, C, V> newConcurrentTable() { return Tables.newCustomTable( new ConcurrentHashMap<R, Map<C, V>>(), new Supplier<Map<C, V>>() { public Map<C, V> get() { return new ConcurrentHashMap<C, V>(); } }); } Does that code actually return concurrent tables? 回答1: From the doc: "If multiple threads access this table concurrently and one of

人脸识别SpringBoot快递代取平台系统 珍贵的一次开发经验分享给大家

两盒软妹~` 提交于 2021-01-23 10:56:37
最近上海理工大学光电学院的拉吉研究生张逸风全家出了车祸,他妈妈住进了ICU脑袋也不好使了,他爹害也不好意思过世了,这孩子挺坚强的,媳妇被人绿了,自己也住进去了,他委托我帮他开发一个系统,帮他圆梦,因此我开始了如下的创作,帮大家快速入门开发,奥利给 相关技术栈 前端: Thymeleaf、Bootstrap、Ajax、JQuery 开发环境: IDEA 、SpringBoot 2.1、Maven 数据库与缓存 :MySQL 5.7、Redis、Guava Cache 三方服务 :阿里云云短信服务、支付宝支付(沙箱)、百度人脸识别 安全框架 :Spring Security 其他技术 :API 接口限速、二级缓存 主要功能 登陆与注册: 用户名密码、短信验证码、人脸识别登录、QQ登录 权限: 普通用户、配送员、后台管理员 普通用户 :下单支付、订单查询、意见反馈、订单评价 配送员 :接单、订单管理、意见反馈、订单评价 系统管理员 :用户管理、订单管理、反馈管理 核心代码解析 短信接口代码解析 public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException { // String accessKeyId =env

guava限流使用场景与源码分析

ⅰ亾dé卋堺 提交于 2021-01-23 00:25:51
我们首先讲一个场景,假如一个接口只能支持每秒5次访问速率,假如要实现这个功能要如何实现?通用的方法我们知道有计数器,漏斗,令牌桶等方法,本文主要介绍Guava如何是如何实现限流的 Guava是使用令牌桶算法来实现限流功能的,但也有自己的一些特点: 在每次有请求来获取token的时候,会同时添加令牌到令牌桶中,并不是通过异步任务固定速率添加令牌到令牌桶中,是一个惰性的方法。 超额信用消费,即用将来时间产生的令牌,来满足当前的请求,这样能应对一定的瞬间流量 可以带着这两个特点来继续阅读下文,首先看下Guava是如何使用的,简单代码如下(创建每秒5次的限流器): RateLimiter limiter = RateLimiter.create(5.0); //创建每秒一次的限流器 double timeWaited = limiter.acquire(); //获取令牌,返回值为获取令牌等待的时间 System.out.println("time waited: " + timeWaited); 上面的代码使用时很简单的,下面来剖析下代码实现,Guava 中的限流器有两种实现, SmoothBursty,顾名思义,该实现主要通过令牌桶方法实现,能够应对突发流量 SmoothWarmingUp,实现也是通过令牌桶方法,但在应对突发流量与流量整形中取了折中,能应对一定的突发流量

Swagger天天用,背后原理来一次深度解析

点点圈 提交于 2021-01-22 17:40:01
先说一说Springfox和Swagger的关系 Swagger 是一种规范。 springfox-swagger 是基于 Spring 生态系统的该规范的实现。 springfox-swagger-ui 是对 swagger-ui 的封装,使得其可以使用 Spring 的服务。 由于工作中遇到需要基于 Swagger Json 做一些处理,但 Swagger Json 的格式不是那么满足需求。 本文springfox-swagger版本号:2.6.0 本文从问题出发,探索涉及的源码。 GET 方法的参数对象 第一个问题,当方法是GET请求,但参数是一个自定义 Object,在展示时(生成的JSON)是不包括本 Object 描述的。所以,就要看看什么时候会生成这些 Model 的描述。 万事有始有终,SpringFox始就在:springfox.documentation.spring.web.plugins下的 DocumentationPluginsBootstrapper。 该类实现了 SmartLifecycle 接口,实现此接口且通过@Component注入到容器的bean, 容器初始化后会执行start()方法. @Component public class DocumentationPluginsBootstrapper implements