首页 > 数据库 >再谈Redis的锁

再谈Redis的锁

时间:2024-03-23 16:23:38浏览次数:28  
标签:事务 加锁 Redis 再谈 乐观 临界 冲突

Redis: 锁

单机悲观锁

参考实现

流程

  1. 加锁, 如果失败, 则放弃或重试
  2. 占用, 业务逻辑
  3. 释放

实现

  1. INCR​: 通过返回结果是不是 0
  2. SETNX​: 通过判断结果是否为 0
  3. MSETNX​: 一次性获取多个key的占用 Redis: msetnx

乐观锁

定义

乐观锁并不会直接对临界数据加锁,而是在对临界数据进行操作前,通过某种机制来检查数据是否存在冲突,如果存在冲突,则不更新数据,不存在冲突才操作临界数据。乐观锁总是快到操作数据前才做冲突检查,而不像悲观锁那样第一时间先上锁,这或许是称它为“乐观锁”的原因。乐观锁适合读多写少的场景。

实现

Redis事务 + Watch 命令

Redis事务

Redis Watch

讨论

  1. Redis的事务​是具有迷惑性的

    • 不具备原子性 原子性: 不可分割, 要么都完成, 要么都不完成
  2. 如果真的对事务操作有着非常强的需求, 使用lua脚本会是一个更好的方式

    更好的逻辑控制能力, 例如失败后的回滚, 等等

标签:事务,加锁,Redis,再谈,乐观,临界,冲突
From: https://www.cnblogs.com/pDJJq/p/18091252/redis-lock-z1ygpzh

相关文章

  • Golang: Redislock源码分析
    Golang:Redislock源码分析源码https://github.com/bsm/redislock实现Lua脚本obtain.lua--obtain.lua:arguments=>[value,tokenLen,ttl]--Obtain.luatrytosetprovidedkeys'swithvalueandttliftheydonotexists.--Keyscanbeoverrideniftheyal......
  • 深入理解PHP+Redis实现分布式锁的相关问题
    概念PHP使用分布式锁,受语言本身的限制,有一些局限性。通俗理解单机锁问题:自家的锁锁自家的门,只能保证自家的事,管不了别人家不锁门引发的问题,于是有了分布式锁。分布式锁概念:是针对多个节点的锁。避免出现数据不一致或者并发冲突的问题,让每个节点确保在任意时刻只有一个节点能够......
  • Redis基础命令集详解
    目录1.Redis基础命令2.Redis的经典案例2.1缓存2.2计数器2.3发布订阅Redis是一个开源、内存存储的数据结构服务器,它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。在Redis中,使用一些基础的命令来操作这些数据结构。1.Redis基础命令下面是一些常用的R......
  • Redis缓存方案设计思路
    Redis缓存方案是一个用于提高系统性能和响应速度的策略,主要通过将数据存储在快速访问的内存数据库中来实现。下面是一个基础的Redis缓存方案的实现步骤和注意事项:一、确定缓存目标1、分析数据:确定哪些数据适合放入缓存,通常是那些读取频繁、更新不频繁的数据。2、热点数据......
  • Redis
    消息队列StreamStream相关的命令都以X开头可以通过XDD向stream中添加消息XDDgeekhour*courseredisXDD后面是key,*表示自动生成消息ID添加消息的内容是“课程是redis”XLENgeekhour//看key为geekhour的消息数量XRANGEgeekhour-+//查看消息详细内容-+表示所有消息......
  • 瑞_Redis_商户查询缓存_什么是缓存
    文章目录项目介绍1短信登录2商户查询缓存2.1什么是缓存2.1.1缓存的应用场景2.1.2为什么要使用缓存2.1.3Web应用中缓存的作用2.1.4Web应用中缓存的成本附:缓存封装工具类......
  • Redis
          ......
  • Redis的安装和部署教程(Windows环境)
    一、安装Redis服务1、下载Redis压缩包以下这个是我网盘里面的(这个是v8.0版本的,支持导入.rdb数据文件)链接:百度网盘请输入提取码提取码:x0f1--来自百度网盘超级会员V5的分享2、解压到文件夹将下载的压缩包解压到指定的文件夹中,如:D:\redis,内容如下:3、修改redis.conf......
  • Redis学习
    1.1缓存使用场景1)访问量很大的时候,DB数据在磁盘上。如果加入缓存,可以先去缓存读,如果没有再去DB读。可以减轻访问压力Redis没有锁,单线程、单进程。读11w/s,写8万/s2)做Session分离在各个Tomcat间复制3)做分布式锁4)做乐观锁1.2缓存的概念 缓存是在CPU上的高速......
  • 使用FastAPI+SQLAlchemy+Redis+Celery 编写一个完整的用户登录验证API
    使用PyQt5+FastAPI+SQLAlchemy+Redis+Celery做一个登录注册页(三)本文将介绍用PyQt5+FastAPI+SQLAlchemy+Redis+Celery做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端分离的实现方式,厚后端使用FastAPI+SQLAlchemy+Redis+Celery,你可以将PyQt5改为PySide2以获得更宽松......