首页 > 数据库 >Redis分布式锁

Redis分布式锁

时间:2024-04-26 11:55:23浏览次数:25  
标签:redisson Redis 线程 一致性 节点 分布式

Redis分布式锁如何实现 ?

在Redis中提供了一个命令setnx(SET ifnot exists)
由于Redis的单线程的,用了命令之后,只能有一个客户端对某一个key设置值,在没有过期或删除key的时候是其他客户端是不能设置这个key的。

如何控制Redis实现分布式锁有效时长呢?

Redis的setnx指令不好控制这个问题,我们当时采用的Redis的一个框架redisson实现的。
redisson中需要手动加锁,并且可以控制锁的失效时间和等待时间,当锁住的一个业务还没有执行完成的时候,在redisson中引入了一个看门狗Watch Dog机制,就是说每隔一段时间就检查当前业务是否还持有锁,如果持有就增加加锁的持有时间,当业务执行完成之后需要使用释放锁就可以了。
还有一个好处就是,在高并发下,一个业务有可能会执行很快,先客户1持有锁的时候,客户2来了以后并不会马上拒绝,它会自选不断尝试获取锁,如果客户1释放之后,客户2就可以马上持有锁,性能也得到了提升。

redisson实现的分布式锁是可重入的吗?

候选人:嗯,是可以重入的。这样做是为了避免死锁的产生。这个重入其实在内部就是判断是否是当前线程持有的锁,如果是当前线程持有的锁就会计数,如果释放锁就会在计算上减一。在存储数据的时候采用的hash结构,大key可以按照自己的业务进行定制,其中小key是当前线程的唯一标识,val是当前线程重入的次数

redisson实现的分布式锁能解决主从一致性的问题吗

这个是不能的,比如,当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次获取锁,由于新的master节点没有同步旧master节点的数据,导致线程1和线程2同时拥有一个锁。
但是可以使用redisson提供的红锁来解决,但是这样的话,性能就太低了,如果业务中非要保证数据的强一致性,建议采用ZooKeeper实现的分布式锁。Redis满足AP思想,而ZooKeeper满足CP思想。

CAP原则

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),但是CAP 原则指示3个要素最多只能同时实现两点,不可能三者兼顾,由于网络硬件肯定会出现延迟丢包等问题,但是在分布式系统中,我们必须保证部分网络通信问题不会导致整个服务器集群瘫痪,另外即使分成了多个区,当网络故障消除的时候,我们依然可以保证数据一致性,所以我们必须保证分区容错性。
至于剩下的一致性和可用性,我们需要二选一,但是鱼和熊掌不可兼得,假设我们选择一致性,那我们就不能让用户访问无法进行数据同步的机器,毕竟该机器上的数据和其他正常机器上的不一致,但是这样我们就丢弃了可用性;假设我们选择可用性,那我们就可以让用户访问无法进行数据同步的服务器,虽然保证了可用性,但是我们无法保证数据一致性。

标签:redisson,Redis,线程,一致性,节点,分布式
From: https://www.cnblogs.com/worshipone/p/18159749

相关文章

  • redis相关
    redis是一种nosql数据库,sql是关系型数据库,nosql是非关系型数据库,一般以键值对、json、图数据库等为主sql中会存储包含外键的关系表,nosql更多以键值对嵌套形式来表示关系,缺点是没有约束容易重复。从查询语句上来说sql格式较为固定,优点是只要是关系型数据库都能用相同的sql语句查......
  • redis
    一、redis为什么快1.基于内存:内存读写效率远高于磁盘读写2.存储形式:键值对的内存数据库,哈希表结构O(1)时间复杂度可以获取值3.单线程:避免上下文切换4.IO多路复用:单个线程处理多个客户端链接5.编码:支持多种数据结构及编码,根据元素数量,有阀值,大于小于阀值的编码不......
  • Redis淘汰策略
    Redis过期策略有几种?Redis中提供八种过期策略,默认是noeviction,即不删除任何数据,当内存不足时会直接报错。可以在Redis的配置文件中进行设置。noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越......
  • Go+seata实现分布式事务
    docker安装seataversion:'3'services:seata-server:image:seataio/seata-server:latestports:-"8091:8091"-"7091:7091"environment:-SEATA_PORT=8091-STORE_MODE=filemysql:ima......
  • Redis场景
    redis应用场景Redis在缓存和队列方面有着广泛的应用场景,下面详细介绍一下:缓存应用场景:页面缓存:在Web应用中,Redis可以用作页面缓存,存储页面渲染结果,以减轻数据库的压力,提高页面响应速度。当用户请求某个页面时,首先检查Redis中是否存在该页面的缓存,如果存在则直接返回缓......
  • redis安装及使用
    Redis与传统数据库的一个主要区别在于,Redis把所有数据都存储在内存中,而传统数据库通常只会把数据的索引存储在内存中,并将实际的数据存储在硬盘中。为了满足不同的持久化需求,Redis提供了RDB持久化、AOF持久化和RDB-AOF混合持久化等多种持久化方式以供用户选择。如果用户有需要,也......
  • redis使用
    Pythonredis使用介绍|菜鸟教程(runoob.com)Python操作Redis,你要的都在这了!-John-Python-博客园(cnblogs.com)redis基本命令Stringset(name,value,ex=None,px=None,nx=False,xx=False)在Redis中设置值,默认,不存在则创建,存在则修改。参数:ex-过期时间(秒......
  • Redis过期策略
    在Redis中提供了两种数据过期删除策略:惰性删除:在设置该key过期时间后,我们不去管它。当需要该key时,我们会检查其是否过期,如果过期,就删除它;反之,返回该key。定期删除:每隔一段时间,我们会对一些key进行检查,删除其中过期的key。定期清理有两种模式:SLOW模式:使用定时任务,执行频率......
  • 分布式事务之dtm
    github: https://github.com/dtm-labs/dtm 本人使用场景,目前微服务中存在的用户服务,商品服务,订单服务,支付服务,在进行下单操作的时候,需要创建订单并扣减库存,这个时候就需要保证事务的一致性,但是对于目前的微服务架构来说就需要一套分布式的事务来实现,于是引入DT......
  • Redis 面试知识点
    1、Redis缓存数据库一致性采用最终一致性,而不是采用强一致性,强一致性会导致系统吞吐量变差;采用双删除的策略,第二次删除,采用延迟删除;推荐采用,先操作数据库,直接删除缓存的方式;删除失败的情况,采用异步方式,重试操作;读取binlog异步删除,使用开源框架canal,监听canal......