点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (正在更新…)
章节内容
上节我们完成了:
- Redis缓存相关的概念
- 缓存穿透、缓存击穿、数据不一致性等
- HotKey、BigKey等问题
- 针对上述问题提出一些解决方案
分乐观锁介绍
乐观锁基于CAS(Compare And Swap)思想,比较和替换,是不具有互斥性,不会产生锁等待而消耗资源,但需要反复的重试,能比较快的响应。
Watch实现
watch介绍
我们可以使用 Redis 来实现乐观锁:
- 利用 Redis 的 watch 功能,监控 Redis-Key的状态值
- 获取 RedisKey 的值
- 创建 Redis 事务
- 给这个Key的值+1
- 然后去执行这个事务,如果 key 的值被修改过则修改,key不加1
wacth实现
暂时就先忽略编码规范的内容,就先实现即可。
具体编写逻辑如下:
运行之后,会看到已经在进行争抢了:
SETNX
setnx介绍
- 共享资源互斥
- 共享资源串行化
- 单应用中使用锁:单进程但是多线程
- synchronized、ReentrantLock
- 分布式应用中的锁:多进程多线程
- 分布式锁是控制分布式系统之间同步访问共享资源的一种方式
- 利用Redis的单线程特性对共享资源进行串行化处理
SETNX实现
获取锁方式1 SET
获取锁方式2 SETNX
释放锁方式1 del
注意,当调用del方法时候,如果这把锁已经不属于当前客户端了,比如已经过期了,而别的人拿到了这把锁,此时删除就会导致释放掉了别人的锁。
释放锁方式2 lua
Redisson分布式锁
Redisson介绍
- Redisson是假设在Redis基础上的Java驻内存数据网格(In-Memory Data Grid)
- Redisson是基于NIO的Netty框架上,生产环境使用分布式锁。
添加依赖
配置Redisson
获取与释放锁
业务使用
实现原理
分布式锁特性
- 互斥性:任意时刻,只能有一个客户端获取锁,不能同时有两个客户端获取到锁。
- 同一性:锁只能被持有该锁客户端删除,不能由其他客户端删除
- 可重入性:持有某个客户端可持续对该锁加锁 实现锁的续租
- 容错性:超过生命周期会自动进行释放,其他客户端可以获取到锁
常见分布式锁对比