云服务器网:购买云服务器和VPS必上的网站!

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

到此这篇关于Redis不单单是缓存,或者……的文章就介绍到这了,更多相关Redis 缓存 内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!

本文来源:https://www.yuntue.com/post/236450.html | 云服务器网,转载请注明出处!

关于作者: yuntue

云服务器(www.yuntue.com)是一家专门做阿里云服务器代金券、腾讯云服务器优惠券的网站,这里你可以找到阿里云服务器腾讯云服务器等国内主流云服务器优惠价格,以及海外云服务器、vps主机等优惠信息,我们会为你提供性价比最高的云服务器和域名、数据库、CDN、免费邮箱等企业常用互联网资源。

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注