问:memcache和Redis的区别?
memcache :
- 只支持简单的数据类型(key-value)
- 不支持数据持久化存储
- 不支持主从
- 不支持分片
Redis:
- 数据类型丰富(String、Hash、List、Set、Sorted Set)
- 支持数据磁盘持久化存储
- 支持主从
- 支持分片
问:为什么redis能这么快?10W+qps
- 完全基于内存,纯粹的内存操作效率高
- 数据结构简单,对数据操作简单。没有数据关联,存储结构就是hashmap 查找更快
- 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例来利用多核特性。(单线程是指主线程,其他也有用到子线程如持久化、周期性处理等。所有的读写请求都由一个线程串行处理,所以不会有并发问题,也避免了频繁的上下文切换和锁竞争,效率更高)
- 使用多路IO复用模型,非阻塞IO
Redis 采用的IO多路复用函数:epoll、kqueue、evport、select?
- 因为redis会在不同的平台运行会选择不同的多路复用函数,因地制宜。
- redis会在编译的时候优先选择时间复杂度为O(1)的IO多路复用函数作为底层实现(Solaries 10 中的 evport、linux的epoll、macos\FreeBSD的kqueue)这些函数都使用了内核内部的结构,并且能够服务几十万的文件描述符。
- 但是如果当前编译环境没有上述函数,就会选择 select 作为备选方案,由于其在使用时会扫描全部监听的描述符,所以其时间复杂度较差 O(n),并且只能同时服务 1024 个文件描述符,所以一般并不会以 select 作为第一方案使用。
- 基于react设计模式监听IO事件。实现文件事件处理器(每一个网络连接其实都对应一个文件描述符)文件事件处理器使用 I/O 多路复用模块同时监听多个 FD,当 accept、read、write 和 close 文件事件产生时,文件事件处理器就会回调 FD 绑定的事件处理器。 虽然整个文件事件处理器是在单线程上运行的,但是通过 I/O 多路复用模块的引入,实现了同时对多个 FD 读写的监控,提高了网络通信模型的性能,同时也可以保证整个 Redis 服务实现的简单