Redis - 走进分布式缓存的世界
1.什么是NoSQL?
在我们了解
Redis
之前,我们有一个不得不讲的概念,那就是NoSQL
。NoSQL
指的是非关系型的数据库。是不同于传统的关系数据库的数据库管理系统的统称。其两者最重要的区别是NoSQL
不使用SQL作为查询语言。NoSQL
数据存储可以不需要固定的表格模式并且是基于键值对的,可以想象成表中的主键和值的对应关系[KEY|VALUE]
。我们这里可看下非关系型数据库与关系型数据库主要有哪些区别。
区别 | NoSQL(非关系型数据库) | RDBMS(关系型数据) |
---|---|---|
存储方式 | 主要存储在内存中,可配置持久化策略 | 主要存储在磁盘中 |
数据结构 | 半结构化数据,数据结构较简单,没有声明性查询语言,查询功能有限 | 高度组织化结构化数据 ,结构化查询语言(SQL),支持复杂计算 |
特性 | 高性能、高可用性、可伸缩性 | 数据完整性、事务能力、安全性、可靠性高 |
通过上面简单的几点对比,我们大概可以知道
NoSQL
的优点就是扩展性高、使用成本低并且灵活、没有复杂的关系,但很多时候优点也是缺点,NoSQL
和RDBMS
的同时存在很好的说明了同类事物在不同使用场景下不同的设计理念,没有标准化、优先的查询能力、数据的安全性完整性较差等也都是NoSQL
的缺点。
2.什么是Redis?
Redis官网
Redis
是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持丰富的数据结构,如字符串(strings)、散列(hash)、 列表(lists)、 集合(sets)、 有序集合(sorted sets)等。它还支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。发展到目前Redis
远远不是一个简单的缓存,它还支持主从模式、读写分离、集群模式等丰富强大的功能。
3.Redis与其他NoSQL的区别
关系型数据库我们大家接触的都比较多,主要是
Mysql
和Oracle
。那么非关系型数据库其实选择性也很多,使用的比较多的主要是:Redis
、Memcached
、Mongodb
、Guava(loadingCache)
。这里我们来看一张比对图。
从图中我们可以看出在早期的时候Redis
的搜索量和关注度十分少,但是随着时间推移Redis
的势头却很凶猛,在最近几年也是达到了一个巅峰,在很多使用缓存的场景下Redis
也基本成为了主要选择。那么它的强势崛起并不是毫无道理的,我们这里选择Memcached
来和Redis
做一个对比来看看Redis
是如何在众多缓存技术中脱颖而出的。
作为同款功能的内存缓存产品,我们来分析下
Redis
和Memcached
各自的优势。
a.首先我们来看看内存管理机制
上的差异:
Memcached
默认使用Slab Allocation
机制来管理内存,主要设计思路是按照预先规定的大小, 将分配的内存分割成特定长度的块来存储数据,达到完全解决内存碎片问题的目的。
![]()
Redis
则是采用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,由于CPU内存是连续的,故会在一定程度上存在内存碎片。
![]()
b.内存管理机制了解后我们再来看看
数据持久化
方案:
Memcached
本身不支持内存数据的持久化,所有数据都以in-memory
形式存储在内存当中。Redis
本身支持数据的持久化。提供了两种不同的持久化方法将数据持久化到磁盘当中(RDB
、AOF
)。c.既然主要作为缓存使用,那数据时效性是一大特点,我们对比一下各自的
缓存数据过期策略
方案:
Memcached
在删除失效数据时采用的是消极方法,即Memcached
内部不会主动监视数据是否失效,而是在Get数据时才会检查其是否已经失效。Redis
提供定时删除、定期删除、惰性删除多种缓存失效策略以及LRU等算法,减少内存泄漏。d.最后我们看下主体也就是数据本身,
数据类型
:
Memcached
仅支持单一数据类型,[KEY,VALUE]。Redis
支持丰富的数据类型(String、Hash、List、Set、SortedSet)。经过这一系列的了解分析,对于
Redis
的强势崛起想必大家也不足为奇了。
4.Redis自身优缺点以及使用场景
通过之前的了解,我们对
Redis
应该都有了一个基本的认识,除此之外我们可以很简单地总结一下Redis
的优缺点。
优点
·:不存在Scheme约束,数据结构相对容易但数据类型丰富,抗压能力强,性能极高(宣称10万/qps).
缺点
:不存在索引、外键,数据类型不是十分完整,多条件查询需要通过集合内联(sinter,zinterstore) 和连接间接实现开发效率低,可维护性不佳。
上面我们对比了非关系型数据库与关系型数据库的区别,这里我们更详细来对比下具体的产品之间的区别。
Mysql | Memcached | Redis | |
---|---|---|---|
数据库类型 | 硬盘持久化 | 内存缓存 | 内存缓存+硬盘持久化 |
数据存储方式 | 库表类型存储 | 单一Key/Value类型存储 | 多种类型存储(字符串、列表、散列、集合、有序集合) |
特性 | 支持ACID、主从复制 | 高性能多线程 | 持久化、动态扩容、脚本执行、发布订阅、主从复制 |
在目前开发大环境下,Redis发展十分迅速,在很多场景的选择下也处于一个优先选择。
通过对Redis
种种特性的了解,我们应该大致可以知道它的使用场景。使用缓存的一个主要目的就是减轻应用服务器的压力,减少对数据库的访问以及对磁盘文件IO的读取,从而实现一个高性能高可用高拓展的应用程序。
这里我们可以举几个实际开发中的例子:
- 排行榜,这个功能想必大家都接触过,各种用户积分排行榜、活动积分排行榜、热度排行榜,其实都是可以通过
Redis
去实现的。- 抢红包,这个功能在国内的大环境下应该不存在没接触过的同学,从微信、支付宝推出抢红包起就一直围绕着我们的生活,抢红包的实现与
Redis
也有着密不可分的关系。- 秒杀,对于秒杀这个功能相信大家也不陌生,每逢双11、618以及各种平时的准点抢购都可能是使用我们的
Redis
去实现的。除了上面这些,还有各种各样的场景都使用了我们的
Redis
作为缓存或者中间件等其他功能。当然复杂的业务场景并不是只使用到了Redis
,例如上面的秒杀功能,真实的场景中可能还使用到了消息队列等其他的技术,技术都是基于现实场景才能体现它的价值,但是由此可以看出Redis
在当下的开发技术栈中占据着十分重要的地位。