redis基础知识介绍

漫谈redis

标签: redis 单点 主从 哨兵 集群


1 redis 简介

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可持久化的键值对存储数据库。从2015年6月开始,Redis的开发由Redis Labs赞助,而2013年5月至2015年6月期间,其开发由Pivotal赞助。在2013年5月之前,其开发由VMware赞助。根据月度排行网站DB-Engines.com的数据,Redis是最流行的键值对存储数据库。如无特殊说明,以下介绍均以Redis3.x为准。


2 redis 基础核心

2.1 内存模型

2.1.1 key及value的存储

针对 set hello world 语句我们来分下一下redis的ne
添加redis key-value时所涉及的数据模型如下:
微信图片_20190611230027.png-22.5kB

  1. dictEntry:Redis是Key-Value数据库,因此对每个键值对都会有一个dictEntry,里面存储了指向Key和Value的指针;next指向下一个dictEntry,与本Key-Value无关。
  2. Key:图中右上角可见,Key(”hello”)并不是直接以字符串存储,而是存储在SDS结构中。
  3. redisObject:Value(“world”)既不是直接以字符串存储,也不是像Key一样直接存储在SDS中,而是存储在redisObject中。实际上,不论Value是5种类型的哪一种,都是通过redisObject来存储的;而redisObject中的type字段指明了Value对象的类型,ptr字段则指向对象所在的地址。不过可以看出,字符串对象虽然经过了redisObject的包装,但仍然需要通过SDS存储。
  4. redisObject除了type和ptr字段以外,还有其它属性字段。如用于指定对象内部编码的字段;Redis支持的每种类型,都有至少两种内部编码,例如对于字符串,有int、embstr、raw三种编码。Redis可以根据不同的使用场景来为对象设置不同的编码,大大提高了Redis的灵活性和效率。以列表对象为例,有压缩列表和双端链表两种编码方式;如果列表中的元素较少,Redis倾向于使用压缩列表进行存储,因为压缩列表占用内存更少,而且比双端链表可以更快载入。
object encoding key1 查看 key1对象采用的编码方式

2.2 持久化

2.2.1 持久化原因

Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。持久化侧重于解决单机备份。

####2.2.2 持久化方式
Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。

2.2.3 RDB和AOF的优缺点
  1. RDB持久化
    优点:RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比,RDB最重要的优点之一是对性能的影响相对较小。
    缺点:RDB文件的致命缺点在于其数据快照的持久化方式决定了必然做不到实时持久化,有可能导致数据的大量丢失,这一般是无法接受的。因此AOF持久化成为主流。此外,RDB文件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的RDB文件)。

  2. AOF持久化
    与RDB持久化相对应,AOF的优点在于支持秒级持久化、兼容性好,缺点是文件大、恢复速度慢、对性能影响大(向硬盘写数据的频率大大提高everysec策略下为秒级,IO压力更大,甚至可能造成AOF追加阻塞问题)。

2.3 主从复制

2.3.1 主从复制原因
  1. 持久化数据的一种方式,侧重解决数据的多机热备。
  2. 故障恢复,当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  3. 负载均衡,配合读写分离,可以由主节点提供写服务,由从节点提供读服务从而分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 主从复制是哨兵和集群能够实施的基础,是Redis高可用的基础。
2.3.2 主从复制的原理
  1. 建立socket连接:在主从节点之间建立连接,为数据同步做准备。
  2. 数据同步:该阶段可以理解为从节点数据的初始化。根据主从节点当前状态的不同,可以分为全量复制和部分复制。
  3. 命令传播:主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性。命令传播是异步的过程,即主节点发送写命令后并不会等待从节点的回复。

2.4 事务

2.4.1 redis事务特性
  1. 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
  3. MULTI(开启事务) 、 EXEC(执行事务中的所有命令) 、 DISCARD(事务丢弃,事务队列清空) 和 WATCH(为Redis提供check-and-set (CAS)行为) 是 Redis 事务的基础。

3 redis 常见使用方式

3.1 单点

3.1.1 单点概述

所有读写均在一个服务节点(内存和网络条件无限制的话redis单点最高可达10万/s QPS)。

3.1.2 单点优缺点

优点:读数据无延时。
缺点:故障恢复无法自动化;无负载均衡;存储能力受到单机的限制。

3.2 主从

3.2.1 主从概述

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

3.2.2 主从复制的作用
  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是服务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
3.2.3 优缺点

优点:可读写分离,宕机后可手动快速恢复(多机热备)。
缺点:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。

3.3 哨兵

3.3.1 哨兵概述

Redis主从复制的作用有数据热备、负载均衡、故障恢复等;但主从复制存在的一个问题是故障恢复无法自动化。Redis哨兵它是基于Redis主从复制,主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可用性。

3.3.2 哨兵架构

image_1dd650g1j1u36a91f7i1bdq1m8t1e.png-77.8kB
两部分组成,哨兵节点和数据节点:
哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
数据节点:主节点和从节点都是数据节点。

3.3.3 哨兵工作原理

监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
配置提供者(Configurationprovider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址
通知(Notification):哨兵可以将故障转移的结果发送给客户端。

3.3.4 优缺点

优点:在复制的基础上,哨兵实现了自动化的故障恢复。
缺点:写操作无法负载均衡;存储能力受到单机的限制。

3.4 集群

3.4.1 集群概述

持久化、主从复制和哨兵,多少仍有不足,最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡。Redis集群解决了上述问题,实现了较为完善的高可用方案。

3.4.2 集群的作用
  1. 数据分区:数据分区(或称数据分片)是集群最核心的功能。
    集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
    Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。

  2. 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

3.4.3 优缺点

优点:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题。。。
缺点:需要一定的物理资源。。。

4 redis 使用场景介绍

4.1 做缓存

查询先查redis再查库同时加载到redis。插入数据同时插入到redis。

4.2 分布式锁

Redis单线程特性

4.3 自动过期

短信、验证码自动过期

4.4 秒杀

提前预热数据,放入Redis
商品列表放入Redis List
商品的详情数据 Redis hash保存,设置过期时间
商品的库存数据Redis sorted set保存
用户的地址信息Redis set保存
订单产生扣库存通过Redis制造分布式锁,库存同步扣除
订单产生后发货的数据,产生Redis list,通过消息队列处理
秒杀结束后,再把Redis数据和数据库进行同步

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值