前言
楼主正在狂更新多并发部分的知识 redis是其中非常重要的部分 那么:
我将用一系列的的文章分析redis中常用数据结构以及具体的使用场景
今天是第一个类型 String
请期待我的这一系列的更新!!!!
String
其实就是往 redis 中放 key -value 的键值对
应用场景:
缓存对象(JSON序列化)
计数器(incr/decr)
分布式锁
Session存储
缓存信息
java
// 缓存用户信息
public void cacheUser(String userId, String userInfo) {
String key = "user:" + userId;
redisTemplate.opsForValue().set(key, userInfo, Duration.ofMinutes(30));
}

计数器
java
// 计数器功能
public Long incrementViewCount(String articleId) {
String key = "article:views:" + articleId;
return redisTemplate.opsForValue().increment(key);
}

分布式锁 (重点)
java
// 分布式锁
public boolean tryLock(String lockKey, String requestId, long expireTime) {
return redisTemplate.opsForValue()
.setIfAbsent(lockKey, requestId, Duration.ofSeconds(expireTime));
}
public void releaseLock(String lockKey, String requestId) {
String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
"return redis.call('del', KEYS[1]) else return 0 end";
redisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class),
Collections.singletonList(lockKey), requestId);
}
背后其实是调用的是 SET key value NX EX time
方法 | 动作 | Redis 命令 |
---|---|---|
tryLock |
加锁 | SET key value NX EX time |
releaseLock |
解锁 | Lua 脚本 get + del |
参数 | 含义 | 形象解释 |
---|---|---|
SET |
设置键值对 | 把数据写入 Redis |
key |
锁的名称 | 比如 "lock:product:123" 表示商品123的锁 |
value |
请求标识 | 一般是 UUID 或 "requestId" ,表示是谁加的锁(比如张三) |
NX |
只在 key 不存在时才设置 | "我只预约会议室,如果它现在没人预约" |
EX time |
过期时间(单位:秒) | 自动释放锁,防止死锁,比如10秒 |
由于redis是单线程的所以
只有一个线程能够 去加锁
然后 释放锁的时候 拿着requestId去比对
只有属于自己的锁才能被释放掉,这就是分布式锁的实现原理
总结
String 类型 的数据结构其实就是往 redis 中放 key -value 的键值对 然后利用这个特性可以去实现分布式锁