【中间件篇-Redis缓存数据库04】Redis底层原理持久化、分布式锁
Redis 底层原理:
持久化:Redis 提供了 RDB 和 AOF 两种持久化方式。
- RDB:定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。
- AOF:每个写命令都通过 append 操作保存到文件中。
分布式锁:Redis 提供了多种命令来实现分布式锁,如
SETNX
、GETSET
等。使用
SETNX
命令实现锁:SETNX lock_key unique_value
使用
GETSET
命令实现锁:GETSET lock_key unique_value
解决方案和实例代码:
持久化:
RDB 配置示例(redis.conf):
save 900 1 # 900秒内至少1个键被修改则触发保存 save 300 10 # 300秒内至少10个键被修改则触发保存 save 60 10000 # 60秒内至少10000个键被修改则触发保存 dbfilename dump.rdb # RDB文件名 dir /path/to/redis/dir # RDB文件存储目录
AOF 配置示例(redis.conf):
appendonly yes # 开启AOF appendfilename "appendonly.aof" # AOF文件名
分布式锁:
使用
SETNX
实现分布式锁:import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) # 尝试获取锁 if r.setnx('lock_key', 'unique_value'): # 获取锁成功,执行业务逻辑 pass else: # 获取锁失败,等待或者退出 pass # 业务处理完后释放锁 r.delete('lock_key')
使用
GETSET
实现分布式锁:import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) # 尝试获取锁 old_value = r.getset('lock_key', 'unique_value') if old_value is None: # 获取锁成功,执行业务逻辑 pass else: # 获取锁失败,等待或者退出 pass # 业务处理完后释放锁,确保是加锁时设置的值 if r.get('lock_key') == 'unique_value': r.delete('lock_key')
注意:在实际生产环境中,为了避免因为服务器宕机或网络问题导致锁无法释放,应该给锁设置一个过期时间,并且在获取锁之后应该及时刷新这个过期时间。另外,GETSET
方法在分布式锁中可能会出现竞争条件,SETNX
和 SETNX EX max-lock-time
(Redis 2.6.12 版本后提供)的组合使用更为安全。
评论已关闭