redis延伸

Author:闫玉良

在掌握了 redis 常用的五种类型以及适用场景后,快来学习更多高级操作吧 ~

更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

1.Redis 事务

redis 中有类似于事务的东西,保证事务执行时不被其他客户端发来的请求中断。但是和关系数据库并不相同。它的事务不支持回滚操作,因此在统一执行事务中所有命令时,即使有一条失败,之前执行过的命令仍然生效。

事务执行过程:开启事务,进行相关操作(所有操作按顺序添加到队列中),执行。

此处可能有人会问:既然不支持回滚,那么在事务执行的过程中,所处理的数据被其他人修改了,怎么办?redis 提供了一个监视器 watch 命令,它的执行过程如下:

1) 使用监视器监控一个变量

2) 使用 multi 开启事务

3) 向队列中添加一系列命令

4) 在使用 exec 统一执行队列中所有操作前,监视器会去查看监控的变量是否被更改过,如果有变化直接报错,没有则正常执行

看到上述执行过程后,会发现它类似于「乐观锁」

单机支持事务,集群不支持。

可以使用命令 info Replication 查看所属角色(主 MasterSlave 信息)

1.1 相关命令

multi 开启事务

exec 统一执行

watch 监视器「乐观锁」

1.2 模块化操作

我们在使用 python 第三方库操作 redis 时,一般通过 pipeline 管道进行接收命令,然后 execute 顺序执行管道中所有操作。

优点:可以在客户端统一收集指令;会隐式的执行 multiexec 命令。

2.Redis 持久化

redis 是内存型的数据库,为保证发生宕机时可以恢复数据,所以需要持久化。共有下方两种方式:

2.1 RDB

快照持久化(把当前内存状态刷入硬盘)

1) 创建子进程执行,停顿时长(随着数据量的增大,创建子进程所耗费的时间会越来越长。比如使用了40G内存后,创建一个子进程可能耗费4s多,这4s数据库会处于停服状态)

2) 定期触发(默认开启)

3) 手动执行 BGSAVE 命令(background save 后台保存)时触发

4) 执行 SHUTDOWN 关闭数据库时触发

2.2 AOF

追加文件的方式进行持久化

1) 保存的是操作指令

2) 默认关闭

3) 可以选择 appendsync always / everysec / no 三种方式,一般选择每秒记录一次

4) 占用磁盘一定量时会进行压缩,可手动开启配置项

在实际使用时一般两种方式都开启。

3.Redis 复制集

为了在部分节点无法通讯时,保证服务仍然可用。

3.1 设置方式

1) 服务运行时执行命令 slaveof

2) 服务启动前在 redis.conf 配置文件中填写以下代码:

1
slaveof <masterip> <masterport>

3.2 注意事项

只能一主多从(不允许存在互为备份的两个 master),但是可以层级化,如下图所示。

1
2
3
4
5
            master
/ \
slave1 slave2
/ \
slave3 slave4 ......

使用如下命令查看当前 redis 服务器所扮演角色:

1
info Replication

4.Sentinel 哨兵

1) 是一个独立的进程,安装之后默认存在,可以通过源码文件sentinel.conf 查看。

2) 哨兵独立于 redis 之外运行。

4.1 作用

看管 redis 主从角色关系,进行故障转移(failover) ,从而实现高可用。它的功能简单来说就是 master 死掉了,可以自动将 slave 上升为 master

4.2 注意

至少运行3个实例,因为决定 redis 是否挂掉需要选举,超过半数投票才可以使 master 客观下线。还会在哨兵中选举出一个 leader 去故障转移,在 slave 中选出哪台被上升为 master

5.redis 用途

1) 缓存

2) 持久存储:比如数据库的冗余字段存放到 redis

3) 队列:消息平台,比如 celery 的消息队列实现

4) 排行榜/计数器

5) 发布订阅

更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • 页面访问量: 独立访客访问数:
  • 更多精彩文章请关注微信公众号『全栈技术精选』,id 为『Pythonnote』

请我喝杯咖啡吧~

支付宝
微信