Redis不单单是缓存,仍是……

你须要一个经典数据库吗?redis

一段时间以来,巨大数量的数据处理迫使全部的应用程序在数据库层前添加缓存策略。即便经典数据库进行了大量的下划线优化,仍然不能提供足够的速度和可用性。主要缘由在于数据存储越远,获取数据就越困难。另外一个缘由是由于数据库中的数据一般保存在磁盘中,而不是在内存。经典数据库倒是在内存上嵌入了缓存来优化,可是拥有一个专用的独立缓存也是一种很经常使用的策略。数据库

在解决访问数据库的性能问题,一般的解决方案是缓存。缓存并不新鲜,缓存其实是把常常访问的少许数据保存在离你更近的地方。咱们在处理器上有缓存,数据库中也有缓存,你甚至能够在本身的应用中编写缓存。缓存

但随着事情的发展,如今咱们有来高可用的分布式内存缓存,能够被不一样的实例同时使用。安全

缓存——Redis服务器

也许最流行的分布式内存数据存储是Redis,它不是缓存,但被看成缓存使用。 引用官方的描述以下:数据结构

Redis是一个开源的(BSD协议),内存中的数据结构存储,它能够用做数据库,缓存,消息代理。它支持的数据结构包括字符串,哈希,列表,集合,有序集合,位图,超级日志,具备半径查询和流的地理空间索引和流,Redis具备内置复制,Lua脚本,LRU驱逐,事务和不一样级别的磁盘持久化,并经过Redis哨兵和Redis集群自动分区。架构

Redis速度很快,它被认为是目前最快的数据存储之一。它对CPU缓存进行了优化,而且没有上下文切换。从一开始它就被设计成了内存数据库,这不只意味着将数据从磁盘移动到内存,它从一开始就针对性的优化了。分布式

因为Redis速度很是快,能够存储各类数据结构,所以它是分布式缓存的一个很好的备选。性能

由于做为缓存,Redis得到了很是高的人气。有一些缓存加载器库在使用Redis做为应用程序和数据库之间的缓存层。以Redisson地图加载器为例:优化

所以,使用分布式缓存能够极大的提升性能。可是代码和架构变得更复杂了。数据被复制到数据库和缓存中,咱们必须保持它们的数据同步。代码应该管理整个缓存策略,控制缓存失效,从新填充缓存,都是为了保持数据的一致性。咱们实现了更高的性能和可伸缩性,但引入了高风险的复杂性。

数据是重复的

你可能会问为何要在两个地方都保存数据?不能只保存Redis中的数据吗?若是这样作咱们能够减小代码的复杂性。但首先让咱们看看经典数据库的一下特色和优点,看看咱们是否能够直接使用Redis实现这些。

关系型数据库的优势 

传统来讲,缓存是不会长期保存数据的。咱们将数据保存在缓存中只是为了快速的访问,可是为了长时间的持久性,咱们一般使用一个中央数据库。

除了数据的持久性之外,关系型数据库提供了数据一致性等其余特色。使用关系型数据库,你能够定义数据间的关系,约束,复杂查询,构建它是为了保证多个相关表间的一致性。

它有一些重要的优点,即便NoSQL数据库很流行,关系型数据库也不会很快消失。

可是使用Redis做为缓存和关系型数据库搭配使用,增长了一层复杂性,由于你必须经过代码保持二者的数据同步。

考虑到你的缓存策略,你不得不构建一些复杂的代码在Redis和数据库间进行数据发送。不要误解个人意思,有时候你必须这么作。就像以前提到的,关系型数据库有它的优势,咱们不能把它扔掉。

可是咱们必须每次都这么作吗?若是不一样数据间不须要很是复杂的关系,而只存储一个键映射就足够了呢?咱们是否是能够不用关系型数据库了?

 Redis做为中央数据存储

 如前所述,关系型数据库的优势是一致性和持久性。若是咱们不须要数据之间的关系映射,那么它将只保留持久性。有不少NoSQL数据库提供键映射存储,但咱们能够直接使用Redis。

Redis持久化

Redis有两种持久化模型:RDB和AOF。

