大厂面试题详解:如何用Redis实现分布式锁?1、直接使用 set(key , value,NX,EX,timeout) 指令,同时设置锁和超时时间 。以上两种方法,使用哪种方式都可以 。释放锁的脚本两种方式都一样,直接调用 Redis 的 del 指令即可 。
【redis store redission是官方的吗】2、可以尽量把锁自动过期的时间设的冗余一些 。但也不能彻底解决 。可以在删除锁的时候先get值,判断值是否是当前线程存的随机值,只有相同才执行删锁的操作;当然也要使用 lua 脚本执行来保证原子性 。
3、如返回1,则该客户端获得锁,把lock.foo的键值设置为时间值表示该键已被锁定,该客户端最后可以通过DEL lock.foo来释放该锁 。如返回0,表明该锁已被其他客户端取得,这时我们可以先返回或进行重试等对方完成或等待锁超时 。
4、如果想要实现可重入的分布式锁的话,需要在设置value的时候加上线程信息和加锁次数的信息 。但是这是简单的思路 , 如果加上过期时间等问题之后,可重入锁就可能比较复杂了 。
5、使用分布式锁要满足的几个条件:系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现)共享资源(各个系统访问同一个资源,资源的载体可能是传统关系型数据库或者NoSQL) 。
6、原理很简单,set 一个 锁-key,如果成功则说明加锁成功,反之则失败 。
基于Redission使用Redis的Stream这里,有个group名字叫testGroup31 , 里面有消费者6个 , pending代表目前有6个数据被读取了,但没有ack 。last_delivered-id代表这个group目前读到哪条消息 。
创建Stream的名称是 stream-key 创建2个消息 , aa和bb 表示从最后一个元素消费,不包括Stream中的最后一个元素,即消费最新的消息 。
使用XLEN命令来获取一个Stream的条目数量:按范围查询: XRANGE 和 XREVRANGE 要根据范围查询Stream,我们只需要提供两个ID,即start 和 end 。返回的区间数据将会包括ID是start和end的元素 , 因此区间是完全包含的 。
虽然Redis提供了发布/订阅的功能,但是并不完善,导致基本没有合适的场景能够使用 。PubSub缺点:直到Redis0出现之后,出现了Stream这种数据结构,才终于完善了Redis的消息机制。
首先默认的队列监听是自动确认的 , 但是如出现异常不会自动确认,默认的失败机制是不断重试,这样会影响mq性能 。其次可以在配置文件中指定失败重试次数和重试间隔 。
推荐阅读
- 如何让虚拟机服务器连接到外网? 虚拟机服务器怎么到外网
- 如何使用opp服务器? opp服务器怎么使用
- 如何使用腾讯云服务器进行远程操作? 怎么用腾讯云服务器远程
- 如何将虚拟机服务器添加到主机中? 虚拟机服务器怎么加入主机
- 如何解决ops无法连接服务器的问题? ops连不上服务器怎么办
- 腾讯云服务器使用指南从零开始快速上手! 怎么用腾讯云服务器
- 如何让虚拟机服务器连接到外部网络? 虚拟机服务器怎么加入外网
- 如何在服务器上正确地关闭OP? op怎么在服务器里关服
- 如何利用腾讯云的服务器地址? 怎么用腾讯云的服务器地址