Redis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用做数据库、缓存、消息中间件等。 它是一种NoSQL(not-only sql,泛指非关系型数据库)的数据库。
Redis是什么
Redis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用做数据库、缓存、消息中间件等。
它是一种NoSQL(not-only sql,泛指非关系型数据库)的数据库。
Redis作为一个内存数据库:
- 性能优秀,数据在内存中,读写速度非常快,支持并发10w QPS
- 单进程单线程,是线程安全的,采用IO多路复合机制
- 丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等
- 支持数据持久化,可以将内存中数据保存在磁盘中,重启时加载
- 主从复制,哨兵,高可用
- 可以用作分布式锁
- 可以作为消息中间件使用,支持发布订阅
Redis为何这么快,还是单线程
Redis确实是单进程单线程的模型,因为Redis完全是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。
既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章的采用单线程的方案了,毕竟采用多线程会有很多麻烦。
为什么单线程这么快:
- Redis是完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度是O(1)。
- 数据结构简单,对数据操作也简单
- 采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的CPU切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。
- 使用多路复用IO模型,非阻塞IO
Redis和Memcached的区别
- 存储方式上:Memcached会把数据全部存储在内存之中,断电之后会挂掉,数据不能超过内存大小。Redis有部分数据存在硬盘上,这样能保证数据的持久性。
- 数据支持类型上:Memcached对数据类型的支持简单,只支持简单的key-value,而Redis支持五种数据类型。
- 使用底层模型不同:它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
- Value的大小:Redis可以达到1GB,而Memached只有1MB。
淘汰策略
Redis有六种淘汰策略:
| 策略 | 描述 |
|---|---|
| volatile-lru | 从已设置过期时间的KV集合中有限对最近最好使用(less recently used)的数据淘汰 |
| volatile-ttl | 从已设置过期时间的KV集合中优先对剩余时间短(time to live)的数据淘汰 |
| volatile-random | 从已设置过期时间的KV集合中随机选择数据淘汰 |
| allkeys-lru | 从所有KV集合中优先对最近最少使用(less recently used)的数据淘汰 |
| allkeys-random | 从所有KV集合中随机选择数据淘汰 |
| noeviction | 不淘汰策略,若超过最大内存,返回错误信息 |
Redis 4.0加入了LFU(least frequently use)淘汰策略,包括volatile-lfu和allkeys-lfu,通过统计访问频率,将访问频率最少,即最不经常使用的KV淘汰
持久化机制
Redis为了保证效率,数据缓存在内存中,但是会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中,以保证数据的持久化。
Redis的持久化策略有两种:
- RDB:快照形式是直接把内存中的数据保存到一个dump的文件中,定时保存策略
- AOF:把所有的对Redis的服务器进行修改的命令都存到一个文件里,命令集合。
Redis默认是快照RDB的持久化方式。
当Redis重启的时候,它会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整,你甚至可以关闭持久化功能,让数据只在服务器运行时存。