redis
中有类似于事务的东西,保证事务执行时不被其他客户端发来的请求中断。但是和关系数据库并不相同。它的事务不支持回滚操作,因此在统一执行事务中所有命令时,即使有一条失败,之前执行过的命令仍然生效。
事务执行过程:开启事务,进行相关操作(所有操作按顺序添加到队列中),执行。
此处可能有人会问:既然不支持回滚,那么在事务执行的过程中,所处理的数据被其他人修改了,怎么办?redis
提供了一个监视器 watch
命令,它的执行过程如下:
1) 使用监视器监控一个变量
2) 使用 multi
开启事务
3) 向队列中添加一系列命令
4) 在使用 exec
统一执行队列中所有操作前,监视器会去查看监控的变量是否被更改过,如果有变化直接报错,没有则正常执行更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
看到上述执行过程后,会发现它类似于「乐观锁」
单机支持事务,集群不支持。 可以使用命令
info Replication
查看所属角色(主Master
从Slave
信息)
multi
开启事务
exec
统一执行
watch
监视器「乐观锁」
我们在使用 python
第三方库操作 redis
时,一般通过 pipeline
管道进行接收命令,然后 execute
顺序执行管道中所有操作。
优点:可以在客户端统一收集指令;会隐式的执行 multi
与 exec
命令。
redis
是内存型的数据库,为保证发生宕机时可以恢复数据,所以需要持久化。共有下方两种方式:
快照持久化(把当前内存状态刷入硬盘)
1) 创建子进程执行,停顿时长(随着数据量的增大,创建子进程所耗费的时间会越来越长。比如使用了40G内存后,创建一个子进程可能耗费4s多,这4s数据库会处于停服状态)更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
2) 定期触发(默认开启)
3) 手动执行 BGSAVE
命令(background save
后台保存)时触发
4) 执行 SHUTDOWN
关闭数据库时触发
追加文件的方式进行持久化
1) 保存的是操作指令
2) 默认关闭
3) 可以选择 appendsync always
/ everysec
/ no
三种方式,一般选择每秒记录一次
4) 占用磁盘一定量时会进行压缩,可手动开启配置项
在实际使用时一般两种方式都开启。
为了在部分节点无法通讯时,保证服务仍然可用。
1) 服务运行时执行命令 slaveof
2) 服务启动前在 redis.conf
配置文件中填写以下代码:
slaveof <masterip> <masterport>
只能一主多从(不允许存在互为备份的两个 master
),但是可以层级化,如下图所示。
master / \ slave1 slave2 / \ slave3 slave4 ......
使用如下命令查看当前 redis
服务器所扮演角色:
info Replication
1) 是一个独立的进程,安装之后默认存在,可以通过源码文件sentinel.conf
查看。
2) 哨兵独立于 redis
之外运行。
看管 redis
主从角色关系,进行故障转移(failover
) ,从而实现高可用。它的功能简单来说就是 master
死掉了,可以自动将 slave
上升为 master
。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
至少运行3个实例,因为决定 redis
是否挂掉需要选举,超过半数投票才可以使 master
客观下线。还会在哨兵中选举出一个 leader
去故障转移,在 slave
中选出哪台被上升为 master
1) 缓存
2) 持久存储:比如数据库的冗余字段存放到 redis
中
3) 队列:消息平台,比如 celery
的消息队列实现
4) 排行榜/计数器
5) 发布订阅