Redis高并发分布式锁

0、简述

分布式锁的作用

解决高并发环境下数据一致性(Consistency)问题,将并发执行的代码串行化执行。

锁的概念

  由于并发操作破坏了事务的隔离性(Isolation)—即某个事务的数据可能会收到其他事务操作的影响,也会引发修改丢失、读脏数据、不可重复读等的一系列问题。给事务加锁(LOCK)是解决并发操作破坏隔离性的解决方案。

Redis

  Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hy.perloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster——摘自官网的介绍

  Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。它支持诸如字符串、散列、列表、集、带范围查询的排序集、位图、hy.perloglogs(博主注:HyperLogLog算法经常在数据库中被用来统计某一字段的Distinct Value)、带半径查询和流的地理空间索引等数据结构。Redis具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis哨兵和带有Redis集群的自动分区提供高可用性,Redis是单线程模型,具有把并行转化为串行的天然优势,当然也需要付出速度减慢的代价。

1、分布式问题

在对代码进行加锁后也不要忘记最后要将锁释放,这是最基本的锁的使用规则

业务代码异常

1
2
3
4
5
6
7
8
9
10
>//问题:当执行业务代码时抛异常,锁未正常释放
>//java异常的处理,在finally代码块中将锁释放
>try{
//业务代码
>}catch(Exception e){
//异常处理
>}finally{
//释放锁
lock.unlock();
>}

服务器宕机

1
2
>//问题:执行业务代码服务器宕机,锁未释放
>//给锁设置超时时间,注意保证【设置锁和超时时间】操作的一致性

超时时间设置不合理

  • 第一个线程把第二个线程的锁给释放了

    保证每个线程只释放自己的锁,给每个线程后加唯一标识UUID

  • 设置合理的超时时间

    开启分线程检查当前线程存储与redis中的锁是否还存在,为主线程的过期时间提供续航

主从集群架构

主节点已上锁,但未来得及与从节点同步主节点宕机

解决方案:待续。。。

Redission

----\(˙<>˙)/----赞赏一下吧~