为什么使用redis?

本文探讨了数据库的发展,引出为何选择Redis的原因。Redis作为一个远程内存数据库,以其高性能、复制特性、丰富的数据结构以及数据持久化等特点,常用于解决读写分离、数据缓存等问题。其内存存储、主从复制、数据结构多样性和发布/订阅模型等功能,使其在处理高并发、快速读写和数据管理上表现出色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我认为使用一样新的事物,首先需要了解为什么要使用它,使用它有什么好处,之后再去学习如何使用它。所以我想先从数据库的发展历程说起,从而引发出为什么要使用redis以及使用带来的好处,并不涉及到redis的具体使用方法。


一、数据库结构的变化

最初的传统数据库,存储与访问是集中在一起的。即,数据存在什么地方,就去什么地方访问。 集中模式的优点是数据稳定,生命周期长,可靠,强关系,缺点是空间扩展性有限。 集中模式的代表是关系数据库。


社会的进一步分化,使得IT系统也开始分化。 数据库也逐渐从关系数据库向不同领域不同层次分化。 网民的行为从最开始的只读模式,逐渐分化为读多写少的模式。 随着访问量提升,出现了IO密集型访问(此时主要是读取密集型),从而导致读取时间变慢。 为提升性能,发展了数据库缓存技术,主要是对数据库的读取操作进行分离。

而随着web2.0的进一步发展,网民的生产力进一步提升,存储总量开始增加。 此时虽然仍然是读多写少的模式,但写入量已经大大提升。 原有的缓存技术不能缓解写入压力,而且原有的空间也受硬盘限制,因此开始出现分库分表,实现读写分离。

集中模式的数据库就这样开始逐渐分化:由一个集中的、稳定的、强关系的结构,朝一个分化的、容错的、弱关系的结构发展。
 


数据的存储空间与数据访问时间也进一步分离。 即原来是数据存在什么地方,就去什么地方访问。现在是数据还是存在老地方(硬盘),但是访问却在另一个地方(比如内存,或另一个服务器)。其目的,就在于缩短IO路径或分离IO,实现高效访问。

存储空间的分化,导致写入的分化,实现空间换时间的效果。这种扩展分为两种模式:
如果横向分离(同一层次,空间分离),则可实现诸如主从复制、分库分表等效果,使得读写分离,IO提升。
如果纵向分离(不同层次,过程分离),则可实现数据库缓存、分布式缓存等效果,也能读写分离,IO提升。


二、什么是redis

Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-side sharding)等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。


此外,Redis是一个速度非常快的非关系数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片{![分片是一种将数据划分为多个部分的方法,对数据的划分可以基于键包含的ID、基于键的散列值,或者基于以上两者的某种组合。通过对数据进行分片,用户可以将数据存储到多台机器里面,也可以从多台机器里面获取数据,这种方法在解决某些问题时可以获得线性级别的性能提升。]}来扩展写性能。


三、为什么使用redis

内存式: Redis将键值存储在主存中,用于快速地读写访问。

复制: Redis支持主从复制。数据读取在slave完成,而数据写入在 master 完成。复制提供可伸缩性和可用性。任何一个slave宕机,其他的slave还可以提供数据访问。

数据结构: Redis不仅存储字符串,还支持列表,集合,哈希和有序集合。

虚拟内存: Redis使用RAM作为内存式存储。但是,在内存不足的情况下,它使用虚拟内存来保存数据。

发布/订阅模型: Redis支持创建发布和订阅通道,这样Redis客户端可以订阅任意的通道来进行数据消费,并且任何已订阅该通道的客户端可以发布数据。

数据持久性: Redis将内存中的数据定期保存到文件系统中。当Redis节点故障时,数据可以从Redis数据文件恢复。

有memcached使用经验的读者可能知道,用户只能用APPEND命令将数据添加到已有字符串的末尾。memcached的文档中声明,可以用APPEND命令来管理元素列表。这很好!用户可以将元素追加到一个字符串的末尾,并将那个字符串当作列表来使用。但随后如何删除这些元素呢?memcached采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、更新、写入(包括在一次数据库查询之后执行的memcached写入)等操作。相反地,Redis的LIST和SET允许用户直接添加或者删除元素。

使用Redis而不是memcached来解决问题,不仅可以让代码变得更简短、更易懂、更易维护,而且还可以使代码的运行速度更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他许多情况下,Redis的效率和易用性也比关系数据库要好得多。

数据库的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据(aggregates)。收集聚合数据的常见做法是:先将各个行插入一个报告表里面,之后再通过扫描这些行来收集聚合数据,并根据收集到的聚合数据来更新聚合表中已有的那些行。之所以使用插入行的方式来存储,是因为对于大部分数据库来说,插入行操作的执行速度非常快(插入行只会在硬盘文件末尾进行写入)。不过,对表里面的行进行更新却是一个速度相当慢的操作,因为这种更新除了会引起一次随机读(random read)之外,还可能会引起一次随机写(random write)。而在Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算聚合数据,并且因为Redis将数据存储在内存里面{![客观来讲,memcached也能用在这个简单的场景里,但使用Redis存储聚合数据有以下3个好处:首先,使用Redis可以将彼此相关的聚合数据放在同一个结构里面,这样访问聚合数据就会变得更为容易;其次,使用Redis可以将聚合数据放到有序集合里面,构建出一个实时的排行榜;最后,Redis的聚合数据可以是整数或者浮点数,而memcached的聚合数据只能是整数。]},而且发送给Redis的命令请求并不需要经过典型的查询分析器(parser)或者查询优化器(optimizer)进行处理,所以对Redis存储的数据执行随机写的速度总是非常迅速的。

使用 Redis 而不是关系数据库或者其他硬盘存储数据库,可以避免写入不必要的临时数据,也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能。虽然上面列举的都是一些简单的例子,但它们很好地证明了“工具会极大地改变人们解决问题的方式”这一点。


参考资料:

http://igoder.iteye.com/blog/1969848

http://geek.youkuaiyun.com/news/detail/64085

http://geek.youkuaiyun.com/news/detail/42161


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值