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

  • Hash可以用来存储复杂对象 。
  • List可以用来做消息队列、排行榜、计数器、最近访问记录等 。
  • Set可以用来做标签系统、好友关系、共同好友、排名系统、订阅关系等 。
  • Zset可以用来做排行榜、最近访问记录、计数器、好友关系等 。
  • Geo可以用来做位置服务、物流配送、电商推荐、游戏地图等 。
  • HyperLogLog可以用来做用户去重、网站UV统计、广告点击统计、分布式计算等 。
  • Bitmaps可以用来做在线用户数统计、黑白名单统计、布隆过滤器等 。
  • 4. 高效的数据结构Redis有6种数据结构sds(简单动态字符串)、ziplist(压缩列表)、linkedlist(链表)、intset(整数集合)、hashtable(字典)、skiplist(跳跃表) 。
    Redis的8种对象类型底层都是基于这5种数据结构实现的 , 丰富的数据结构可以减少内存占用和计算复杂度 , 提高数据操作的效率 。
    Redis为什么能抗住十万并发?揭秘性能优越的背后原因

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




    推荐阅读