王振华
想要了解Redis,先从Redis是什么?为何要用Redis?有哪些特性,以及其集群架构来几个方面来了解。
Redis 简介
为什么要用 Redis
Redis 特征
- 单线程,利用 redis 队列技术将访问变为串行访问,消除了传统数据库串行控制的开销。
- Redis 支持数据的持久化,包括 RDB 的全量持久化,或者 AOF 的增量持久化,从而使得
- 分布式架构,读写分离。
- 支持的数据结构丰富。Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list、
- Redis 支持数据的备份,提供成熟的主备同步,故障切换的功能,从而保证了高可用。
Redis Cluster 架构
云计算那些事儿
持久化Redis是典型的key-value型数据库,我们通常把服务器的非空数据库及键值对统称为数据库状态。因为Redis是内存数据库,它把自己的数据库状态存储在内存中,所以一旦发生停电或者其他因素使主机宕机,那么数据将会丢失,所以Redis引入了持久化操作,它把Redis在内存中的数据库状态持久化到硬盘,当服务器重新启动的时候,去加载硬盘中的持久化文件就可恢复现场状态.
Redis有两种持久化方式:RDB持久化和AOF持久化,前者是通过把数据库状态的键值对保存起来,而AOF则是把命令保存起来,那么服务器是使用哪种持久化呢?因为AOF文件更新频率更高,所以优先AOF.接下来将分别介绍两种持久化方式
RDB持久化
- 创建RDB文件:
服务器可以通过save和bgsave来实现rdb持久化,前者会阻塞服务器进程,导致在进行save操作期间,服务器无法继续处理客户端请求;bgsave则会派生一个子进程,让子进程去进行持久化操作,而服务器进程继续响应客户端.这里要说明的是bgsave和save这两个操作无法同时进行,因为会出现竞争条件.
- 持久化策略
知道如何创建RDB文件后,我们讨论何时执行save和bgsave持久化操作?
由于bgsave会创建子进程来进行持久化操作,并不阻碍服务器进程处理其他事,所以我们可以让服务器每隔一段时间执行一次bgsave,因此可以通过设置保存条件来让服务器执行bgsave操作.
好,现在我们真正讲述Redis是如何检查保存条件满足与否!
Redis服务器有个周期性函数serverCron,默认每隔100ms执行一次,Redis就是通过它来检测保存条件
介绍到这里,我们我们已经知道RDB持久化操作的时机和方式,接下来一起看看RDB的文件结构.
- REDIS长度5字节,保存着'R' 'E' 'D' 'I' 'S' 五个字符,可用来判断文件是否是rdb文件
- db_version长度为4字节,值为整数型字符串,代表rdb文件的版本号.比如0006
- databases 数据库状态,包含一个或多个数据库,以及各个数据库中的键值对
- EOF常量,1字节,标志着rdb文件的结束
- check_sum:8字节的校验和,程序通过对REDIS,db_version,databases,EOF四部分计算得来,服务器载入rdb文件时,会将文件计算得来的校验和与该值对比,依次来检测rdb文件正确性.
知道它的结构后,我们具体看看是如何保存的:
- databases
有几个非空数据库则保存几个,每个非空数据库又包含SELECTDB db_number key_value_pairs,
SELECTDB常用为1字节,当程序读到这个值时,知道自己要选择数据库,db_number数据库号,
key_value_pairs为当前数据库中所有的键值对
- key_value_pairs:
- Type有以下几种类型
key总是字符串类型,键值对的形式与键是否带过期值有关,详情参考上图,接下来一起学习value
- value的编码
- 字符串对象:字符串对象的格式主要分为两种,一种是原样,一种是压缩后的,int型字符串原样输出,raw编码的如果长度大于20byte采取压缩形式,否则和int型相同.分别如下所示
- 列表对象
- 集合对象(同列表)
- 集合对象:同集合,不过是元素项开头加了一个score
- 哈希表对象:依次table_size key1 value1 key2 value2
- INTSET 整数集合
- ziplist编码的列表,哈希表或有序集合
到这里RDF持久化基本描述完毕(对rdb文件分析感兴趣的可以自己看),接下来一起学习AOFAOF持久化
与RDB持久化保存数据库中的键值对来记录数据库不同,AOF持久化是通过记录Redis服务器所执行的写命令来记录数据库状态的.那么AOF持久化具体怎么实现的呢?
AOF持久化的功能实现可描述为命令追加(append),文件写入,文件同步(sync)三个步骤
- 命令追加:服务器每执行一次写命令,就把对应的命令请求协议内容添加到aof_buf缓冲区
- 文件写入和文件同步
AOF文件的载入与数据还原
AOF重写由于AOF文件更行频率很高,用户会有大量的写命令,如果每次都记录,则会浪费大量空间,所以Redis实现了AOF重写功能:首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令
AOF后台重写
由于redis会伴随大量的写入操作,如果服务器去执行aof重写,则可能长时间阻塞,于是服务器使用子进程来进行aof重写,子进程持有服务器进程的数据副本.然而在子进程每次重写期间,服务器又会有新的写请求,那么如何解决这个数据不一致问题呢?
为了解决这个问题,Redis服务器设置了一个aof重写缓冲区,在创建了子进程时,开始使用缓冲区,在子进程重写期间,每当Redis服务器有新的写操作,都会把命令同时发给aof缓冲区和重写缓冲区,这样一来
- AOF缓冲区的内容会定期被写人和同步到AOF文件,对现有AOF文件的处理工作如常进行。
- 从创建子进程开始,服务器执行的所有写命令都会被记录到AOF重写缓冲区里面.
当子进程完成AOF重写工作之后,它会向父进程发送一个信号,父进程在接到该信号后:
- 将AOF重写缓冲区中的所有内容写入到新AOF文件中,这时新AOF文件所保存的数据库状态将和服务器当前的数据库状态一致。
- 对新的AOF文件进行改名,原子地(atomic)覆盖现有的AOF文件,完成新旧两个AOF文件的替换。
启迪云Tuscloud
Redis是什么
Redis的全称是:REmote DIctionary Server(Redis) ,是由Salvatore Sanfilippo大神写的key-value存储系统,现在我们广义上也是一种nosql(非关系型数据库), 它是一个开源的使用ANSI C语言进行编写、遵守一项BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为是数据结构服务器,因为它的值(value)既可以是字符串(String)类型, 哈希(Map)类型, 列表(list)类型, 集合(sets)类型和有序集合类型(sorted sets)等数据类型。Redis的基础类型
- 字符串(String)
- 列表(list)
- 集合(sets)
- 有序集合(sorted sets)
- 哈希(map)
Redis常用场景
跟大家介绍和了解了redis的一些基本的概念,可能大家不太熟悉,那么通过一些常用的场景来跟大家讲解下他的具体应用,加深了解!
- 会话缓存 (session cache)
这是最常用的一种场景,用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。
- 队列
Reids在内存存储引擎领域的一大优点是提供 列表list 和 集合sets 操作,这使得Redis能作为很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
- 订阅和发布
- 计数器
- 排行榜
如果觉得对您有所帮助,请点个赞支持一下或者关注我!谢谢!
程序猿DH
简单的介绍下,也是一种数据库,只是与关系型数据库不同(oracle、mysql等)的是,它是将数据存储到内存里面,也就是当服务器或者说项目,宕机了的情况下,会大几率会丢失数据(不过redis有快照和备份的功能,可以减低风险)。
楼主目前学习到了框架,等到了学习集成不同框架的时候,可以集成redis框架进行数据读写来试试看哦。
更详细的可以看这个博文,描述的很详细呢(http://www.cnblogs.com/qunshu/p/3196972.html)
——没事待在家里不出门的 居家程序员。(我不想脱发!)
居家程序员
Redis是一种nosql(非关系型数据库),也是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。
Trazen
数据库,目前数据库种类繁多,以oracle,mysql为主的关系型数据库,以mongodb为主的非关系型数据库。redis也是一种数据库。基于key value存储。可以实现快速查询的操作
JohnSunQVS
redis就是个缓存数据库,存储一些热点数据,提高访问速度,提高并发量,也可以做分布式锁,分布式session等,具体参照官网介绍