6

Redis为什么能抗住10万并发?揭秘性能优越的背后原因

 1 year ago
source link: https://www.cnblogs.com/yidengjiagou/p/17312772.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
734446-20230413105657514-1633494789.png

1. Redis简介

Redis是一个开源的,基于内存的,高性能的键值型数据库。它支持多种数据结构,包含五种基本类型 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型 Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。

Redis还提供了多种特性,如持久化、事务、发布订阅、Lua脚本、管道、主从复制、哨兵机制、集群机制等,可以保证数据的安全性、一致性和可用性。

Redis的速度非常快,官方称其可以达到每秒10万次的读写操作。和其他数据库相比,Redis有着明显的优势。例如,和MySQL相比,Redis的速度大约快了100倍;和MongoDB相比,Redis的速度大约快了10倍。这些优势使得Redis成为了很多互联网公司和开发者的首选数据库。

那么,Redis为什么这么快呢?主要有以下几个原因:

  • 使用内存存储数据,避免了磁盘IO的开销,提高了数据访问的速度。
  • 丰富的对象类型,包含8种对象类型,满足不同场景的需求。
  • 高效的数据结构,减少了内存占用和计算复杂度,提高了数据操作的效率。
  • 单线程模型,避免了多线程之间的上下文切换和竞争条件,提升CPU利用率。
  • 非阻塞IO多路复用机制,充分利用CPU和网络资源,提高了并发处理能力。

本文将详细介绍Redis为什么这么快的原理和机制,并给出一些实际应用和优化建议。

2. 内存操作

Redis是一种基于内存的数据库,与传统的基于磁盘的数据库(例如MySQL)不同,它将所有的数据都存储在内存中。

那么,Redis为什么选择内存存储数据呢?主要有以下几个原因:

  1. 内存的速度远远快于磁盘。内存读写速度可以达到每秒数百GB,而磁盘读写速度通常只有数十MB,万倍的差距。
  2. 内存可以支持更多的数据结构和操作。常见的数据结构如数组、链表、树、哈希、集合等,常见的操作如排序、查找、过滤、聚合等。内存是一个灵活介质,满足各种复杂和高效的功能,不是磁盘操作可比的。
  3. 内存可以支持更高的并发和扩展性。内存是一种分布式和并行的存储介质,它可以支持多个CPU核心同时访问同一块内存区域,也可以支持多个服务器之间共享同一块内存区域。磁盘是一种集中式和串行的存储介质,它只能支持一个CPU核心或一个服务器访问同一块磁盘区域,也不能支持多个服务器之间共享同一块磁盘区域。

当然,Redis使用内存存储数据也有一些缺点和限制:

  1. 内存限制:内存是非常昂贵的,容量通常只有几十GB或几百GB,而磁盘目前都是TB起步。所以我们通常只会把少量的、经常访问的数据存储在内存中。
  2. 数据类型限制:Redis不支持复杂的数据结构,比如用户对象,通常只能序列化成字符串后再存储,查询的时候再把字符串反序列化成用户对象。
  3. 数据备份问题:在服务器重启或崩溃时,存储的内存中的数据可能会丢失。通常采用持久化技术将数据保存到磁盘上,同时定期备份数据以防止数据丢失。

3. 丰富的对象类型

Redis包含五种基本类型 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型 Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。

  1. String可以用来做缓存、计数器、限流、分布式锁、分布式Session等。
  2. Hash可以用来存储复杂对象。
  3. List可以用来做消息队列、排行榜、计数器、最近访问记录等。
  4. Set可以用来做标签系统、好友关系、共同好友、排名系统、订阅关系等。
  5. Zset可以用来做排行榜、最近访问记录、计数器、好友关系等。
  6. Geo可以用来做位置服务、物流配送、电商推荐、游戏地图等。
  7. HyperLogLog可以用来做用户去重、网站UV统计、广告点击统计、分布式计算等。
  8. Bitmaps可以用来做在线用户数统计、黑白名单统计、布隆过滤器等。

4. 高效的数据结构

Redis有6种数据结构sds(简单动态字符串)、ziplist(压缩列表)、linkedlist(链表)、intset(整数集合)、hashtable(字典)、skiplist(跳跃表)。

Redis的8种对象类型底层都是基于这5种数据结构实现的,丰富的数据结构可以减少内存占用和计算复杂度,提高数据操作的效率。

734446-20230413105657593-1384488206.png

5. 单线程模型

Redis使用单线程模型,这意味着它只使用一个CPU来处理所有请求。因此,Redis不需要考虑多线程之间的同步、锁、竞争等问题,也不需要花费时间和资源在多线程之间的上下文切换上。这使得Redis的设计和实现更简单,性能和效率更高。

那么,Redis为什么选择单线程模型呢?主要有以下几个原因:

  1. Redis性能瓶颈不在于CPU,而在于内存和网络。因为Redis使用内存存储数据,所以数据访问非常迅速,不会成为性能瓶颈。此外,Redis的数据操作大多数都是简单的键值对操作,不包含复杂计算和逻辑,因而CPU开销很小。相反,Redis的瓶颈在于内存的容量和网络的带宽,这些问题无法通过增加CPU核心来解决。
  2. Redis的单线程模型可以保证数据的一致性和原子性。由于Redis只有一个线程来处理所有的请求,所以不会出现多个线程同时修改同一个数据的情况,也不需要使用锁或事务来保证数据的一致性和原子性。
  3. Redis的单线程模型可以避免多线程编程的复杂性和难度。例如线程安全、死锁、内存泄漏、竞态条件等,降低了开发和维护的成本和风险。

6. 多路IO复用模型

Redis使用单线程模型来处理客户端的请求,但是它能够利用多路I/O复用技术来实现高并发和高吞吐量。

那么,什么是多路I/O复用模型?

多路I/O复用模型是指使用一个线程来监控多个文件描述符(fd)的读写状态,当某个fd准备好执行读或写操作时,就通知相应的事件处理器来处理。这样就避免了阻塞式I/O模型中,单个线程只能等待一个fd的问题,提高了I/O效率和利用率。

例如Linux系统中提供了多种多路I/O复用技术的实现方式,如select、poll、epoll等。

本文介绍了Redis为什么如此快的原因。

首先,Redis使用内存存储数据,避免了磁盘I/O的开销,提高了数据访问的速度。其次,Redis拥有丰富的对象类型,包含八种类型,满足不同的需求。此外,Redis采用了高效的数据结构,减少了内存占用和计算复杂度。Redis还使用单线程模型,避免了多线程之间的上下文切换和竞争条件,提升了CPU利用率。最后,Redis使用非阻塞I/O多路复用机制,充分利用CPU和网络资源,提高了并发处理能力。

我是「一灯架构」,如果本文对你有帮助,欢迎各位小伙伴点赞、评论和关注,感谢各位老铁,我们下期见

image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK