项目前导 四

redis (2)

1 Redis 与 Python 交互

Python 操作 Redis

redispy安装及链接

安装 Redis 扩展

pip install redis

连接

r=redis.StrictRedis(host='localhost' , port=6379,db=0)

字符串相关操作

import redis
class TsetString(object):
    def __into__(self):
        self.r=redis.StrictRedis(host='主机ip',port=6379)
        设置值
        def test_set(self):
            res=self.r.set('user=1','juran=1')
            print(res)
        取值
        def test_get(self):
            res=self.f.get('user1')
            print(res)
        设置多个值
        def test_mset(self):
            d={
                  'user2':'juran-2',
                  'user3':'juran-3'
             }
             res=self.r.mset(d)
         取多个值
         def test_mget(self):
             1=['user2','user3']
             res=self.r.mget(1)
             print(res)
         删除
         def test_del(self):
             self.r.delete('user2')
                 
列表相关操作
class TestList(object):
    def __into__(selef):
        self.r=redis.StrictRedis(host='主机ip',pport=6379)
        插入记录
        def test_push(self):
            res=self.r.ipush('common','1')
            res=self.r.rpush('common','2')
            # res=self.r.rpush('jr','123')
        弹出记录
        def test_pop(self)
        res=self.r.lpop('common')
        res=self.r.rpop('common','2')
       范围取值
       def test_range(self):
           res=self.f.lrange('common',0,-1)
           print(res)
        
集合相关操作
class TestSet(object):
   def __into__(self):
       self.r=redis.StrictRedis(host='主机ip',port=6379)
   添加数据
   def test_sadd(self):
       res=self.r.sadd('set01','1','2')
       lis=['Cat','Dog']
       res=self.r.sadd('set02',lis)
    删除数据
    def test_del(self):
        res=self.r.srem(‘set01’,1)
    随机删除数据
    def test_pop(self):
        res=self.r.spop('set02')
       
哈希相关操作
class TestHash(object):
    def __into__(self):
        self.r=redis.StrictRedis(host='主机ip',port=6379)
    批量设置
    def test_hset(self):
        dic={
                'id':1,
                'name':'huawei'
        }
        res=self.r.hmset('mobile',dic)
    批量取值
    def test_hgetall(self):
        res=self.r.hgetall('mobile')
    判断是否存在 存在返回 1 不存在返回 0
    def test_hexists(self):
        res=self.r.hexists('mobile','id')
        print(res)

2 Redis 主从配置

主从概念

  • 一个master 可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
  • master用来写数据,slave用来读数据,经统计:网站的读写比率是 10:1
  • 通过只从配置可以实现读写分离
  • master和slave都是一个redis实例(redis服务)。
    在这里插入图片描述

主从配置

配置主
  • 修改 etc/redis.conf文件
bind 0.0.0.0 或者改成本机IP

开启主机服务

src/redis-server redis.conf
配置从
  • 复制etc/redis/redis.conf 文件
cp redis.conf slave.conf
  • 修改redis/slave.conf 文件
vim slave.conf

bind +(主机ip)
slaveof 主机ip 6379 (主机端口)
port 6378 (从机端口)

开启主机服务

src/redis-server slave.conf
数据操作
  • 在master 和 slave 分别执行 info命令,查看输出信息进入主客户端。
src/redis-cli -h 主机端口 -p 6379

进入从的客服端

src/redis-cli -h 主机ip  -p 6378
  • 在master上写数据
set name juran
  • 在slave 上读数据
get name

3 Redis 持久化-RDB

Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便Redis 重启能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。
在这里插入图片描述

持久化的几种方式

Redis 持久化拥有以下三种方式:

  • 快照方式(RDB,Redis DataBase)将某一个时刻的内存数据,以二进制的方式写入磁盘;
  • 文件追加方式(AOF,Append Only File),记录所有的操作命令,并以文本的形式追加到文件中;
  • 混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样就能保证 Redis 重启时的速度,又能减低数据丢失的风险。

RDB 简介

RDB (Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程。

持久化触发

RDB 的持久化触发方式有两类:一类是手动触发,另一类是自动触发。

手动触发

手动触发持久化得操作有两个: save 和 bgsave,它们主要区别体现在:是否阻塞 Redis 主线程的执行。
1.save 命令 在客服端这种执行 save 命令,就会触发 Redis 持久化,但同时也是使 Redis 处于阻塞状态, 直到 RDB 持久化完成,才会响应其它客户端发来的命令,所以在生产环境一定要慎用。
在这里插入图片描述
2.bgsave 命令 bgsave (background save) 既后台保存的意思,它和 save 命令最大的区别就是 bgsave 会 fork() 一个子进程来执行持久化,整个过程被创建之后,Redis 的主进程就可以响应其它客户端的请求了,相对于整个流程都阻塞的 save 命令来说,显然 bg save 命令更适合我们使用。

自动触发

RDB 的手动触发方式,下面来看如何自动触发RDB持久化?RDB自动持久化主要来源以下几种情况。

1.save m n save m n 是指在 m 秒内,如果有 n 个键发生改变,则自动触发持久化。参数 m 和 n 可以在 Redis 的配置文件中找到,例如,save 60 1则表明在60秒内,至少有一个键发生改变,就会触发 RDB 持久化。自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave 命令。注意:当设置多个 save m n 命令时,满足任意一个条件都会触发持久化。

2.flushall flushall 命令用于清空 Redis 数据库,在生产环境下一定慎用,当 Redis 执行了 flushall 命令之后,则会触发自动持久化,把 RDB 文件清空。

配置说明
# RDB 保存的条件
save 900 1
save 300 10 
save 60 10000

# bgsave 失败之后,是否停止持久化数据到磁盘,yes 表示停止持久化, no 表示忽略错误继续写文件
stop-writes-on-bgsave-error yes

# RDB 文件压缩
rdbcompression yes
# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏。
rdbchecksum yes

# RDB 文件名
dbfilename dump.rdb

# RDB 文件名
dbfilename dump.rdb

# RDB 文件目录
dir ./

其中比较重要的参数如下列表:

1.save 参数 它是用来配置触发 RDB 持久化条件的参数,满足保存条件时将会把数据持久化到磁盘。默认配置说明如下:

  • save 900 1 : 表示900秒内如果至少有 1 个 key 值变化,则把数据持久化到磁盘;
  • save 300 10 :表示300秒内如果至少有 1个key值变化,则把数据持久化到磁盘;
  • save 60 10000:表示60秒内如果至少有10000个key值变化,则把数据持久化到硬盘。

2.rdbcompression 参数 它的默认值是 yes 表示开启 RDB 文件压缩,Redis 会采用 LZF 算法进行压缩。如果不想消耗 CPU 性能来进行文件压缩的话,可以设置为关闭此功能,这样的缺点是需要更多的磁盘空间来保存文件。

3.rdbchecksum 参数 它的默认值为 yes 表示写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。

配置查询

Redis 中可以使用命令查询当前配置参数。查询命令的格式为:config get xxx,例如,想要获取RDB 文件的存储名称设置,可以使用 config get dbfilename。
在这里插入图片描述

RDB优缺点

1)RDB 优点

  • RDB 的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件;
  • RDB 对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行 Redis 服务恢复;
  • RDB 可以更大程度的提高 Redis 的运行速度,因为每次持久化时 Redis 主进程都会 fork() 一个子进程,进行数据持久化到磁盘,Redis 主进程并不会执行磁盘 I/O 等操作。
    2)RDB 缺点
  • 因为 RDB 只能保存某个时间间隔的数据,如果中途Redis 服务被意外终止了,则会丢失一段时间内的 Redis 数据;
  • RDB 需要经常 fork() 才能使用子进程将其持久化在磁盘上。如果数据集很大,fork() 可能很耗时,并且如果数据集很大且 CPU 性能不佳,则可能导致 Redis 停止为客户端服务几毫米甚至一秒钟。

4 持久化-ADF

Redis 持久化

使用 RDB 持久化有一个风险,它可能会造成最新数据丢失的风险。因为 RDB 的持久化有一定的时间间隔,在这个时间段内如果 Redis
服务意外终止的话,就会造成最新的数据全部丢失。

可能会操作 Redis 服务意外终止的条件:

  • 安装 Redis 的机器停止运行,蓝屏或者系统崩溃;
  • 安装 Redis 的机器出现电源故障,例如突然断电;
  • 使用 kill -9 Redis_PID 等。
    那么如何解决以上的这些问题呢?Redis 为我们提供了另一个持久化的方案——AOF。
简介

AOF (Append Only File)中文是附加到文件,顾名思义 AOF 可以把 Redis 每更键值对都记录到文件(appendonly.aof)中。

持久化查询和设置

1)查询 AOF 启动状态
使用 config get appendonly 命令
在这里插入图片描述
其中,第一行为 AOF 文件的名称,而最后一行表示 AOF 启动的状态,yes 表示启动,no表示未启动。

2)开启 AOF 持久化
Redis 默认是关闭 AOF 持久化的,想要开启 AOF 持久化,有以下两种方式;

  • 通过命令行的方式;
  • 通过修改配置文件的方式(redis.conf)。

下面分别来看以上两种方式的表现。
1.命令行启动 AOF
命令行启动 AOF,使用config set appendonly yes 命令,如下图表示:
在这里插入图片描述
命令行启动 AOF 的优缺点:命令启动优点是无需重启 Redis 服务,缺点是如果 Redis服务重启,则之前使用命令行设置的配置就会失效。
2.配置文件启动 AOF
Redis 的配置文件在它的跟径下的 redis.conf 文件中,获取 Redis 的跟目录可以使用命令 config get dir 获取,如下图所示:
在这里插入图片描述
只需要在配置文件中设置 appendonly yes 即可,默认 appendonly no 表示关闭 AOF 持久化。配置文件启动 AOF 的优缺点:修改配置文件的缺点是每次修改配置文件都要重启 Redis 服务才能生效,优点是无论重启多少次 Redis 服务,配置文件中设置的配置信息都不会失效。

触发持久化

AOF 持久化开启之后,只要满足一定条件,就会触发 AOF 持久化。AOF 的触发条件分为两种:自动触发和手动触发。

1)自动触发

有两种情况可以自动触发 AOF 持久化,分为是:满足 AOF 设置策略触发和满足 AOF 重写触发。其中,AOF 重写触发会在本的后半部分详细介绍,这里重点来说 AOF 持久化策略都有哪些。AOF 持久化策略,分为以下三种:

  • always:每条 Redis 操作命令都会写入磁盘,最多丢失一条数据;
  • everysec:每秒钟写入一次磁盘,最多丢失一秒的数据;
  • no:不设置写入磁盘的规则,根据当前操作系通风来决定何时写入磁盘,Linux 默认 30s 写入一次数据至磁盘。
  • 这三种配置可以在 Redis 的配置文件 (redis.conf) 中设置,如下代码所示:
# 开启每秒写入一次的持久化策略
appendfsync everysec
2)手动触发

在客户端执行 bgrewriteaof 命令就可以手动触发 AOF 持久化,如下图所示
在这里插入图片描述
可以看出执行完 bgrewriteaof 命令之后,AOF 持久化就会被触发。

AOF 文件重写

AOF 是通过记录 Redis 的执行命令来持久化(保存)数据的,所以随着时间的流逝 AOF 文件越来越多,这样不仅增加了服务器的存储压力,也会造成 Redis 重启速度变慢,为了解决这个问题 Redis 提供了 AOF 重写的功能。

1)什么是 AOF 重写?

AOF 重写指的是它会直接读取 Redis 服务当前的状态,并压缩保存为 AOF 文件。例如,我们增加了一个计数器,并对它做了99次修改,如果不做 AOF 重写的话,那么持久化文件中就会有 100条记录 执行命令的信息,而 AOF 重写之后,之后记录一条此计数器最终的结果信息,这样就去除了所有的无效信息。

