Redis常用数据结构以及多并发场景下的使用分析:String类型

前言

楼主正在狂更新多并发部分的知识 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 的键值对 然后利用这个特性可以去实现分布式锁