redis 02

1. redis应用场景

一:缓存—热数据

        热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外,内存中的数据也提供了AOF和RDB等持久化机制可以选择,要冷、热的还是忽冷忽热的都可选。

二:计数器

        诸如统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能;

命令:INCRBY

三:队列

        相当于消息系统,ActiveMQ,RocketMQ等工具类似,如果对于数据一致性要求高的话还是用RocketMQ等专业系统。

        由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务;队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用。

四:位操作(大数据处理)

        用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。

想想一下腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?这里要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

        redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。用到的命令是:setbit、getbit、bitcount。

五:分布式锁与单线程机制

        验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交秒杀系统,基于redis是单线程特征,防止出现数据库’爆破’全局增量ID生成,类似’秒杀’。

六:最新列表

        例如新闻列表页面最新的新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10这种low货,尝试redis的 LPUSH命令构建List,一个个顺序都塞进去就可以啦。不过万一内存清掉了咋办?也简单,查询不到存储key的话,用mysql查询并且初始化一个List到redis中就好了。

七:排行榜

谁得分高谁排名往上。命令:ZADD(有续集,sorted set)

八: 适用场景:

数据高并发的读写;

海量数据的读写;

对扩展性要求高的数据。

概 述 常 见 的 有 :

  • 缓存
  • 数据共享分布式
  • 分布式锁
  • 全局ID
  • 计数器
  • 限流
  • 位统计
  • 购物车
  • 用户消息时间线timeline
  • 消息队列
  • 抽奖
  • 点赞、签到、打卡
  • 商品标签
  • 商品筛选
  • 用户关注、推荐模型
  • 排行榜

2. redis的持久化

2.1 什么是redis 持久化

edis是基于内存的数据库。

优点是cpu读取内存速度快,一秒钟可以进行数十万次,可以直接和cpu速度相近,读取极快。
缺点是基于内存,存在断电数据丢失的情况。

为了防止其数据断电丢失,就需要将数据存入硬盘中,这样在断电后也可以访问到数据库当中的数据。

这个将内存的数据写入到磁盘中,防止服务器宕机内存数据丢失,就是redis的持久化。
 

2.2  redis持久化的方式

redis提供两种持久化机制:RDB和AOF

redis的默认持久化方式是RDB。

2.3   RDB(快照)

RDB:是Redis DataBase缩写。

按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。

(1)生成快照的方式:

①客户端方式:BGSAVE 和 SAVE指令
②服务端方式:服务器配置自动触发 和 shutdown

客户端方式:

1.  BGSAVE:客户端可以使用BGSAVE命令来创建一个快照,当接收到客户端的BGSAVE命令时,redis会创建一个子进程,子进程负责将快照写入磁盘中,而父进程继续处理命令请求。(在子进程创建之初,父子进程共享相同内存,知道父进程或子进程对内存进行了写之后,对于被写入的内存的共享就会结束服务)

演示图示:


2.  SAVE:客户端使用SAVE命令创建一个快照,接收到SAVE命令的redis服务器在快照创建完毕之前将不再响应任何其他的命令。

 

演示图示: 

 
服务端方式:

1.  服务器通过配置方式来满足自动触发快照进行持久化,管理员需要在redis.conf中设置save配置选项,redis会在save选项条件满足之后自动触发一次BGSAVE命令,如果管理员设置了多个save配置选项,当任意save条件被满足,redis都会触发一次BGSAVE命令。
2.  shutdown指令:当redis通过shutdown指令接受到关闭服务器的请求时,会触发一次SAVE命令,阻塞所有的客户端,不再执行客户端发送的任何命令,在SAVE命令执行完毕后关闭服务器。

(2)优缺点
优点:

1. 只有一个dump.rdb文件,方便持久化
2. 容灾性好,一个文件可以保存到安全的磁盘中。
3. 性能最大化,子进程来完成写操作,主进程可以继续处理命令,实现IO最大化(使用单独的子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能)。
4. 相对于数据集大时,比AOF的启动效率更高。
缺点:

1. 数据安全性第。RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。
2. dump.rdb文件是一个redis中特制的二进制文件,涉及到不同的redis版本,可能会发生版本不兼容问题。
 

2.4 rdb数据恢复

        只需要把dump.rbd文件放入按照目录,当redis服务启动时,会读取dump.rdb文件 并加载到内存中。

2.5  AOF持久化

AOF:是Append Only File的缩写。

是指,将redis执行的所有写命令记录到日志文件中,将被执行的写命令写到AOF的文件末尾,当redis重启时,redis会从头到尾执行一次AOF文件所包含的所有写命令,以此回复AOF文件的记录的数据集。

(1)开启AOF持久化

