Redis

Redis

1. 基础使用

Redis应用场景

雪崩,穿透,击穿,都是高并发场景下,大量请求查询,为找到redis存的数据,直接去查询了数据库,造成数据库压力大

大量请求:
雪崩:redis大量缓存同时过期,同时请求数据库,造成数据库压力大 解决方案:随机设置缓存的失效时间
击穿:热点数据缓存刚过期,大量请求绕过缓存请求数据库,造成数据库压力大 解决方案: 缓存预热,key永不过期或者使用期间内不过期
穿透:查询缓存和数据库都不存在的数据,导致数据库压力大, 解决方案:缓存空对象,布隆过滤器

Redis能做什么

  1. 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;

  2. 排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;

  3. 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;

    注:限速器也是对请求限流的一种实现方式。

  4. 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;

  5. 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;

  6. Session共享,默认Session是保存在服务器的文件中,即当前服务器,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。

redis特点

  • Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。
  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型
  • Redis可以将数据复制到任意数量的从机中。

依赖

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.4.1.RELEASE</version>
</dependency>

yml

spring:
  redis:
    password: 123456
    database: 1

上述两个步骤完成后,SpringBoot自动在Spring容器中配置一个redisTemplate的Bean,所以可以直接使用redisTemplate

常用方法:

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForHash();//操作hash

redisTemplate.opsForList();//操作list

redisTemplate.opsForSet();//操作set

redisTemplate.opsForZSet();//操作有序set

opsForValue

//存储字符串
redisTemplate.opsForValue().set("name","tom");
redisTemplate.opsForValue().get("name");//输出结果为tom
//设置失效时间
redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
//支持整型与浮点型(increment)
template.opsForValue().increment("sex",1);
//追加
template.opsForValue().append("name"," hello");
//存储一个对象(此类必须先序列化实现接口Serializable)
RedisSerializer rs = new StringRedisSerializer();
redisTemplate.setStringSerializer(rs);
ValueOperations ops = redisTemplate.opsForValue();
ops.set("user",user);//放入redis
//取出对象
User setuser = (User) redisTemplate.opsForValue().get("user");

常用命令

Redis 命令参考 — Redis 命令参考

2. 集群配置

Redis集群的三种方式

  • 主从模式:一个主节点和一个或多个从节点,主节点负责写操作,从节点负责读操作,实现读写分离,分担主节点的压力。

优点:实现读写分离,分担主节点的压力。

缺点:当主节点宕机时,需要手动切换或等待重启,不具备自动故障恢复功能。

适用场景:适用于对数据一致性和高可用性要求不高的场景。

  • 哨兵模式:哨兵系统用于监控多个Redis服务器,当主服务器出现问题时,哨兵会自动进行故障迁移,选举一个新的主服务器。

优点:自动故障迁移,实现高可用性。

缺点:配置复杂,需要部署哨兵系统。

适用场景:适用于对高可用性有较高要求的场景。

  • 集群模式:Redis Cluster通过将键空间分割为16384个槽位,每个主节点负责一部分槽位,实现数据的分布式存储和高可用性。

优点:高可用性、高扩展性、数据自动分片和复制。

缺点:配置复杂,需要多个节点协同工作。

适用场景:适用于大规模、高并发、高可用的场景。

2.1 Redis主从复制搭建(一主二从)

什么是主从复制

主从复制是将一台Redis服务器的数据复制到其他Redis服务器,前者叫master/leader主节点,后者成为从节点slave/follower,数据库的复制是单项的,只能由主–>从,master以写为主,slave以读为主,利用主从复制实现读写分离,最低配的主从复制也需要一主二从。主从复制中,从节点只能进行读操作,如果在从节点执行写命令则会报错,主节点可以执行读写操作,但我们网网规定主节点只能进行写操作,这样也是符合了读写分离;默认情况下,每个Redis服务器都为主节点,即master。

主从复制的作用

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

搭建

  1. 分别命名6379、6380、6381,以6379为主机
  2. 主库6379(master),从库6380(slave),6381(slave)修改redis.windows.conf下端口号
  3. 修改dump.rdb,该文件是redis的RDB方式持久化生成的数据文件,三个文件都要改
  4. 修改从库redis.windows.conf----slaveof 主库IP 主库端口号--------masterauth 主库密码
  5. 启动主库,在启动从库,进行测试,主库添加数据,从库同步
  6. 进入主库,使用命令: info replication 查看是否主从复制

复制架构中出现宕机情况

如果在主从复制架构中出现宕机的情况,需要分情况看:

  1. 从Redis宕机

    a) 在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;

    b) 如果从库在断开期间,主库的变化不大,从库再次启动后,主库依然会将所有的数据做RDB操作吗?还是增量更新?(从库有做持久化的前提下)

    不会的,因为在Redis2.8版本后就实现了,主从断线后恢复的情况下实现增量复制。

  2. 主Redis宕机

    i. 第一步,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务;

    ii. 第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来;

    这个手动完成恢复的过程其实是比较麻烦的并且容易出错,有没有好办法解决呢?

    Redis提高的哨兵(sentinel)的功能。

哨兵

哨兵的作用就是对Redis的系统的运行情况的监控,它是一个独立进程。

它的功能有2个:

  1. 监控主数据库和从数据库是否运行正常;
  2. 主数据出现故障后自动将从数据库转化为主数据库;

多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。

2.2 哨兵搭建(一主二从三哨兵)

  1. 在每个redis文件夹下创建 sentinel.conf 文件配置哨兵信息

  2. 编写配置信息

    # 哨兵sentinel实例运行的端口 默认26379
    port 26379
    # 本地ip
    bind 127.0.0.1
    # 哨兵监听的主服务器 后面的1表示主机挂掉以后进行投票,只需要2票就可以从机变主机
    sentinel monitor mymaster 127.0.0.1 6379 2
    # 设置未得到主机响应时间,此处代表5秒未响应视为宕机
    sentinel down-after-milliseconds mymaster 5000
    # 设置等待主机活动时间,此处代表5秒主机未活动,则重新选举主机
    sentinel failover-timeout mymaster 5000
    # 设置主机的密码(无密码可以省略)
    sentinel auth-pass mymaster 123456
    #设置重新选举主机后,同一时间同步数据的从机数量,此处代表重新选举主机后,每次2台从机同步主机数据,直到所有从机同步结束
    sentinel config-epoch mymaster 2
    # 执行故障转移时, 最多有2个从服务器同时对新的主服务器进行同步
    sentinel leader-epoch mymaster 2
    

    三个都需要修改port 分别是26379,26380,26381

    sentinel monitor mymaster 127.0.0.1 6379 2 端口号6379不需要修改 三个文件都一样

  3. 在每个redis文件夹下创建 startup_sentinel.bat 文件用于运行 sentinel.conf

  4. 记事本打开bat文件文件,写入内容 redis-server.exe sentinel.conf --sentinel

  5. 运行redis三个服务,并使用命令检查是否主从复制 info replication

    注意先启动主,再启动从,三个都要启动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值