Redis是啥?

王振华


想要了解Redis,先从Redis是什么?为何要用Redis?有哪些特性,以及其集群架构来几个方面来了解。


Redis 简介

Redis 是一个开源(BSD 许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

为什么要用 Redis

在高并发场景下,如果需要经常连接结果变动频繁的数据库,会导致数据库读取及存取的速度变慢,数据库压力极大。
因此我们需要通过缓存来减少数据库的压力,使得大量的访问进来能够命中缓存,只有少量的需要到数据库层。由于缓存基于内存,可支持的并发量远远大于基于硬盘的数据库。所以对于高并发设计,缓存的设计是必不可少的一环。
而 Redis 作为比较热门的内存存储系统之一,由于其对数据持久化的支持,种类丰富的数据结构,使其定位更倾向于内存数据库,适用于对读写效率要求都很高、数据处理业务复杂和对安全性要求较高的系统。

Redis 特征

  1. 单线程,利用 redis 队列技术将访问变为串行访问,消除了传统数据库串行控制的开销。
Redis 的线程模型:
  1. Redis 支持数据的持久化,包括 RDB 的全量持久化,或者 AOF 的增量持久化,从而使得
Redis 挂了,数据是有机会恢复的。也可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  1. 分布式架构,读写分离。
  2. 支持的数据结构丰富。Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list、
set、zset、hash 等数据结构的存储。
  1. Redis 支持数据的备份,提供成熟的主备同步,故障切换的功能,从而保证了高可用。

Redis Cluster 架构

Redis 搭建方式有很多种,本章主要介绍 Redis Cluster 集群构建方式:
Redis 3.0 之后版本支持 Redis Cluster 集群,Redis Cluster 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
Redis Cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的 SORT 就可以由从服务器来承担。
Redis 的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低 redis 的处理性能。
主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。在主从架构中,从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。

云计算那些事儿


持久化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重写工作之后,它会向父进程发送一个信号,父进程在接到该信号后:

  1. 将AOF重写缓冲区中的所有内容写入到新AOF文件中,这时新AOF文件所保存的数据库状态将和服务器当前的数据库状态一致。
  2. 对新的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 操作。

  • 订阅和发布
常用的订阅服务也可以通过他来实现
  • 计数器
简单的在redis进行操作实现来了解他
  • 排行榜



如果觉得对您有所帮助,请点个赞支持一下或者关注我!谢谢!


程序猿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等,具体参照官网介绍


分享到:


相關文章: