Redis详解

本文详细介绍了Redis的基本概念、与其他产品的对比、配置解析、持久化机制及集群策略等内容。
  • Redis是什么
  • 同类产品优劣对比
  • Redis配置文件解析
  • Redis持久化
  • Redis集群的三种策略

Redis是什么

Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,如 字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的地理空间索引。Redis具有内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区。
为了实现其出色的性能,Redis使用 内存数据集。根据您的使用情况,您可以通过 每隔一段时间将数据集转储到磁盘或通过将每个命令附加到日志来保留它。如果您只需要功能丰富的网络内存缓存,则可以选择禁用持久性。
Redis还支持简单到设置的主从异步复制,具有非常快速的非阻塞第一次同步,自动重新连接以及在网络分割上的部分重新同步。

同类产品优劣对比

同类产品中对比最多的必然是memcached
  • 最大区别是redis有持久化功能,会根据设置的阈值保存key对应的value到磁盘中。支持宕机数据恢复。memcached设计初衷便是作为缓存服务器,无法持久化。一旦宕机则无法恢复数据
  • redis支持的数据结构更丰富,不仅仅只是k-v.还有list、set、hash等数据结构
  • redis支持数据备份,即master-slave模式的数据备份。

Redis配置文件解析

#Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no 

#当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid

#指定Redis监听端口,默认端口为6379,
port 6379

#绑定的主机地址,这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接,相当于指定远程连接白名单
bind 127.0.0.1

#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能,生产环境都是为0
timeout 0

#设置数据库的数量,默认数据库下标为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16

#设置Redis连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass ts123456

#设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>

#当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>

#同一时间最大客户端连接数,默认无限制(maxclients 0),当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回
#max number of clients reached错误信息
maxclients 500000

#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,
#当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。
Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>

#指定是否启用虚拟内存机制,默认值为no,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,
#访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no

#虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap

Redis持久化

Redis提供了两种持久化方式AOF、RDB,默认持久化方式为RDB
  • AOF是采用append追加的方式写日志,并且提供了3种同步策略,即每秒同步、每修改同步和不同步。AOF的数据一致性很强,而且有redis-check-aof工具等工具校验数据。但是AOF同步效率和恢复效率和RDB相比都略差
  • RDB采用子线程根据备份策略写文件的方式,对于灾难恢复是非常不错的选择,而且灾难恢复时如果数据集很大,RDB的速度很快。不过数据集较大时,在fork子进程的时候可能会导致服务器阻塞几百毫秒甚至1秒。

AOF持久化

#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时
#导致一段时间内的数据丢失。redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no

#指定更新日志文件名,默认为appendonly.aof,生产环境最好是和端口号指定在一起 PS:appendonly-6379.aof
appendfilename appendonly.aof

#指定更新日志条件,共有3个可选值: 
#	no:表示等操作系统进行数据缓存同步到磁盘(快) 
#	always:表示每次更新操作后手动调用fsync()将数据写到磁盘,很慢,但是很安全
#	everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec

RDB持久化

#配置触发Redis的 RDB 持久化条件。比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave
save 900 1		#表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10		#表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000	#表示60 秒内如果至少有 10000 个 key 的值变化,则保存

#当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,
#否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
stop-writes-on-bgsave-error yes

#对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,
#可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbcompression yes

#在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,
#如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum yes

#设置快照的文件名,默认是 dump.rdb
dbfilename dump.rdb

#设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。
dir ./

也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,
将当前的内存快照保存在 dir 配置的目录中,文件名由配置的 dbfilename 决定。

Redis集群的三种策略

  • 主从复制
    1.从库初始化是通过RDB实现的
    2.Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
    3.Master Server和Slave Server都是通过非阻塞方式完成数据同步的,Master Server和Slave Server都是返回操作之前的数据
    4.不具备容灾和自动恢复功能,主从机宕机都需要人工去启动否则一直失败
#配置leader信息   slaveof ip port
slaveof 127.0.0.1 6379

#重启,进入命令行模式 info replication 查看主从信息,如下图所示
127.0.0.1:6379> info replication

在这里插入图片描述在这里插入图片描述


  • 哨兵机制
    1.Redis 2.8版本提供了哨兵工具来实现自动化的系统监控和故障恢复功能。

    哨兵的职责:
    1.监控主服务器和从服务器是否正常运行
    2.主服务器出现故障时自动推举新的主服务器,将从服务器转换为主服务器

    哨兵的工作机制:

    • 哨兵进程启动时会读取配置文件的内容,通过sentinel monitor master-name ip port quorum查找到master的ip端口。一个哨兵可以监控多个master数据库,只需要提供多个该配置项即可。

    • 每个Sentinel每秒向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令

    • 如果回复PING命令的时间超过了down-after-milliseconds配置的值,则这个实例会被 Sentinel 标记为主观下线

    • 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。

    • 当足够数量(quorum)的 Sentinel在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线。

    • 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 。

    • 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。

      若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

    选举过程

    • S_DOWN subjectively down,直接翻译的为"主观"失效,即当前sentinel实例认为某个redis服务为"不可用"状态.
    • O_DOWN objectively down,直接翻译为"客观"失效,即多个sentinel实例都认为master处于"SDOWN"状态,
    • 如果master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为"不可用",将会开启(故障转移)failover.

    选举分为两步,首先根据调条件筛选出备选节点,然后在备选节点中选择新的leader

    ①筛选备选node:

    • 1、slave节点状态处于S_DOWN,O_DOWN,DISCONNECTED的除外
    • 2、最近一次PING应答时间不超过5倍PING的间隔(假如PING的间隔为1秒,则最近一次应答延迟不应超过5秒,redis sentinel默认为1秒)
    • 3、info_refresh应答不超过3倍info_refresh的间隔(原理同2,redis sentinel默认为10秒)
    • 4、slave节点与master节点失去联系的时间不能超过( (now - master->s_down_since_time) + (master->down_after_period * 10))。总体意思是说,slave节点与master同步太不及时的(比如新启动的节点),不应该参与被选举。
    • 5、Slave priority不等于0(这个是在配置文件中指定,默认配置为100)。

    ②从备选节点中,按照如下顺序选择新的master

    • 1、较低的slave_priority(这个是在配置文件中指定,默认配置为100)
    • 2、较大的replication offset(每个slave在与master同步后offset自动增加)
    • 3、较小的runid(每个redis实例,都会有一个runid,通常是一个40位的随机字符串,在redis启动时设置,重复概率非常小)
    • 4、如果以上条件都不足以区别出唯一的节点,则会看哪个slave节点处理之前master发送的command多,就选谁

  • Redis集群(Redis Cluster)
    redis-cluster的架构如如下所示,所有的节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

    Redis集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
    在这里插入图片描述
    添加节点的过程
    Redis数据分片策略

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值