Redis简介
一. Redis是什么?
1. Redis 开发背景
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis.不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天.
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体.Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis.国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户.
VMware公司从2010年开始赞助Redis的开发,Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis.
2. Redis 概述
Redis:REmote DIctionary Server(远程字典服务器),它是一个完全开源免费且遵守BSD协议,用C语言开发的,高性能key-value型分布式内存数据库,它是基于内存运行并支持持久化的NoSQL数据库.可用于缓存,事件发布或订阅,高速队列等场景.该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化.Redis是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器.
二. Redis应用场景有哪些?
1. 应用场景概述
目前全球最大的Redis用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行Redis,有4G+的数据在Redis上来为微博用户提供服务.
- 1️⃣.缓存(数据查询、短连接、新闻内容、商品内容等等,最常用);
- 2️⃣.消息队列,任务队列(秒杀、抢购、12306 等)等队列;
- 3️⃣.获取最新的N个数据(取最新文档、排行榜等);
- 4️⃣.计数器应用,网站访问统计等;
- 5️⃣.发布/订阅消息(消息通知);
- 6️⃣.数据过期处理(可以精确到毫秒),优惠券/红包等;
- 7️⃣.商品列表,评论列表,聊天室好友列表等实时性要求较高的场景;
- 8️⃣.分布式集群架构中的 session 分离;
- 9️⃣.应用排行榜.
2. 应用场景详解
1️⃣.会话缓存(Session Cache)
最常用的一种使用Redis的情景是会话缓存(session cache).用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化.
2️⃣.消息队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用.Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作.
3️⃣.排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好.集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis正好提供了这两种数据结构.
5️⃣.发布/订阅
Redis的发布/订阅的使用场景非常多,经常在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!
三. Redis支持的数据类型有哪些?
- 1️⃣.string字符串类型;
- 2️⃣.hash类型;
- 3️⃣.list列表类型;
- 4️⃣.set集合类型;
- 5️⃣.zset有序集合类型.
四. Redis支持的开发语言?

五. Reids的特点
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库的加载都是在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存.
正因为是纯内存的操作,所以Redis的性能非常出色,每秒可以处理超过 10万次 读写操作,是已知性能最快的Key-Value DB.
Redis的出色之处不仅仅是性能,它的最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能.
比方说可以用Redis的List数据类型来做FIFO双向链表,实现一个轻量级的高性能消息队列服务;用它的Set类型可以做高性能的tag系统等.另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用.
六. Redis优缺点
5.1 Redis 优点
- 速度快: 因为redis基于内存缓存,对数据可以进行高并发读写;
- 支持丰富数据类型: 支持string,list,set,sorted set,hash;
- 支持事务: 操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行;
- 丰富的特性: 可用于缓存,消息,按key设置过期时间,过期后将会自动删除;
- 扩展性和可用性高: 支持垂直扩展,提升硬件性能;通过集群支持水平扩展.
5.2 Redis 缺点
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上.
另外Redis(ACID处理非常简单)也无法做到太复杂的关系数据库模型.
5.3 Redis与其他Key-Value缓存产品的对比
- 1️⃣.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用.
- 2️⃣.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.
- 3️⃣.Redis支持数据的备份,即master-slave模式的数据备份.
七. Redis实现高可用的解决方案
- 1️⃣.主从复制:一主多从,主机可写,从机备份.类似于MySQL的读写分离,存在的问题是一但主节点down掉,整个Redis都不可用.
- 2️⃣.哨兵(2.x)机制:启用一个哨兵程序(节点),监控其余节点的状态,根据选举策略,进行主从切换.
缺点:每个节点的数据依旧是一致的,仍无法实现分布式的数据库. - 3️⃣.集群(3.x):结合上述两种模式,多主多从,实现高可用、分布式数据存储.
八. Redis的持久化方案
Redis持久有两种方式:RDB(Redis DataBase)和AOF(Append Only File).
RDB持久化原理是将Reids在内存中的数据库记录定时dump备份到磁盘上,在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储.

AOF持久化原理是将Reids的操作日志以追加的方式写入文件,也就是以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录.

7.1 两种持久化策略对比
7.1.1 RDB的优势
1️⃣.一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的.比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据.通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复.
2️⃣.对于灾难恢复而言,RDB是非常不错的选择.因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上.
3️⃣.性能最大化.对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了.
4️⃣.相比于AOF机制,如果数据集很大,RDB的启动效率会更高.
7.1.2 RDB的劣势
1️⃣.如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择.因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失.
2️⃣.由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟.
7.1.3 AOF的优势
1️⃣.该机制可以带来更高的数据安全性,即数据持久性.Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步.事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失.而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中.可以预见,这种方式在效率上是最低的.
2️⃣.由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容.然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题.
3️⃣.如果日志过大,Redis可以自动启用rewrite机制.即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行,因此在进行rewrite切换时可以更好的保证数据安全性.
4️⃣.AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作.事实上,我们也可以通过该文件完成数据的重建.
7.1.4 AOF的劣势
1️⃣.对于相同数量的数据集而言,AOF文件通常要大于RDB文件.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快.
2️⃣.根据同步策略的不同,AOF在运行效率上往往会慢于RDB.总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效.
二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb).
标签:02,持久,数据库,Redis,内存,RDB,数据,Day11 From: https://blog.51cto.com/u_7044146/5965792