每秒高达1.6亿次操作的并发键值存储库 FASTER 诞生
FASTER
在过去十年中,云中的数据密集型应用程序和服务有了巨大的增长。数据在各种边设施(例如,设备,浏览器和服务器)上创建,并由云应用程序处理用来获得数据价值或做出决策。应用程序和服务可以处理收集的数据,也可以实时监控数据。这些应用程序通常是更新密集型的,并且涉及大量的状态,超出了适合主存储器的处理能力。但是,它们在其访问模式中显示出重要的时间局部性(时间局部性解释维基百科=>https://en.wikipedia.org/wiki/Locality_of_reference)。一种用于点运算的新的键值存储。FASTER将高速缓存优化的并发哈希索引与“混合日志”结合在一起:跨越主内存和存储的并发日志结构记录存储,并且支持内存中“热插拔”的快速就地更新。FASTER扩展了标准键值存储接口,以处理读取 - 修改 - 写入,blind 更新和基于CRDT的更新。实验表明,与当前广泛部署的存储库相比,FASTER在单台机器上实现了更高的吞吐量(每秒高达1.6亿次操作),并且当工作负载大小适合内存大小时,他的性能将远胜于纯内存数据结构的性能。
背景
微软研究团队于2018年6月份在SIGMOD 宣布了一项名为FASTER的新的key-value存储库。FASTER支持快速和频繁的数据查找。它还有助于解决在当今云时代的应用程序更新大量状态信息的问题。
让我们以物联网为一种场景。数十亿设备报告和更新状态,如每个设备的性能计数器。这将导致应用程序未充分利用机器上的存储库和网络等资源。他能更快地帮助解决此问题, 因为它利用这些应用程序中的时间位置来控制系统内存占用量。
根据微软的说法,“FASTER是一个单节点共享内存键值存储库”。键值存储是NoSQL数据库,它使用简单的键/值方法进行数据存储。它包含两项重要创新:
- 缓存友好,并发和latch-free (闩锁释放,解释链接:https://www.dbtan.com/2010/05/latch-free.html)的哈希索引。它维护日志中记录的逻辑指针。FASTER哈希索引是指向一个缓存行大小的 hash buckets数组,每个都有8字节的条目来保存哈希标签。它还包含指向存储记录的逻辑指针。。
- 一个新的并发和混合日志记录分配器。这有助于支持包括快速存储(例如云存储和SSD)和主存储器的索引。
是什么让FASTER与众不同?
传统的键值存储利用日志结构记录数据。但是,FASTER是不同的,因为它有一个混合日志,它结合了日志结构和读取副本更新(适用于外部存储)和就地更新(适用于性能更高的内存)。因此,位于存储器中的混合日志的头部使用读取 - 复制 - 更新,而主存储器中的混合日志尾部使用就地更新。内存中有一个位于这两个区域之间的只读区域。它为核心记录提供了另一个被复制回尾部的机会。这捕获了更新的临时位置,并允许在内存中自动的收集热记录。
因此,FASTER甚至能够超越英特尔TBB hash map等纯内存数据结构。微软表示,它的性能远远优于今天流行的诸如RocksDB和Redis等键值存储的缓存系统。
除此之外,FASTER还为故障恢复提供支持,因为它包含一个恢复策略,有助于将系统以低成本恢复到最近的一致状态。这与传统数据库系统中的恢复机制不同,因为它不涉及阻止或创建单独“预写的日志”。
有关更多信息,请查看官方研究报告。
FASTER项目Github地址:https://github.com/Microsoft/FASTER

价值:
有人会问,有了这个FASTER,既然他速度这样快是不是可以代替redis或者mongodb,答案是目前不能,因为FASTER是内核级的,和Google的leveldb差不多层级,FASTER速度非常快毋庸置疑,但是目前缺少更高复杂业务场景的支持,比如集群,数据一致性之类的商用需求,不过如此诱人的性能必定吸引更多的人去投入FASTER中开发出类似redis和mongodb的产品出来,性能也必定更强,说不定redis后期底层就用FASTER改写了。
每秒高达1.6亿次操作的并发键值存储库 FASTER 诞生的更多相关文章
- Redis中的键值过期操作
1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...
- Spark学习之键值对操作总结
键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...
- 键值对操作 上(Spark自学五)
键值对RDD是Spark中许多操作所需要的常见数据类型. “分区”是用来让我们控制键值对RDD在各节点上分布情况的高级特性.使用可控的分区方式把常在一起被访问的数据放在同一个节点上,可以大大减少应用的 ...
- spark入门(三)键值对操作
1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...
- 存储库-MongoDB简单的操作
简介: MongoDB是一款强大.灵活.且易于扩展的通用型数据库 1.易用性 MongoDB是一个面向文档的数据库,而不是关系型的数据库: 不采用关系型主要是为了可扩展性 2.易扩展性 存储在Mong ...
- redis键值操作
1.1. redis键值操作 1.1.1. keys patten 查询相应的key 可以精确的查,也可以模糊的查 1.1.1.1. 通配符:* ? [] 在redis里,模糊查询key的时候有3个通 ...
- Netty Redis 亿级流量 高并发 实战 (长文 修正版)
目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
随机推荐
- Oracle解锁scott用户
解决: (1)conn sys/sys as sysdba;//以DBA的身份登录 (2)alter user scott account unlock;// 然后解锁 (3)conn scott/t ...
- Java集合:List、Set和Map的区别,ArrayList和LinkedList有何区别..........
一.数组和集合的区别: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型): 集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! J ...
- js 3d图形
使用Three.js在网上中进行3D图形的展示 Three.js的官网https://threejs.org/ 第一个Demo,生成一个旋转的正方体 <style> canvas { wi ...
- c/c++链队列
链队列 链队列就是简化了的单链表 nodequeue.h #ifndef __NODEQUEUE__ #define __NODEQUEUE__ #include <stdio.h> #i ...
- Windows Server 2016-Windows Server Backup功能
一.Windows Server Backup 介绍: Windows Server Backup 是一种功能,它提供了一组向导和其他工具,大概从WinSer2008开始Win Ser Backup引 ...
- Python - 判断list是否为空
Python中判断list是否为空有以下两种方式: 方式一: list_temp = [] if len(list_temp): # 存在值即为真 else: # list_temp是空的 方式二: ...
- 如何解决make时报错crti. o: unrecognized relocation (0x2a) in section `.init
这个问题困扰了我好长时间,网上查了好长时间,这个问题的解决方法,就是将binultils升级到2.26. 造成这个问题的原因是gcc和binultils版本不匹配,gcc对应的版本较高,gcc编译后, ...
- es6的正则扩展笔记之修饰符
es6对于正则表达式添加了 u 修饰符和 y 修饰符. u 修饰符:含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符. 该修饰符不光会正确处理正则表达式,还会正确处 ...
- 【Teradata 】TD最大列数
1.一个表最大列数限制是多少? DB2,表最大列数1012,视图最大列数5000:一行最大长度32677Byte Teradata 表最大列数和视图最大列数2048,:16版本前,一行最大长度为64k ...
- Teradata 批量查找PI字段
select * from dbc.indicesv where indextype in ('P','Q');