Java的JUC并发库及其应用场景
Java 的 JUC(java.util.concurrent) 包是 Java 并发编程的核心工具集,提供了高性能、线程安全的并发类。以下是主要 JUC 类及其应用场景的详细分类解析:
一、锁与同步工具
1. ReentrantLock
- 特点:可重入、支持公平/非公平锁、可中断、超时尝试。
- 应用场景:
- 替代
synchronized
实现更灵活的锁控制。 - 需要尝试获取锁或可中断锁的场景(如死锁恢复)。
- 替代
- 示例:
1
2
3
4
5
6
7ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
Redis底层数据结构
1. 类型与编码
1.1 对象类型
对象类型 | 类型常量 | TYPE命令的输出 |
---|---|---|
String | REDIS_STRING | “string” |
List | REDIS_LIST | “list” |
Hash | REDIS_HASH | “hash” |
Set | REDIS_SET | “set” |
Sorted Set | REDIS_ZSET | “zset” |
1.2 对象编码
编码常量 | 底层数据结构 | TYPE命令的输出 |
---|---|---|
REDIS_ENCODING_INT | long 类型的整数 | “int” |
REDIS_ENCODING_EMBSTR | embstr 编码的简单动态字符串 | “embstr” |
REDIS_ENCODING_RAW | 简单动态字符串 | “raw” |
REDIS_ENCODING_HT | 字典 | “hashtable” |
REDIS_ENCODING_LINKEDLIST | 双端链表 | “linkedlist” |
REDIS_ENCODING_ZIPLIST | 压缩列表 | “ziplist” |
REDIS_ENCODING_QUICKLIST | 快速链表 | “quicklist” |
REDIS_ENCODING_INTSET | 整数集合 | “intset” |
REDIS_ENCODING_SKIPLIST | 跳跃表和字典 | “skiplist” |
Redis主从复制Docker命令
Redis实现分布式锁Lua脚本
1. 简单锁
采用键值对存储,键是锁的标识,值是全局唯一值(如uuid)。
1.1 获取锁
1 | -- lua in redis |
1.2. 释放锁
1 | -- lua in redis |
Redis实现限流器Lua脚本
基于Redis位图实现用户签到功能
1. 场景需求
适用场景如签到送积分、签到领取奖励等,大致需求如下:
- 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等。
- 如果连续签到中断,则重置计数,每月初重置计数。
- 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3……等等。
- 显示用户某个月的签到次数和首次签到时间。
- 在日历控件上展示用户每月签到情况,可以切换年月显示……等等。
2. 设计思路
对于用户签到数据,如果每条数据都用K/V的方式存储,当用户量大的时候内存开销是非常大的。而位图(BitMap)是由一组bit位组成的,每个bit位对应0和1两个状态,虽然内部还是采用String类型存储,但Redis提供了一些指令用于直接操作位图,可以把它看作是一个bit数组,数组的下标就是偏移量。它的优点是内存开销小、效率高且操作简单,很适合用于签到这类场景。