1. 定义
遵守BSD协议,高性能的key-value数据库
2. 特点
a. 内存数据库,支持数据的持久化;
b. 多种数据类型;
c. 支持数据的备份,master-slave模式的数据备份。
3. 优势
a. 性能极高(快);
i. 纯内存数据库;
ii. 使用非阻塞的IO多路复用机制;
iii. 采用单线程的模型, 保证了每个操作的原子性,减少了线程上下文切换;
iv. 使用hash结构,读取速度快;
v. 采用事件分离器。
使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
b. 丰富的数据类型;
i. String ,Hash,List,Set,sorted set ;
c. 原子
i. 操作的原子性,而且支持几个操作合并后的原子性执行;
d. 丰富的特性
i. 支持publish/subscibe,通知,key过期等特性。
4. 连接
命令: redis-cli -h host -p port -a password
测试是否成功: ping 返回结果为pong则成功
5. 数据类型:
字符串:最基本的类型,一个key对应一个value;一个键最大能存储512MB;
二进制安全的,redis的string可以包含任何数据,例如jpg图片或序列化的对象。
Hash(哈希):一个键值对集合;
hash是一个string类型的field和value的映射表,hash适合存储对象。
List(列表):列表是简单的字符串列表,按照插入顺序排序。可以在头或者尾部插入。一个列表最多可存储40多亿。
Set(集合): String类型的无序集合,集合是通过哈希表实现的,故添加、删除、查找的复杂度都是o(1)。不允许重复。 最多可存储40多亿
sadd 命令 : sadd key member key对应的set集合,member 要添加的元素 返回结果: 1 成功 0 已存在 错误 set不存在
smembers 命令: smembers key 遍历
Zset(sorted set : 有序集合): String类型的集合,不允许元素重复。
每个元素都会关联一个double类型的分数,redis是通过此分数来为集合中的成员进行从小到大的排序。(升序)
元素唯一,分数可以重复。
zadd 命令: zadd key score member ;如果元素已存在,则更新对应的score ;
zrangebyscore: zrangebyscore key 0 1000
6. 单线程设计的原因:
i. 因为redis是基于内存操作的,读写数据不涉及i/o操作;
1) cpu不是限制条件,它的瓶颈最可能是机器内存;
2) 网络宽带。
a) redis客户端执行命令包括:发送命令、命令排队、命令执行、返回结果;
b) 发送命令+返回结果这个过程称为**Round Trip Time**(往返时间) ;
c) redis的客户端和服务端可能在不同的服务器上,传输速度就和网络宽带有关了,一次请求的时间取决于网速。
d) 因此,一般都是就近部署。
ii. 脱离了锁的性能消耗
1) redis提供了丰富的数据结构,在列表、hash中添加、删除元素,就需要考虑安全的问题,锁的使用导致同步开销变大;
2) 单线程不存在加锁释放锁等,也不会出现死锁等。
iii. 采用单线程、多进程的集群
1) 多服务器集群,使用的是单线程还是多线程?
iv. cpu消耗的考虑
1) 采用单线程,避免不必要的上下文切换和竞争,也避免了多线程因为线程的轮流切换导致cpu的消耗;
2) cpu的闲置、限制的处理方法: 通过多进程,也就是多启动几个redis进程;(因为redis是key-value数据库,数据之间没有约束)
7. 单线程设计的评判:
a. 优势:
i. 处理逻辑清晰,不用考虑锁的各种处理,线程的轮流切换导致的性能问题。
b. 劣势:
i. 浪费多核服务器的性能。
8. IO多路复用技术:
a. redis采用网络I/O多路复用技术来保证多连接的时候,系统的高吞吐量;
b. redis是单进程,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以I/O操作在一般情况下不能直接返回,
这就导致了某一文件的I/O阻塞导致整个进程无法对其它客户提供服务。所以采用I/O多路复用;
c. 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
备注:
多线程一般在i/o操作的时候才使用。 磁盘i/o,网络i/o
因为i/o操作一般是可以分为两个阶段: 等待i/o准备就绪和真正操作i/o资源。
在磁盘上数据是分磁道、分簇存储的,而数据往往并不是连续排列在同一磁道上,所以磁头在读取数据时往往需要在磁道之间反复移动,因此这里就有一个寻道耗时!另外,盘面旋转将请求数据所在扇区移至读写头下方也是需要时间,这里还存在一个旋转耗时!"
"那么,在这一时间段(即"I/O等待")内,线程是在“阻塞”着等待磁盘,此时操作系统可以将那个空闲的CPU核心用于服务其他线程。因此在I/O操作的情况下,使用多线程,效率会更高
IO多路复用技术:
内核在发现某一个进程指定的一个或者多个IO条件准备读取,就会通知该进程,IO多路复用适合如下场景:
1) 当一个客户端在某一时刻同时处理多个套接口时,可能但很少出现;
2) 当客户端处理多个描述字时(一般指的是交互式输入和网络套接口),必须使用I/O复用
3) 如果一个tcp服务器在处理监听套接口的时候,又要处理已连接的套接口,正常情况下也需要用到I/O复用
4)如果一个服务器在处理Tcp的时候.又要处理UDP,正常情况下也需要使用I/O复用
5) 如果一个服务器要处理多个服务或多个协议,正常情况下也需要使用I/O复用。