本文主要是笔者学习redis的笔记, 为了更好的学习和理解, 主要分为高性能、高可靠以及高扩展三大板块来学习, 如下图:
高可用、高性能以及高扩展对于任何一个大型系统的设计来说都是必不可少的, 笔者希望自己不仅仅是学习redis基本原理, 更要通过对优秀的中间件思考, 能逐步沉淀自己设计大型系统架构的能力. 废话不多说了, 直接上菜,接下来为大家分享redis高性能.
任何系统设计都会有一些取舍, redis也不例外, 本文主要从redis的高性能中一些取舍做了一些小结, 采用的形式为QA方式, 具体如下:
高性能
Q: redis的高性能体现在哪些方面?
A:
- 基于内存读写. Redis 的大部分操作在内存上完成,再加上它采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。
- 采用单线程, 避免线程线程上线文切换引起资源消耗, 以及相比多线程而言, 单线程不需要对共享资源进行加锁处理, 避免多线程对共享资源竞争导致性能消耗;
- 采用非阻塞IO多路复用机制, 提交网络吞吐量;
Q: redis采用单线程的优缺点是什么?
A: 首先, 需要厘清一个事实, redis单线程, 主要是指redis的网络IO和键值对读写是由单个线程完成的, 这也是redis对外提供键值存储服务的主要流程. 但是redis的其他功能, 比如持久化、异步删除、集群数据同步等是由额外的线程执行的. 其次: redis真正影响性能的并不是get/set操作, 而是网络IO, 因此redis采用了IO多路复用机制.
单线程优缺点
优点:
- redis 基于内存操作, 并且采用了hash表和跳表等数据结构, 操作速度非常快;
- 避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- redis采用IO非阻塞的IO, 增加网络的吞吐量;
缺点:
主要包括两方面
- 任意一个请求在server中一旦发生耗时,都会影响整个server的性能,也就是说后面的请求都要等前面这个耗时请求处理完成,自己才能被处理到。耗时的操作包括以下几种:
- 操作bigKey: 写入一个bigkey在分配内存时需要消耗更多的时间,同样,删除bigkey释放内存同样会产生耗时;
- 大量key集中过期 : Redis的过期机制也是在主线程中执行的,大量key集中过期会导致处理一个请求