> For the complete documentation index, see [llms.txt](https://rowkey-books.gitbook.io/pragmatic-java-engineer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rowkey-books.gitbook.io/pragmatic-java-engineer/chapter5-datastore.md).

# 第五章 数据存储

在应用程序中，很多数据，如用户的信息、商品的信息都是需要保存的。临时存储在内存中、写入到文件中、存储到数据库、存储到搜索引擎都是数据存储的方式。数据存储可以说是应用开发中处于最基础位置的组件。

对于数据存储中最为常用的数据库来说，可以从存储介质上分为：

* 内存数据库：数据主要存储在内存中，同时也可以将数据持久化存储到硬盘中。如Redis、H2DB的内存模式。对于这种数据库，由于内存成本昂贵，因此一定要做好存储的量化分析、容量预估，防止内存不足造成服务不可用。
* 硬盘数据库：数据存储在硬盘上的这种数据库是最为常见的。MySQL、Oracle、PostgreSQL、HBase、H2DB、SQLite等等都是硬盘数据库。此外，SSDB是基于SSD硬盘的KV数据库，支持的数据接口很丰富，是Redis的另外一个选择。

这里暂且抛开文件存储以及存储介质不谈，主要针对包括数据库在内的以下几种常用存储方式进行讲述：

* 关系型数据库： 关系型数据库是用的最普遍的数据库，也是在计算机课堂上讲的最多的一种数据库。典型的包括：MySQL、Oracle、PostgreSQL等。而目前已经出现了以Google Spanner和PingCAP的TiDB为代表的新型分布式关系数据库。
* 非关系型数据库：非关系型数据库是最近这些年兴起的数据库，区别于关系型数据，其并不遵循关系模型，因此使用场景和关系型数据库是不同的。以MongoDB、CouchDB、HBase为代表。
* 缓存系统：缓存是为了解决传统文件读写性能缓慢的问题而产生的主要以内存为存储介质的软件，一般是数据库的辅助部分，并不要求持久化存储。以Memcached、Redis为代表。
* 搜索引擎：为搜索场景而诞生的软件，一般是基于倒排索引实现，能够提供很好的搜索性能。以Solr、Elasticsearch为代表。

此外，Zookeeper也是目前经常被使用的数据存储组件，与前面的相比，其比较适合用于存储量较小的目录式配置存储。
