写在前面
前言
在Web应用初期,因为Web站点访问量不大,并发不高,交互次数也不多,所以使用的是像MySQL这样的关系型数据库(关系型数据库为网站带来了很多好处,主要是说Redis,这里就不赘述了)。但是随着网络的发展,站点的访问量激增,高并发等问题的出现,导致了站点的达到了瓶颈。这种瓶颈根本原因是使用了MySQL这样的关系型数据库。正所谓“成也萧何败也萧何”。众所周知,关系型数据库大部分数据都是存储在磁盘上的,而磁盘读写速度对于计算机来说是很慢的,所以就到这了瓶颈的出现。而随着技术的发展,大数据,云计算等对性能要求高,主要有下面4个需求:
- 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度;
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量;
- 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理;
- 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低。 正是这些需求催化了NoSQL数据库的产生。而Redis是现在运用最多的NoSQL数据库。(主角出场(^_^))
应用场景
-
排行榜,如果使用传统的关系型数据库来做,非常麻烦,而利用 Redis 的 SortSet 数据结构能够非常方便搞定;
-
计算器/限速器,利用 Redis 中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用 MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个 API 的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
-
好友关系,利用集合的一些命令,比如求交集、并集、差集等,可以方便搞定一些共同好友、共同爱好之类的功能;
-
简单消息队列,除了 Redis 自身的发布/订阅模式,我们也可以利用 List 来实现一个队列机制,比如到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的 DB 压力,完全可以用 List 来完成异步解耦;
-
Session 共享,以 PHP 为例,默认 Session 是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用 Redis 保存 Session 后,无论用户落在那台机器上都能够获取到对应的 Session 信息。
特性
Redis如此受欢迎必然有一些特性:
- 基于内存运行,性能高效;
- 支持分布式,理论上可以无限扩展;
- key-value存储系统;
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 相比其他数据库,Redis有以下特点:
- C/S通讯模型
- 单进程单线程模型(单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理)
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
选择Redis原因
Redis上面的很多应用场景也有其他解决方案。比如说缓存可以使用面试经常拿来和Redis作比较的Memcache;Session共享也可以使用MySQL数据库实现;消息队列可以使用RabbitMQ。那相比这些解决方案,Redis有哪些优势呢?
- 数据类型丰富,Redis有8种数据类型,最常用的5种:String、Hash、List、Set、 SortSet;
- 完全基于内存,性能高;
- 网络层使用epoll解决高并发问题;(单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理)
- 单进程单线程模型避免了不必要的上下文切换及竞争条件等。
- 提供的个性化功能:慢查询分析、性能测试、Pipeline、事务、Lua自定义命令、Bitmaps、HyperLogLog、发布/订阅、Geo 等个性化功能