# redission **Repository Path**: jackxsu/redission ## Basic Information - **Project Name**: redission - **Description**: redission 学习分享 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-08-08 - **Last Updated**: 2022-08-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 锁 > 解决并发时造成数据不一致的问题 ## 单应用 > 单应用启动解决方案 * synchronized关键字 * Lock相关接口 - ReentrantLock - ReadWriteLock * JUC(java.util.concurrent)包下的线程安全的类 - CAS自旋锁实现 * 传统线程安全类 - synchronized实现 - Hashtable - StringBuffer - Vector ## 集群 > 需考虑多应用并发 > 找中间件控制 ### CAP原则 CAP指的是在一个分布式系统中, 一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。 CAP原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。 ### 常用分布式锁 * 基于数据库实现分布式锁 - 悲观锁 利用select … where … for update - 乐观锁 CAS思想 update table set version=#{oldVersion} + 1 where version = #{oldVersion} * 基于缓存(Redis等)实现分布式锁(AP) ![AP](img/redis.png) - 一个节点数据保存成功,则返回成功 - 效率高 - 利用redis命令单线程执行的特性 - Redis 2.6.12版本:SET key value [EX seconds] [PX milliseconds] [NX|XX] + EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。 + PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。 + NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。 + XX : 只在键已经存在时, 才对键进行设置操作。 - 通过lua脚本实现可重入、锁续命等复杂逻辑 * 基于Zookeeper实现分布式锁(CP) ![CP](img/zk.png) - 半数节点以上节点成功,才返回成功 - 效率差 # 分布式锁redis版 ## 分布式锁需解决的问题 1. 防止并发执行 2. 可等待资源释放后执行(有超时) 3. 可重入 4. 锁续命,防止提前释放资源 5. 阻塞,非阻塞 6. 高可用 ## redisson redission是一个redis的java客户端,其与jedis、lettuce有着一样的功能。 [redisson wiki](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) ### 区别 | 客户端 | 连接 | 同步异步 | 线程安全 | springboot | 功能 | | --------- | ------------ | ------------------------ | ------------------------ | ---------- | ---------------------------------- | | jedis | http 短连接 | 同步和阻塞IO,不支持异步 | 不安全,一个线程一个连接 | 原生支持 | 封装性差、集群支持度低、高级特性少 | | lettuce | netty 长连接 | 支持异步 | 线程安全,多线程共享 | 原生支持 | 封装性好、集群支持度高、高级特性少 | | redission | netty 长连接 | 支持异步 | 线程安全,多线程共享 | 原生不支持 | 封装性好、集群支持度高、高级功能多 | ### 原理 ![原理](img/redisson.png)