redis总结
redis的特性
- 单线程,避免线程切换和锁操作
- 高性能,单机并发量达到万级
- 支持集群模式
redis单线程高性能的原因
- 纯内存访问,内存的响应时间是100ns,redis并发达到每秒w级
- 非阻塞io,redis使用epoll作为多路复用的实现,redis基于epoll实现了自己的事件处理模型。将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
- 单线程避免了锁竞争和线程切换,以及线程创建。
- 单线程有利于高性能数据结构的实现。
redis单线程的问题
对于每个命令都是有执行时间的,如果某个命令执行时间过长,会造成其它命令阻塞,对高性能来说是致命的。
redis应用场景
- 消息队列系统,利用redis的发布订阅和阻塞功能
- 分布式锁,利用setnx或者lua脚本实现原子操作
- 缓存,分布式缓存,提高系统的响应速度
- 排行榜系统,使用redis的列表和有序集合
- 计数器应用
redis不适合的场景
- 从数据规模,过大的数据不适合放在redis中
- 从数据类型,分为冷数据和热数据(频繁操作的),reids存冷数据有些浪费资源
redis的基本数据类型
1. string
数据结构:自定义SDS,不是c语言字符串
用途:1.字符串存储,数字,二进制数据也可以,大小(512m以内)
2. hash表
数据结构:hash表,hash节点,字典
特性:
用途:存储对象,类似与一个map,
3. list
数据结构:自定义的双向链表,listNode,list
特性:元素是有序的,元素可以重复
用途:
4. set
数据结构:set
特性:元素是无序的,元素不可以重复
用途:
5. sortedset
数据结构:ziplist,skiplist,intset
特性:元素是有序的,元素不可以重复
用途:
redis事务处理
- watch
redis持久化策略
1. rdb
定时刷新内存,进行持久化。可以手动触发命令
2. aof,实时持久化,性能会降低一些。
aof持久化功能实现上分为追加,文件写入,文件同步三个步骤
redis使用lua脚本的优势?
redis的多路复用机制
快照的实现原理
redis内存优化策略
redis的集群模式
1. master-slave
主从复制的原理:
2. master-slave-sentinel
哨兵的原理:
3. redis-cluster
redis集群的原理:
增加节点:
删除节点:
其它集群方案
redis shardding
codis
twemproxy
参考《redis开发与运维》,《redis设计与实现》,两本书。