本片主要借鉴于《Redis的开发与运维》
1、什么是Redis
Redis是一种基于键值对(Key-Value)的非结构数据库。它与其他键值对数据库的区别在于,Redis中的值可以是由String, Hash, listm set, zset, Bitmaps, HypeLoglog, GEO 等多种数据结构和算法组成。
每种数据结构和算法,都有相应的应用场景,所以Redis可以在多种生活场景中使用,或者说,Redis可以满足多种生活场景。而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。同时,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,实现数据的持久化,这样的话,如果发生了类似断电或者机器故障的时候,内存中的数据就不会“丢失”了。除此之外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。
2、Redis特性
2.1、速度快
正常情况下,Redis执行命令的速度非常快,官方给出的数据是读写性能可以达到10万/秒,当然这也取决于机器的性能。在不考虑性能的情况下,Redis速度快的原因可以大致归纳为以下几点:
- Redis中的所有数据是存放在内存中的,具体为什么说数据放在内存中速度就快,可以浏览下表。
层级 | 速度 | 层级含义 |
---|---|---|
L1 cache reference | 0.5ns | 读取CPU的一级缓存 |
Branch mispredict | 5ns | 转移、分支预测 |
L2 cache reference | 7ns | 读取CPU的二级缓存 |
Mutex lock/unlock | 25ns | 互斥锁\解锁 |
Main memory reference | 100ns | 读取内存数据 |
Compress 1K bytes with Zippy | 3000ns | 1k字节压缩 |
Send 2K bytes over 1 Gbps network | 20000ns | 在1Gbps的网络上发送2k字节 |
Read 1 MB sequentially from memory | 250000ns | 从内存顺序读取1MB |
Round trip within same datacenter | 500000ns | 从一个数据中心往返一次 |
Disk seek | 10000000ns | 磁盘搜索 |
Read 1 MB sequentially from network | 10000000ns | 从网络上顺序读取1兆的数据 |
Read 1 MB sequentially from disk | 20000000ns | 从磁盘里面读出1MB |
Send packet CA->Netherlands->CA | 150000000ns | 一个包的一次远程访问 |
- Redis是用C语言实现得,一般来说C语言实现的程序“距离”操作系统更近,所以速度相对较快。
- Redis使用了单线程架构,预防了多线程可能产生的竞争问题。
2.2、基于键值对的数据结构服务器
几乎所有的编程语言都提供了类似字典的功能,如Python中dict,Java中map等这种组织数据的方式就叫做基于键值的方式。然而与很多键值对数据库不同的是,Redis中的值不单单可以是String,还可以是具体的数据结构,它提供了字符串、哈希、列表、集合、有序集合,同时在字符串的基础上有演变出位图、HyperLoglog这两种数据结构,并且随着基于定位服务的产生,Redis3.2中有加入了GEO的功能,这使得Redis可以应用于多种应用场景,同时也能够因此提高开发效率。
相关命令与数据结构介绍可前往网站Redis 的使用
2.3、丰富的功能
除了数据结构,Redis还提供了许多额外的功能:
- 键过期的功能,可以用来实现缓存。
- 发布订阅的功能,可以用来实现消息系统。
- 支持Lua脚本功能,可以利用Lua创造出新的Redis命令。
- 提供了简单的事物功能,能在一定程度上保证事物的特性。
- 提供了流水线功能,这样客户能将一批命令一次性传到Redis,减少了网络开销。
2.4、简单稳定
Redis的简单功能主要表现在三个方面:
- 首先,是Redis的源码很少,早期版本只有2w, 3.0版本后由于添加了集群功能,代码增至5w行左右,普通的开发和运维人员完全可以“吃透”它。
- 其次,Redis使用单线程模型,这样不仅能使得Redis服务端处理模型变得简单,也能使得客户端开发变得简单。
- 最后,Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库),Redis自己实现了事件处理的相关功能。
2.5、客户端语言多
Redis提供了几乎涵盖了主流的编程语言,如Java、PHP、Python、C、C++、Nodejs等。
2.6、持久化
Redis提供了两种持久化方式:RDB,AOF。具体持久化流程详情:
2.7、主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。
2.8、高可用和分布式
Redis从2.8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。从3.0版本正式提供了分布式时间线Redis Cluster。它是真正的分布式实现,提供了高可用、读写和容器扩展性。