redis默认配置中AOF持久化机制是不开启的,需要在配置中开启。

测 试: 

(4)优缺点


优点:

1. 数据安全,AOF持久化可以通过配置appendfsync属性,设置其记录频率。
2. 通过append模式写文件,即使服务器宕机,也可以通过redis-check-aof工具解决数据一致问题。
3. 更加灵活。AOF机制的 rewrite 模式,AOF文件没被rewrite之前(文件过大时回对命令进行合并重写),可以删除其中的某些命令。


缺点:

1. AOF文件比RDB文件更大,且回复速度更慢。
2. 数据集大时,AOF比RDB启动效率低。
当RDB和AOF同时开启时,redis数据恢复会优先选中AOF恢复。
 

3. redis 集群

3.1 什么是redis 集群

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的错误。

Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

3.2 为什么要使用redis集群

可以减少单机的压力,解决单机故障问题。

性能

Redis 本身的QPS 已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的Redis 服务来完成工作。

扩展

第二个是出于存储的考虑。因为Redis 所有的数据都放在内存中,如果数据量大,很容易受到硬件的限制。升级硬件收效和成本比太低,所以我们需要有一种横向扩展的方法。

可用性

第三个是可用性和安全的问题。如果只有一个Redis 服务,一旦服务宕机,那么所有的客户端都无法访问,会对业务造成很大的影响。另一个,如果硬件发生故障,而单机的数据无法恢复的话,带来的影响也是灾难性的。
 

Redis 支持三种集群方案

  • 主从复制模式
  • Sentinel( 哨 兵 )模式
  • Cluster ( 集 群 )模式

3.3 第一种集群方式--主从模式

        主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave),客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。

(1)  复制三个redis配置文件放入master-slave目录

(2)修改三个文件的配置

1.     bind 0.0.0.0 -::1
        # 关闭保护模式
        protected-mode no
        port   6380 
        dbfilename dump6380.rdb 
        appendfilename "appendonly6380.aof"

 

 

 2.     bind 0.0.0.0 -::1
        # 关闭保护模式
        protected-mode no
        port   6381
        dbfilename dump6381.rdb 
        appendfilename "appendonly6381.aof"

3.     bind 0.0.0.0 -::1
        # 关闭保护模式
        protected-mode no
        port   6382 
        dbfilename dump6382.rdb 
        appendfilename "appendonly6382.aof"

 

 (3) 启动三台 redis 

(4)三台客户端访问redis相应的服务器

redis-cli -p 6380

redis-cli -p 6381

redis-cli -p 6382

(5) 查看redis的角色

info replication

 看出他们之间没有主从关系

(6)配置主从关系---从节点

slaveof 主节点ip 主节点port

 (7) 往主节点添加数据   从节点取出

3.4 第二种集群方式--哨兵模式

上面的主从模式的缺点:----如果主节点宕机后,从节点无法上位,该redis服务就无法执行写操作了。---- 引出哨兵模式。

兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。 (1)集群监控 :负责监控Redis master和slave进程是否正常工作 (2)消息通知 :如果某个Redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员 (3)故障转移 :如果master node挂掉了,会自动转移到slave node上 (4)配置中心 :如果故障转移发生了,通知client客户端新的master地址 原理:当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。

 (1)修改  sentinel.conf文件  

(2) redis-sentinel sentinel.conf   开启哨兵服务

(3) 往主节点添加数据

演示: 挂掉主节点   6380客户端 shutdown

 

如果原来的主节点回来---它需要跟在现在的主节点混。

3.5 第三种集群方式--哨兵模式

哨兵模式的缺点: 它只有一个主节点---如果现在写操作并发高,那么还会导致主节点压力过大。

Redis Cluster是一种服务器 Sharding 技术,3.0版本开始正式提供。

Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在 redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容

集群的特点

  • 所有的 redis 节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
  • 节点的 fail 是通过集群中超过半数的节点检测失效时才生效。
  • 客户端与 Redis 节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

准备: 6台redis服务。---6个服务中不能有数据。

7001

7002

7003   

=============主节点

7004

7005

7006 

=============从节点

修改配置文件: 都需要改

bind 0.0.0.0 

port 7001

daemonize yes

# 打开aof 持久化

appendonly yes

# 开启集群

cluster-enabled yes

# 集群的配置文件,该文件自动生成

cluster-config-file nodes-7001.conf 

# 集群的超时时间

cluster-node-timeout 5000 

开启上面6台redis服务器

为6台redis配置槽以及主从关系

redis-cli --cluster create --cluster-replicas 1 192.168.28.222:7001 192.168.28.222:7002 192.168.28.222:7003 192.168.28.222:7004 192.168.28.222:7005 192.168.28.222:7006

 

验证:   

 

 

 

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值