都是事件驱动,NGINX的性能远高于Redis的原因:1、Nginx处理方式相对简单;2、Nginx的数据结构处理相对简单等。Nginx处理方式相对简单是指,Nginx处理静态文件,直接从硬盘读取并返回给客户端,比较简单。Redis存储复杂的数据结构,并且需要在内存中进行数据操作,实现复杂,性能受到挑战。
一、都是事件驱动,NGINX的性能远高于Redis的原因
1、Nginx处理方式相对简单:Nginx是一个静态文件服务器,通常运行在前端中间层,直接从硬盘中读取文件并返回给客户端。而Redis是一款内存数据库,需要在内存中进行数据操作,而且其支持多种数据结构,每种数据结构的实现方式也不尽相同,这导致Redis需要进行更多的数据计算和操作。
2、Nginx的数据结构处理相对简单:对于每种不同的数据结构需要使用不同的算法进行计算和操作,这也增加了其性能开销。
3、Nginx采用多进程&多线程的模型:Nginx采用了多进程和多线程的模型,可以同时处理多个请求,从而提高了并发性和吞吐量。而Redis主要采用单线程模型,虽然可以通过多个Redis实例组成集群来提高并发能力,但这样会增加管理和维护的难度。
4、Nginx采用C语言和Lua语言混合编写:Lua语言在字符串处理上相对于C语言更加高效,因此,在某些特定的场景下,Nginx可以利用Lua获得更好的性能表现。
5、Nginx具有更广泛的应用场景:Nginx被广泛用于Web服务器、反向代理、负载均衡等各种应用场景,并且可以快速响应大量的TCP/UDP连接请求。而Redis主要用于内存数据库和缓存,其应用场景相对较为有限。
二、Nginx简介
Nginx(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个类似BSD协议的许可证下发布。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占用内存少,具有强大的并发能力,事实上nginx的并发能力确实在同类型的网页服务器中表现较优。目前中国大陆使用nginx的网站用户包括新浪、网易、腾讯,另外知名的微网志Plurk也使用nginx。
Nginx特点:
- 更快:这表现在两个方面一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx 可以比其他 Web 服务器更快地响应请求。
- 高扩展性:Nginx 的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复 Bug 或进行升级时,可以专注于模块自身,无须在意其他。
- 高可靠性:高可靠性是我们选择 Nginx 的最基本条件,因为 Nginx 的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用 Nginx。Nginx 的高可靠性来自于其核心框架代码的优异设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在 1 个 worker 进程出错时可以快速 “拉起” 新的 worker 子进程提供服务。
- 低内存消耗:一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发连接的基础。
- 单机支持 10 万以上的并发连接:理论上,Nginx 支持的并发连接上限取决于内存,10 万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的。
- 热部署:master 管理进程与 worker 工作进程的分离设计,使得 Nginx 能够提供热部署功能,即可以在 7×24 小时不间断服务的前提下,升级 Nginx 的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
- 最自由的 BSD 许可协议:这是 Nginx 可以快速发展的强大动力。BSD 许可协议不只是允许用户免费使用 Nginx,它还允许用户在自己的项目中直接使用或修改 Nginx 源码,然后发布。这吸引了无数开发者继续为 Nginx 贡献自己的智慧。
三、Redis简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis的特点:
- 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
- 支持事务
Redis的优势:
- 性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型: Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子: Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
- 丰富的特性: Redis还支持 publish/subscribe, 通知, key 过期等等特性。
延伸阅读1:Redis与其他key-value存储的不同点
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。