完结
Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。
Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。
而内存数据库技术,几乎把整个数据库放进了内存中,相较于传统数据库使用的磁盘读写机制,内存具备更极致的读写速度,性能会比传统的磁盘数据库有数量级的提升。因此内存数据库通常被用于对性能要求较高的场景中。
1.内存技术的成熟
内存器件的容量密度在快速上升。最早期的内存和今天常见的内存条不同,是直接焊接在主板上的内存芯片,容量普遍在64KB以下。
-
1982年之后,随着80286芯片的推出,开始出现30线(Pin)256KB的SIMM内存条,被认为是内存领域的开山鼻祖;
-
在80年代末,386和486时代的PC向16位发展,出现了72线的SIMM内存,单条容量可达512KB-2MB;90年代初,EDODRAM开始盛行,单条容量在4MB-16MB;
-
在1995年,计算机系统进入图形界面时代,内存技术也发生了重要变革,支持64位的SDRAM成为一代经典,在性能上有极大提升,容量也达到了64MB;
-
随后的十几年,内存容量开始稳定地遵循摩尔定律翻倍,持续到2019年,DDR3内存的容量已经可以达到16GB。
-
如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/
内存器件的单位价格也在逐年快速下降。从1970年代至今,内存每兆字节的价格下降了近9个数量级,根据2019年最新的统计数据,平均花费3-5美元就可以购买到1GB的内存。内存容量的持续上涨以及价格的下降,使大量数据在内存中进行存储和操作成为可能。
2.内存技术的瓶颈与突破
过去几十年,计算机系统的存储体系结构被设计成如图2的金字塔形模型。这样的存储结构利用局部性原理尽量将热数据存储在靠近CPU的地方。在传统模式中,内存数据库的所有数据都保存在DRAM介质中。
虽然DRAM的价格已经大幅下降,但在海量数据存储的需求下,内存的成本依然是很大的问题;另外由于DRAM属于易失性介质,掉电后所有数据都会丢失,需要额外考虑数据持久化的方案,会极大的限制内存数据库的性能和使用场景。
针对DRAM现存的一些硬件瓶颈,业界已经研发出了持久型内存(PM,Persistent Memory),学术名为存储级内存(SCM,Storage ClassMemory),和DRAM一样,都是安装在机器主板的内存槽接口中。
参考图2,DDRDRAM及以上的易失性存储CPU可以通过load/store指令直接访问,而NANDSSD及以下的非易失性存储CPU无法直接访问,需要先加载到易失性存储中,可以看出DRAM与SSD之间存在巨大的性能鸿沟,在访问时延上出现了跳变。
而持久型内存位于DRAM与SSD之间,以load/store指令的方式访问并支持数据的持久化,也填补了DRAM与SSD在时延上存在的鸿沟。相比DRAM,持久型内存在性能上处于劣势,但容量和价格均占据优势;相比NANDSSD,持久型内存在性能上处于优势,但容量和价值处于劣势。
3.内存数据库的发展历程
内存数据库的发展主要经历了雏形期、理论成熟期、市场成长期及高速发展期四个阶段。
4.内存数据库的优势与挑战
内存数据库在提供高性能读写能力的同时,也存在由于器件导致的数据易失问题,需要在应用中引起注意。
1).优势:高性能读写
由于省去了磁盘I/O的开销,在数据访问的时延上内存型数据库可以达到传统关系型数据库无法达到的微秒级别,单机内存数据库的QPS也可以达到10万以上,配合上用户态协议栈、内存大页等技术之后,更是可以轻松达到几十万QPS的量级,这是传统的关系型数据库很难做到的。
2).挑战:内存数据易失
内存数据库当前主要使用DRAM作为存储介质,DRAM属于掉电易失性介质,为了保证数据的可靠性,内存数据库需要考虑持久化方案。现阶段主流的键值对内存数据库对于持久化的支持较为薄弱,持久化性能也不如传统数据库。
内存型数据库中克服掉电易失性来保障数据可靠性的方法主要是以下两种:
-
一是每次操作都进行数据持久化,这种方式势必会大幅降低内存数据库的性能;
-
二是按照一定的策略进行操作的持久化,这样可以达到一定程度的优化和缓解,但极端情况下数据丢失的情况仍不可避免。
-
如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/
现阶段新型的非易失性存储器件已经发布但尚未规模化商用。相信解决了存储易失性的难题后,内存数据库会具备更多的应用。
5.内存数据库的分类
主流的内存数据库可分为键值对内存数据库、关系型内存数据库以及其他数据库,用户可根据自身的业务需求选择适合自己的内存数据库类型。
1).键值对内存数据库
键值对(KV, Key-Value)内存数据库指的是一种以键值对为主要存储结构的内存数据库。键值对内存数据库通常按键进行数据存取操作,值通常支持各种数据类型,使用键值存储的数据模型相对简单,更适合要求性能高、计算简单的一些场景。键值对内存数据库的典型代表为 Redis、Memcached 和 Aerospike。
2).关系型内存数据库
关系型内存数据库是一种基于数据关系模型的内存数据库。关系型内存数据库将传统的关系型数据库表搬到内存中,支持通过 SQL语句的方式实现对内存数据的访问,在实现复杂分析功能的同时,提升数据访问速度。关系型内存数据库的典型代表软件为 Oracle TimesTen、SAP HANA、MemSQL 和 SQLite。
3).其他类型的内存数据库
除键值对内存数据库、关系型内存数据库之外,其他比较小众的内存数据库称为其他内存数据库,比如图内存数据库 RedisGraph 等。
6.内存数据库产品现状
DB-Engines Ranking 是公认较权威的数据库排行,我们选取了其中最为活跃的 10 款典型内存数据库进行对比。开源产品中,Redis 和 Memcached 是最受欢迎的两款键值对内存数据库;而 SQLite 是最受欢迎的关系型内存数据库。表中大部分的关系型内存数据库为商用数据库,其中热度最高的是 SAP HANA。
早在 1995 年就发布第一版的Oracle TimesTen 仍然在榜上活跃;2014 年新发布 Apache Ignite 兼容键值和关系型数据结构,热度正稳步攀升。事务支持方面,大部分的关系型内存数据库称可以支持 ACID,但都需要在性能上作出妥协。
7.内存数据库选型建议
最后
对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
再分享一波我的Java面试真题+视频学习详解+技能进阶书籍
G开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**