数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)

目录

持久化

RDB(Redis DataBase)

AOF(Append Only File)

RDB和AOF的区别

备份与恢复

备份

恢复

主从复制

概述

环境配置

实验1:主机设置,从机获取

实验2:主机断开,从机读取

实验3:谋朝篡位

主从复制原理

哨兵模式

哨兵模式优缺点

缓存穿透、击穿与雪崩

缓存穿透

防御

缓存击穿

防御

缓存雪崩

防御

Java使用redis

Python3使用redis

参考

 


持久化

Redis是内存数据库,如果不保存的话,断电就会丢失数据。具体配置在redis.conf的SNAPSHOTTING一节。

RDB(Redis DataBase)

配置中默认的是RDB模式,文件保存配置为

dbfilename dump.rdb

触发rdb的情况

  • 执行flushall命令
  • 退出Redis
  • 备份命令

AOF(Append Only File)

redis记录写操作(读操作不记录),redis重启的话就根据日志文件的内容写入。默认不开启。

appendonly no

 改为yes就开启了

aof文件出错,使用redis-check-aof来进行修复(有一定的错误率,可能会丢失数据)

redis-check-aof --fix appendonly.aof

RDB和AOF的区别

rdb与aof的区别
比较项 RDB AOF
启动载入优先级(两种都开启了)
体积
恢复速度
数据完整性 丢数据 更完整
轻重

备份与恢复

备份

save或bgsave命令

恢复

将dump.db放到dir中,重启服务即可

主从复制

概述

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

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

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

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:
1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;

2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。

环境配置

配置从库即可

使用命令

info replication

查看当前信息

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第1张图片

我们就在一个虚拟机中模拟一下

复制三份配置文件,修改

  1. 端口
  2. pid
  3. log文件名字
  4. rdb名字

redis-server 配置文件路径

redis-cli -p 端口号

查看进程

ps -ef | grep redis

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第2张图片

slaveof ip 端口

使用上述命令,在从机(6781、6782)配置它的主机(6780)

127.0.0.1:6382> slaveof 127.0.0.1 6380
OK

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第3张图片 主机

 可以看到两个从机

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第4张图片 某一从机

配置文件中配置,找到以下行,取消注释,修改主机ip和端口即可,启动后默认为从机。

# replicaof

主机有密码的话可以再配置一下

#masterauth

实验1:主机设置,从机获取

主机设置值

127.0.0.1:6380> set lady killer9
OK

从机获取值

127.0.0.1:6381> get lady
"killer9"

从机设置值

127.0.0.1:6381> set k1 v1
(error) READONLY You can't write against a read only replica.

可以看到,从机不能设置值

实验2:主机断开,从机读取

主机关闭

127.0.0.1:6380> shutdown
not connected>

从机

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第5张图片

127.0.0.1:6382> get lady
"killer9"

从机信息显示主机关闭,主机之前设置的值仍然可以读取

实验3:谋朝篡位

主机断开,需要快速恢复业务,可以通过

slaveof no one

来使从机变为主机,进行写操作,就是设置key

127.0.0.1:6381> slaveof no one
OK

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第6张图片

主从复制原理

Slave启动成功连接到master 后会发送一个sync同步命令Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
    全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
    增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步但是只要是重新连接master,一次完全同步(全量复制)将被自动执行!

哨兵模式

实际生产环境中还是需要进行自动配置的,也就是主机宕机,从机自动选择一个作为主机。

配置

sentinel.conf

sentinel monitor myredis 127.0.0.1 6380 1

名字myredis叫什么无所谓哈

启动

redis-sentinel sentinel.conf

实验:主机宕机,哨兵选举

关闭主机

127.0.0.1:6380> shutdown
not connected>

稍等一会儿,查看哨兵进程

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第7张图片

哨兵监控之后,进行了投票,选举6382的redis作为主节点

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第8张图片 82变为主机
数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第9张图片 81换主机为82
数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第10张图片 重启原主机

重启原主机后发现,已经变为了从机!!!

哨兵模式优缺点

优点:

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有。
  2. 主从可以切换,故障可以转移,系统的可用性就会更好
  3. 哨兵模式就是主从模式的升级,手动到自动,更加健壮!

缺点:

  1. Redis不好在线扩容的,集群容量一旦到达上限,在线扩容就十分麻烦!
  2. 实现哨兵模式的配置其实是很麻烦的,里面有很多选择!

缓存穿透、击穿与雪崩

缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

防御

  • 鉴权与过滤:接口增加用户鉴权,校验参数,如id<=0时,直接拦截。布隆过滤器是个很好的解决方案。
  • 缓存中设置为空:从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

例如,微博热搜,redis缓存过期,0.1秒后放入缓存,但是0.1秒的访问量巨大,导致数据库压力瞬间增大,服务器宕机。

防御

  • 设置热点数据永远不过期。
  • 加互斥锁,使用分布锁,保证每个key同事只要有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。

缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

防御

  • redis集群,热点数据均匀分布在不同服务器
  • 限流降级,暂时关闭不重要服务,例如,双11关闭退款服务等
  • 数据预热,手动触发热点,加入缓存,设置不同过期时间

Java使用redis

创建一个Empty Project

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第11张图片

 新建一个MAVEN module

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第12张图片

在pom.xml中添加依赖


    
        redis.clients
         jedis
        3.2.0
    

添加一个包

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第13张图片

添加一个Java类

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第14张图片

类中添加代码,记得修改ip

public static void main(String[] args) {
    // 1. new Jedis对象
    Jedis jedis = new Jedis("192.168.31.129",6379);
    // 所有命令,对应方法
    System.out.println(jedis.ping());
}

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第15张图片

 可以看到连接成功,方法和命令是一一对应的,如果你不熟悉命令,可以查看上一篇文章:

Python3使用redis

安装redis模块

from redis import Redis


def connect(host):
    r = Redis(host, decode_responses=True)
    return r


def ping(redis):
    return redis.ping()


def Count(redis, num):
    if redis.get('view') is None:
        redis.set('view', num)
    else:
        redis.incrby('view', num)
    return redis.get('view')


if __name__ == '__main__':
    r = connect('192.168.31.129')
    if ping(r):
        print('连接成功')
    else:
        print('连接失败')
    print(Count(r, 3))
    print(Count(r, 6))
    print(Count(r, -4))
    print(Count(r, 9))

数据库-Redis高级篇(持久化、备份、主从复制、Java、Python连接等)_第16张图片

参考

redis中文网-slaveof

redis中文网-主从复制

redis中文网-集群教程

redis中文网-sentinel文档

你可能感兴趣的:(数据库,数据库,redis)