> 文章列表 > 计算机基础--Redis

计算机基础--Redis

想不想了解一下为什么 Redis 能让我们的系统跑得像闪电一样快?让我们来聊聊这个神奇的数据库!

首先,Redis 的数据类型可不止一种哦!字符串、哈希、列表、集合、有序集合,每一种都有它独特的应用场景。比如,用列表来实现消息队列,用有序集合来实现排行榜,简直不要太方便!

那 Redis 为什么这么快呢?秘密就在于它把数据都放在了内存里,操作都是内存级别的,比磁盘操作快多了。再加上它用的单线程模型,避免了多线程切换的开销,效率自然蹭蹭涨。不过,6.x 版本以后,Redis 也玩起了多线程,不过是在 IO 多路复用上搞事情,让网络传输更高效。这样既保留了单线程的简单,又充分利用了多核 CPU 的能力,真是个狡猾的家伙!

那么,之前为什么不搞多线程呢?因为 Redis 的短板不在 CPU,而在内存和网络,单线程反而更容易维护,还避免了多线程可能带来的各种坑,比如死锁什么的。不过,6.0 以后,Redis 看破了 IO 是性能瓶颈,多线程就是用来解决这个痛点的。这样既解决了 IO 瓶颈,又不改变核心的单线程模型,真是个聪明的妥协!

总之,Redis 的设计哲学就是简单高效,既能玩转内存,又能灵活应对多核世界的挑战,难怪它能成为缓存界的宠儿!

计算机基础--Redis

参考文献

  1. https://zhuanlan.zhihu.com/p/599663544

基础知识

1. Redis的数据类型及使用场景

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
计算机基础--Redis

2. Redis为什么快

  • Redis 是基于内存的,绝大部分请求都是纯粹的内存操作。
  • 数据结构以及底层编码方式,Redis 的数据结构是专门进行设计的,数据结构简单,对数据操作也简单。
  • 采用单线程 + IO 多路复用的模型。
    • 单线程避免了不必要的上下文切换和锁竞争
    • IO 多路复用模型,非阻塞 IO。
  • 底层模型不同,它们之间底层实现方式以及客户端之间的通信的应用协议不一样,redis 直接自己构建了 VM 机制。因为一般的系统调用,会浪费一定的时间去移动和请求(基本不用,享受纯内存操作)
  • 计算向数据移动,与 memcache 对比。(在 IO 上优化)
    • 移动数据成本大,移动计算成本小

3. Redis 是单线程还是多线程

无论什么版本,工作线程就是一个,但是在6.x 高版本出现了 IO 多线程

单线程,满足 redis 的串行原子,只不过 IO 多线程后,把 输入/输出 放到更多的线程里去并行。这样做的好处在于:

  • 执行时间缩短,更快
  • 更好地压榨系统及硬件地资源(网卡能够高效的使用)

简单概括,为什么使用多线程?
答:充分利用多核,提高网络吞吐

4. 那么Redis 6.0 之前为什么不使用多线程?

  • Redis 的性能瓶颈不在于 CPU,主要在于内存和网络
    • 如果吞吐量不能满足我们的需求,更推荐的做法是使用分片的方式将不同的请求交给不同的 Redis 服务器来处理,而不是在同一个 Redis 服务中引入大量的多线程操作
  • 单线程编程实现简单并且容易维护,方便开发和调试。并且使用单线程 + 文件事件处理器 也能并发的处理客户端的请求。
  • 多线程会存在死锁、上下文切换等问题,甚至会影响性能

5. 多线程有缺点,为什么又引入了多线程

虽然 Redis 中引入了多线程,但是 Redis 的多线程只是把网络 IO 这类耗时的操作放到多线程中执行,充分利用多核,提高网络吞吐,更好地压榨系统及硬件地资源(网卡能够高效的使用)。执行命令仍然是单线程顺序执行,不需要担心线程安全问题。

6. Redis多线程实现机制计算机基础--Redis