Redis进阶--分布式锁

目录

一、引言

二、介绍

1.如何进行加锁

2.引入过期时间

3.引入服务器编号

4.引入lua脚本


一、引言

  本篇文章将介绍Redis的最后最后一个章节,分布式锁的介绍。

二、介绍

  分布式锁主要用于锁进程,而非线程。所谓分布式锁也就是一个/一组单独的服务器程序,给其他的服务器提供“加锁”这样的服务,实现方式有多种,这里主要介绍Redis。

1.如何进行加锁

 往redis上设置一个特殊的key-value,完成指定的操作之后,再把这个key-value给删除掉。每次要进行插入这个key的时候就去判断是否存在,不存在就插入,存在就插入失败(阻塞还是放弃取决于具体业务)。

  使用setnx这个命令(不存在就插入,存在就不插入)加锁。

  使用del这个命令(将这个键值对也删除掉)解锁。

存在问题:如果加锁之后,服务器崩溃了导致没有解锁,该如何处理

2.引入过期时间

  给这个key设置一个过期时间 set ex nx这样的命令完成设置(ex指定超时时间),就能够自动地释放这个锁。

3.引入服务器编号

出现异常:一个服务器加锁,另外一个服务器进行了解锁

1.给服务器编号,每个服务器有自己的身份标识

2.进行加锁的时候,设置key-value。key对应着要针对哪个资源加锁,value标识存储的服务器编号

后续解锁的时候,就可以进行校验了,解锁的时候先查询锁对应的服务器编号,判定这个编号是否就是当前执行解锁的服务器编号。如果是才能真正执行del,如果不是就失败

4.引入lua脚本

解锁的时候先查询,再del(不是原子性操作,可能会出现问题),所以引入lua脚本

lua是一个编程语言,作为redis的内嵌脚本。lua语言特别轻量,实现一个lua解释器,消耗的体积是非常小的。redis执行lua脚本的过程是原子的,相当于一条命令,实际上lua脚本内部写了多个命令。

5.引入看门狗

过期时间的续约问题:如果设置的短就可能在你的业务逻辑还没执行完就释放了锁,设置得太长,导致锁释放不及时

更好地方式:动态续约

初始情况下,设置一个过期时间(例如:1s),提前在还剩300ms的时候,如果任务还没执行完,就给过期时间续上1s,等到时间又剩300ms,就继续去检查,然后无限续费。

如果服务器中途崩溃,也没有续约了,锁就会在较短的时间内自动释放。

负责干这个事情的线程就是看门狗。

6.redlock算法

  保证redis的高可用,保证任何一个节点挂了都有补救的方法。

存在多组redis,都写入这个key(加锁),如果写入key成功的个数超过总数的一半就视为加锁成功!解锁也是同理,对各组redis都进行解锁

三、总结

  redis的学习就到这里结束了,之后博主可能会出关于redis的八股训练,大家尽情期待,感谢观看!

### Redis 的高级用法和特性 #### 1. 使用带有自动补全和语法高亮的交互式 CLI 为了更高效地管理和操作 Redis 数据库,可以采用具备自动完成命令以及提供语法高亮特性的客户端工具。这种增强型CLI能够显著提升用户体验,在执行复杂查询时尤为有用[^1]。 ```bash # 安装并运行支持自动完成与语法高亮特性的Redis CLI pip install interactive-redis-cli interactive_redis_cli ``` #### 2. 启用多种持久化机制保障数据安全 通过配置 `redis.conf` 文件中的设置项来激活 RDB (快照) 和 AOF (追加仅文件) 这两种不同的持久化策略。这有助于防止意外断电或其他异常情况造成的数据丢失风险。当容器启动时指定挂载外部卷用于存储这些持久化的数据库副本,从而实现跨重启后的状态保持[^2]。 ```dockerfile # Docker Compose 或者直接使用Docker指令启动带持久化的Redis实例 docker run --name redis \ -v /local/path/to/data:/data \ -v /local/path/to/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -p 6379:6379 -d redis \ redis-server /usr/local/etc/redis/redis.conf ``` #### 3. 创建受限账户提高安全性 对于生产环境下的 Redis 实例来说,创建一个专门的服务账号是非常重要的一步。该账号不具备 shell 访问权限,并且其家目录也被移除以减少潜在的安全威胁。此外还将 Redis 可执行程序及其工作路径赋予此特定用户组所有权,确保只有授权人员才能对其进行修改或访问[^3]。 ```bash # 添加不具Shell登录能力也不拥有Home Directory的新用户 sudo useradd -M -s /sbin/nologin redis # 更改Redis安装目录所属权给新建立的用户 chown -R redis:redis /path/to/installation/ ``` #### 4. 构建分布式集群架构扩展性能 随着业务增长带来的负载压力增大,单机版 Redis 很难满足需求。此时可以通过构建多节点组成的集群模式来进行横向扩容。每个节点负责处理一部分键空间内的读写请求,而整个系统的吞吐量则取决于所有成员共同协作的结果。在实际部署过程中需注意各服务器间网络连接质量及延迟等因素的影响[^4]。 ```bash # 分别于不同主机上依次启动多个Redis服务端进程作为集群组成部分之一 /usr/local/redis/src/redis-server /etc/redis/node-01.conf /usr/local/redis/src/redis-server /etc/redis/node-02.conf ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值