美文网首页
redis锁处理并发问题

redis锁处理并发问题

作者: 岭地数字应用 | 来源:发表于2018-08-15 15:22 被阅读0次

redis锁处理高并发问题十分常见,使用的时候常见有几种错误,和对应的解决办法,在此进行自己的总结和整理。

set方式

setnx方式

setnx+getset方式

set方式 

作为redis小白,一开始能想到的使用redis加锁的方式就是set。 

加锁:redis中set一个值,set(lock,1); 

并发处理:其他线程必须拿到这个值,才可以往下进行,否则等待。

释放锁:执行完业务代码之后,释放redis锁,jedis.del(lock) 

防止死锁:set(lock,1) —>3秒后未释放,则自动释放setex(lock, 3, 1) 

问题:高并发情况下,进程同时获取锁状态为null,同时设置,锁之间相互覆盖,但是俩进程仍在并发执行业务代码。 

setnx方式 

后来发现有setnx的原子操作命令,锁存在不能设置值,返回0;锁不存在,则设置锁,返回1; 

加锁:jedis.setnx(lock, 1) 

并发处理:

释放锁:执行完业务代码之后,释放redis锁,jedis.del(lock) 

问题:当进程执行出现问题,锁未释放,则其他进程永远处于阻塞状态,出现死锁。 

防止死锁:加锁时带上时间戳,setnx(lock, 时间戳+超时时间)

问题:当俩进程同时读到发现锁超时,都去释放锁,相互覆盖,则俩进程同时获得锁,仍并发执行业务代码。 

setnx+getset方式 

为解决上面的问题,可以使用getset命令,getset设置键值,并返回原来的键值。 

加锁:setnx(lock, 时间戳+超时时间) 

解决并发:

相关文章

  • redis锁处理并发问题

    redis锁处理高并发问题十分常见,使用的时候常见有几种错误,和对应的解决办法,在此进行自己的总结和整理。 set...

  • Redis读书笔记

    Redis分布式锁 1.分布式应用进行逻辑处理时经常会遇到并发问题。为了保持系统操作原子性,需要进行分布式锁的使用...

  • redis 面试题

    技巧:1、redis + lua 解决高并发场景下的写操作2、redis 分布式锁,防止并发写3、redis 队列...

  • MySQL-存储引擎、锁以及事务

    MySQL存储引擎(处理表的处理器) 锁 解决客户端并发访问的冲突问题 锁分类 锁类型 读锁(共享锁)加读锁之后别...

  • redis

    redis Redis - 高并发,内存高速cache ,处理读写io的高并发容忍。 redis 通常被使用来将那...

  • 【java】并发-锁

    并发处理中常遇到的问题,多个线程同时竞争一个资源,为了正确处理竞争的问题,就需要锁。 锁 Lock java.ut...

  • 借助Redis锁,完美解决高并发秒杀问题

    借助Redis锁,完美解决高并发秒杀问题 场景:一家网上商城做商品限量秒杀。 1 单机环境下的锁(线程锁) 将商品...

  • 关于iOS线程锁的一点研究

    什么是锁 多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题。学术上对线...

  • 订单抢购中常见的并发问题及解决

    订单抢购中常见的并发问题及解决 抢购遇到的并发问题 常见的较优的解决方案 非阻塞的文件排他锁 redis队列,po...

  • 2019-03-18文章精选

    1.深入理解 MySQL ——锁、事务与并发控制 各种锁、事务与并发,写得很详细。 2.剖析分布式锁 redis部...

网友评论

      本文标题:redis锁处理并发问题

      本文链接:https://www.haomeiwen.com/subject/rldwbftx.html