RDB在指定的时间间隔保存数据快照。它们很是适合快速恢复备份。RDB最大化了Redis的性能,由于父进程所作的惟一工做就是fork建立快照的子进程。

可是因为RDB在必定时间间隔执行计划,若是你没法承受丢失一些数据,那么这就不是一个好的选择。fork是一个高成本的操做,不能在每次数据变化都进行fork,所以可能会出现最近的数据没有被保存在快照中的状况。

AOF是一个不一样的持久化模型。它是由一个只能追加的文件组成,只在其中添加全部数据。它更持久,由于fsync策略一般比整个RDB更有计划性。因为该文件仅用于追加,所以数据是不可更改的。即便在最后一条数据没有彻底写完而出现断电,也能够很容易的从新断电前的构建状态。

可是它也有缺点。第一个是AOF文件一般比RDB更大。另外,若是fsync策略被调度的太频繁,举个例子,在每次写命令以后,那么性能会大打折扣。在默认状况下,fsync每秒运行一次。

你应该使用哪一个?

若是你想要一个相似Postgres提供的安全级别,你将不得不两种状况都使用。使用RDB可让你在重启后更快的恢复备份;使用AOF能够避免数据丢失。可是若是你能承受一些数据损失,那能够只使用RDB。记住,Redis会把它们合并成一个单一的持久化模型。

其余优点

 将来是属于字节寻址的

因为磁盘旋转在很长一段时间都是持久化单元,因此当前的大多数数据库仍然在适应磁盘的旋转方面进行优化。好比数据定位,以减小磁盘旋转滞后,甚至选择了专门的格式,将索引放在了盘片的特定部分。可是这些优化对于当前的技术,好比SSD,是没有意义的。Redis存储数据是为字节寻址优化的。将来是属于字节寻址的,而Redis已经在那里了。

可伸缩性和高可用性

Redis提供了不一样的方式来实现伸缩性和高可用性。

你能够在不一样的Redis节点上分割数据来实现水平的可扩展性。分片将减轻单个实例的负担,你将受益于多核和计算能力。可是你应该知道分片的局限性,由于不能支持多键操做和事务。

经过复制得到高可用性。主节点是同步复制的,能够免受节点故障,数据中心故障和Redis进程故障。若是主节点宕机,副节点将会取而代之。在不一样的AZ中也有一个副本,这将保护你免受灾难时间的影响,好比整个AZ失败。

若是你打算使用Redis企业集群,全部的这些对你都是抽象的,你将拥有分片和高可用性,而不须要额外的代码。你能够经过编码链接到一个Redis实例。

复杂数据结构

Redis不只能够处理字符串,还能够处理不一样的数据结构,如:二进制安全字符串,列表,集合,排序集合,位图,超级日志,流等等。这使得Redis不只是一个键值存储,更是一个完整的数据结构服务器。

不是银弹

一切听起来都很是棒,可是做为一个事实,没什么东西是银弹,Redis也不是。主要的缺点是全部的数据都应该装进内存中。这使Redis适合那些有足够内存进行存储的数据。若是没有,那就必须将数据拆分。可是你会失去一下保证,如事务,管道,或发布/订阅。

结论

在很长一段时间里,Redis被认为只是一个缓存。一个很是好的分布式缓存,但仍然只是一个应用程序和主数据库之间的缓存。正如你所看到的,Redis不只仅是一个缓存,它试图摆脱这个误解。Redis不是一个缓存,它是一个分布式数据存储。它能够以线程安全模式以使人难以置信的速度处理不一样的数据结构,并为数据持久性提供了不一样的机制。

考虑到全部这些,即便Redis被很是成功地用做缓存,它仍是能够作更多的事情。若是你不须要一些像关系数据和高存储的SQL属性,为何你要在应用程序中建立一个复杂的三层系统?Redis做为缓存和仍是数据库?在这些状况下,你能够只使用Redis做为主要的持久层。

欢迎关注个人公众号,若是你有喜欢的外文技术文章,能够经过公众号留言推荐给我。

原文连接:https://dzone.com/articles/redis-is-not-just-a-cache

相关文章
相关标签/搜索