2)AOF重写实现

触发 AOF 文件重写,要满足两个条件,这两个条件也是配置在 Redis 配置文件中的,它们分别:

  • auto-aof-rewrite-min-size:允许 AOF 重写的最小文件容量,默认是 64mb。
  • auto-aof-rewrite-percentange:AOF 文件重写的大小比例,默认值是 100,表示100%,也就是只有当前 AOF 文件,比最后一次(上次)的 AOF 文件大一倍时,才会启动 AOF 文件重写。

查询 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 的值,可使用 config get xxx 命令,如下图所示:
在这里插入图片描述
注意:使用 bgrewriteaof 命令,可以自动触发 AOF 文件重写。

3)AOF 重写流程

AOF 文件重写是生成一个全新的文件,并把当前数据的最少操作命令保存到新的文件上,当把所有的数据都保存至新文件之后,Redis 会交换两个文件,并把最新的持久化操作命令追加到新文件上。

配置说明

合理的设置 AOF 的配置,可以保障 Redis 高效且稳定的运行,以下是 AOF 的全职配置信息和说明。

AOF 的配置参数在 Redis 的配置文件中,也就是 Redis 根路径下的 redis.conf 文件中,配置参数和说明如下:

# 是否开启 ADF,yes 为开启,默认是关闭
appendonly no

# AOF 默认文件名
appendfilename 'appendonly.aof'

# AOF 持久化策略配置
# appendfsync always
appendfsync everysec
appendfsync no

# AOF 文件重写的大小比例,默认值是100,表示100%,也就是只有当前 AOF 文件,比最后一次的 AOF 文件大一倍时,才会启动 AOF 文件重写。
auto-aof-rewritre-percentage 100

# 允许 AOF 重写的最小文件容量
auto-aof-rewrite-min-size 64mb

# 是否开启启动加载 AOF 文件效验,默认值是yes,表示尽可能的加载 AOF 文件,忽略错误部分信息,并启动 Redis 服务,

# 如果值为 no,则表示,停止启动 Redis,用户必须手动修复 AOF 文件才能正常启动 Redis 服务。
aof-load-truncated yes
优缺点
AOF 优点
  • AOF 持久化保存的数据更加完整, AOF 提供了 三种保存策略:每次操作保存、每秒钟保存一次,跟随系统的持久化策略保存,其中每秒保存一次,从数据的安全性和性能两方面考虑是一个不错的选择,也是 AOF 默认的策略,即使发生了意外情况,最多只会丢失 1s 钟的数据;
  • AOF 采用的是命令追加的写入方式,所以不会出现文件损坏的问题,即使由于某些意外原因,导致了最后操作的持久化数据写入了一半,也可以通过 redis-check-aof 工具轻松的修复;
  • AOF持久化文件,非常容易理解和解析,它是把所有 Redis 键值操作命令,以文件的方式存入了磁盘。即使不小心使用 flushall 命令删除了所有键值信息,只要使用 AOF 文件,删除最后的 flushall 命令,重启 Redis 即可恢复之前误删的数据。
AOF 缺点
  • 对于相同的数据集来说,AOF 文件要大于 RDB 文件;
  • 在Redis 负载比较高的情况下,RDB 比 AOF 性能更好;
  • RDB 使用 快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因此从理论上说,RDB 比 AOF 更健壮。
小结

AOF 保存数据更加完整,它可以记录每次 Redis 的键值变化,或者是选择每秒保存一次数据。AOF 的持久化文件更加易读,但相比与二进制的 RDB 来说,所占的存储空间也越大,为了解决这个问题,AOF提供自动化重写机制,最大程度的减少了 AOF 占用空间大的问题。同时 AOF 也提供了很方便异常文件恢复命令:redis-check-aof–fix,为使用 AOF 提供了很好的保障。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值