玖叶教程网

前端编程开发入门

如何解决 Redis 并发竞争 Key 问题?

主要两种方式可以解决,一种是「分布式锁」,另外一种是「队列」。

分布式锁

大概原理是使用一个状态值来表示锁,通过对这个状态值的占有和释放来解决同一时刻,只能有一个客户端持有锁。

唯一锁ID

程序中为避免进程或线程竞争资源,通常会使用分布式锁。但为了保证锁唯一性,通常给每个锁设置一个唯一ID,在删除之前先判断是否属于自己的那把锁。

UUID:32位16进制数字,例如:c5d00615-14a6-7abc-5b0d-faf4a122173b

Redis:可以使用 Redis 的 INCR 或 INCRBY 命令来生成唯一锁 ID

雪花算法:使用 Snowflake 算法生成 long 型的锁 ID

续命锁

开启一个子线程(守护线程/看门狗线程),实时检查业务线程是否还在执行,如果还未执行完,则将锁的过期时间延长,当业务线程完成,则释放守护线程。通常守护线程的过期时间是业务线程时长的一半。

Redisson

这是一个在 Redis 基础上提供了一些分布式特性的工具类。除了支持丰富的数据结构外,还提供了很多高阶的应用场景,比如联锁(MultiLock)、读写锁(ReadWriteLock)、公平锁(Fair Lock)、红锁(RedLock)、信号量(Semaphore)等实际应用高并发的场景。

消息队列

高并发的情况下,可以将待处理的数据加入到消息队列中,通过串行的方式进行处理。

Kafka

Kafka是一个分布式流处理平台,它可以处理大量的实时数据流,并提供高吞吐量,低延迟,高可靠性和高可用性。Kafka的主要特点是基于发布-订阅模式,支持多个生产者和消费者,并且保证消息的有序性和一致性。Kafka还提供了分区,复制,偏移量等机制来实现负载均衡,容错和数据持久化。Kafka适合处理高并发,高吞吐量,低延迟的场景,例如日志收集,事件处理,流式计算等。

MQ

mq是一个广义的概念,指的是任何支持消息传递的中间件。常见的mq有RabbitMQ,ActiveMQ,RocketMQ等。mq的主要特点是基于队列模式,支持点对点和发布-订阅两种通信模式,并且提供了事务,确认,重试,死信等机制来保证消息的可靠传递。mq适合处理复杂的业务逻辑,需要保证消息顺序和事务一致性的场景,例如订单处理,支付通知,库存同步等。

Redis

redis是一个开源的内存数据库,它可以存储多种类型的数据结构,并提供高性能,高可用性和高扩展性。redis的主要特点是基于内存存储,支持多种数据结构,并且提供了发布-订阅,事务,过期等机制。redis可以利用其列表数据结构来实现简单的消息队列功能,但是它不支持消息确认和重试机制,也不保证消息的有序性和一致性。redis适合处理简单的异步任务,需要快速响应和低成本的场景,例如缓存更新,验证码发送,排行榜更新等。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言