1、简述下 Redis (为什么要选用 Redis)

Redis 是一个开源的使用 C 语言编写、可基于内存、可持久化的 Key-Value 数据库,和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set--有序集合)和 hash(哈希类型)。

  • 优势在于 速度快、性能极高、可持久化,丰富的数据类型,支持数据的备份
  • Redis 与 Memcached 区别 (1)类型 Redis 是一个开源的内存数据结构存储系统,用作数据库,缓存和消息代理。 Memcached 是一个免费的开源高性能分布式内存对象缓存系统,它通过减少数据库负载来加速动态 Web 应用程序。 (2)数据结构 Redis 支持字符串,散列,列表,集合,有序集,位图,超级日志和空间索引。 Memcached 支持字符串和整数。 (3)执行速度 Memcached(多线程)的读写速度高于 Redis。 (4)复制 Memcached 不支持复制。 Redis 支持主从复制,允许从属 Redis 服务器称为主服务器的精确副本;来自任何 Redis 服务器的数据都可以复制到任意数量的从属服务器。 (5)密钥长度 Redis 的密钥长度最大为 2GB,而 Memcached 的密钥长度最大为 250 字节。 (6)线程 Redis 是单线程的。 Memcached 是多线程的。

2、为什么说 Redis 快或者性能高?

1、完全基于内存,数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O(1);

2、数据结构专门设计。比如 SDS 结构中字符串长度 len,压缩链表等;(可以引申到 redis 的8大数据结构)

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁/释放锁的操作,没有因为可能出现死锁而导致的性能消耗; (Redis 在处理客户端的请求时,包括获取(socket读)、解析、执行、内容返回(socket写)等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。但如果严格来讲从 Redis4.0 之后并不是单线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大 key 的删除等等。)

4、使用多路 I/O 复用模型,非阻塞 IO。多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉;当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

5、RESP(Redis 的序列化协议)协议,文本协议,解析迅速,虽然浪费流量,这是折中吧;

6、持久化采用了子线程进行磁盘操作。

3、简述下 Redis 单线程模型

Redis 基于 Reactor 模式来设计开发了一套高效的事件处理模型,即 Redis 中的文件事件处理器(file event handler)。由于文件事件处理器是单线程方式运行的,所以一般都说 Redis 是单线程。