今日分享

redis延伸_公众号小闫同学pythonnote.cn查看:​1314520​回复:​225

不知你是否发现:有人看了些文章,读了篇鸡汤,甚至瞄了眼评论就敢妄言置评。没有亲身经历,没有深入研究,我选择闭口不谈。

 —— 小闫同学



在掌握了 ​​redis​​ 常用的五种类型以及适用场景后,快来学习更多高级操作吧 ~​更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

1.Redis 事务

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

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

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

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

2) 使用 ​​multi​​ 开启事务

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

4) 在使用 ​​exec​​ 统一执行队列中所有操作前,监视器会去查看监控的变量是否被更改过,如果有变化直接报错,没有则正常执行更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

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


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

可以使用命令 ​​info Replication​​​ 查看所属角色(主 ​​Master​​​ 从 ​​Slave​​ 信息)


1.1 相关命令

​multi​​ 开启事务

​exec​​ 统一执行

​watch​​ 监视器「乐观锁」

1.2 模块化操作

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

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

2.Redis 持久化

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

2.1 RDB

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

1) 创建子进程执行,停顿时长(随着数据量的增大,创建子进程所耗费的时间会越来越长。比如使用了40G内存后,创建一个子进程可能耗费4s多,这4s数据库会处于停服状态)更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

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​​ 配置文件中填写以下代码:

slaveof <masterip> <masterport>

3.2 注意事项

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

master
/ \
slave1 slave2
/ \
slave3 slave4 ......

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

info Replication

4.Sentinel 哨兵

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

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

4.1 作用

看管 ​​redis​​​ 主从角色关系,进行故障转移(​​failover​​​) ,从而实现高可用。它的功能简单来说就是 ​​master​​​ 死掉了,可以自动将 ​​slave​​​ 上升为 ​​master​​ 。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

4.2 注意

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

5.redis 用途

1) 缓存

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

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

4) 排行榜/计数器

5) 发布订阅

6.Redis 面试题汇总

可以点击文章「​​Redis高频面试题​​」查看更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』



redis延伸_python_02