Redis是一种性能高的key-value数据库,它有以下几个优点:
运行于内存但可以持久化到磁盘中,重启时能够再次加载使用。
Redis还能提供List,set,sorted set,hash等数据储存结构。
支持数据备份 master-slave主从模式。
MySQL | Redis | |
类型 | 关系型数据库,严格ACID | NoSQL,不严格ACID |
功能 | 持久化数据到硬盘内,读取速度慢 | 使用频繁的数据存储在缓存中,速度快,运行效率高 |
运行原理 | 为了保证ACID牺牲了许多读写性能。 | 为了提高吞吐对数据库并不需要非常高的一致性,而是需要快速响应,因此不需要满足ACID。大缓存、分布式服务 |
CAP(consistency 一致性、Availability 可获得快速响应、Partition 分布性)通常是满足三者中的两个(CP、或AP)。
MongoDB | Redis | |
性能 | 高 | 高 |
操作性 | 类似RDB,查询方式便利 | key-value操作 |
内存和存储 | 大数据存储,依赖OS虚拟内存,镜像文件占用内存 | 增加虚拟内存特性,突破物理内存限制 |
数据持久化和回复 | MongoDB 1.8后 采用和MySQL类似的binlog方式支持持久化 | Redis依赖快照进行持久化,AOF提高可靠性但降低访问性能 |
一致性 | 不支持事务,靠客户端保证 | 支持事务,按照顺序执行 |
分析 | 内置数据分析功能 | 不支持 |
应用场景 | 海量数据,提升访问效率 | 小数据量,侧重性能 |
Redis数据类型:String(字符串、序列化数据)、Hash(键值对)、List(字符串列表,插入顺序排列)、Set(无序集合,增删查速度O(1))、Sorted Set(不允许元素重复,每个元素关联一个double分数作为排序依据)
Redis定时:Redis的服务器会处理两类事件,文件事件(服务器处理套接字)和时间事件(服务器处理定时操作)。
一个时间事件有三个属性:事件标识号 id,事件到达时间 when,时间事件处理器 timeProc,当时间事件到达后,服务器调用对应的处理器。时间事件会根据Proc的返回值确定是周期事件还是定时事件。
Redis 单线程保持高效的原因:
虽然是单线程处理,但是通过I/O多路复用来监听多个套接字,处理器实现了高性能的网络通信模型,也可以很好地与Redis服务器中其他单线程模块进行对接,保持了Redis内部单线程设计的简单。
Redis的数据淘汰策略:
no-eviction:不删除策略,达到最大内存限制时,如果还需要更多内存,则返回错误信息。
allkey-lru:从Key的哈希表(server.db[i].dict)中选取多个key,在选到的key中利用lru算法淘汰掉最少使用的数据;
allkey-random:从所有的key哈希表(server.db[i].dict)中随机挑选数据淘汰;
volatile-lru:从设置过期时间的哈希表(server.db[i].expires)中随机挑选多个key,在选到的key中使用lru淘汰最近最少使用的数据。
volatile-random:从设置过期时间的哈希表(server.db[i].expires)随机删除key;
volatile-ttl:从设置过期时间的哈希表(server.db[i].expires)中随机挑选多个key,然后在选到的key中选择剩余时间最短的数据淘汰;
Redis:Remote Dictionary Server,是一个Key-value类型的内存数据库,数据库加载与内存中操作,定期异步操作将数据库的数据写入磁盘,或者把修改操作写入追加的记录文件,并且实现了主从同步。支持存储的value多样,包括String、list、set、只是zset(有序集合)和hash(哈希类型),都支持push / pop / add / remove,取交集并集差集等,且都是原子性操作。
Redis的缺点是数据库的容量受物理内存限制,不能用于海量数据高性能读写,只适合数据量较小的高性能运算。