Redis 字符串(String)

命令 描述 语法
SET 设置指定键的值 `SET key value [EX seconds] [PX milliseconds] [NX
GET 获取指定键的值 GET key
INCR 将键对应的值自增 1,如果键不存在,先将其值设为 0 再自增 INCR key
DECR 将键对应的值自减 1,如果键不存在,先将其值设为 0 再自减 DECR key
INCRBY 将键对应的值增加指定的整数 INCRBY key increment
DECRBY 将键对应的值减少指定的整数 DECRBY key decrement
INCRBYFLOAT 将键对应的值增加指定的浮点数 INCRBYFLOAT key increment
SETNX 只有在键不存在时,设置键的值 SETNX key value
SETEX 设置键的值,并同时设置过期时间(秒) SETEX key seconds value
PSETEX 设置键的值,并同时设置过期时间(毫秒) PSETEX key milliseconds value
MSET 同时设置一个或多个键值对 MSET key1 value1 [key2 value2 ...]
MGET 同时获取一个或多个键的值 MGET key1 [key2 ...]
GETSET 设置键的新值,并返回键的旧值 GETSET key value
STRLEN 获取键对应值的字符串长度 STRLEN key

场景示例

  1. 缓存数据 假设我们有一个查询数据库获取用户信息的操作,为了减少数据库压力,我们可以将查询结果缓存到 Redis 中。
import redis.clients.jedis.Jedis;

public class StringCacheExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String userId = "1";
        String userInfo = "User details fetched from database";

        // 设置缓存,有效期 3600 秒(1 小时)
        jedis.setex("user:" + userId, 3600, userInfo);

        // 模拟从缓存获取数据
        String cachedUserInfo = jedis.get("user:" + userId);
        if (cachedUserInfo != null) {
            System.out.println("从缓存中获取到用户信息: " + cachedUserInfo);
        } else {
            System.out.println("缓存中未找到用户信息,需查询数据库");
        }

        jedis.close();
    }
}
  1. 计数器 比如统计网站的访问量,每次有用户访问时,对计数器进行自增操作。
import redis.clients.jedis.Jedis;

public class CounterExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String counterKey = "website:visits";

        // 每次访问自增 1
        long newCount = jedis.incr(counterKey);
        System.out.println("当前网站访问量: " + newCount);

        jedis.close();
    }
}
  1. 分布式锁 在分布式系统中,为了保证同一时间只有一个服务实例执行某个操作,可以使用 Redis 的 SETNX 命令实现简单的分布式锁。
import redis.clients.jedis.Jedis;

public class DistributedLockExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String lockKey = "resource:lock";
        String lockValue = System.currentTimeMillis() + 10000 + ""; // 锁的过期时间(10 秒后)

        // 尝试获取锁
        if (jedis.setnx(lockKey, lockValue) == 1) {
            try {
                System.out.println("获取到锁,执行关键操作...");
                // 模拟关键操作
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 释放锁
                if (jedis.get(lockKey).equals(lockValue)) {
                    jedis.del(lockKey);
                    System.out.println("释放锁");
                }
            }
        } else {
            System.out.println("未获取到锁,等待或重试...");
        }

        jedis.close();
    }
}
  1. 使用 MSET 和 MGET 批量操作 假设我们需要批量存储和获取多个用户的简单信息(如用户名和年龄)。
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;

public class MSetMGetExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        Map<String, String> userInfoMap = new HashMap<>();
        userInfoMap.put("user:1:name", "Alice");
        userInfoMap.put("user:1:age", "30");
        userInfoMap.put("user:2:name", "Bob");
        userInfoMap.put("user:2:age", "25");

        // 批量设置键值对
        jedis.mset(userInfoMap);

        // 批量获取键值对
        String[] keys = {"user:1:name", "user:1:age", "user:2:name", "user:2:age"};
        Map<String, String> resultMap = new HashMap<>();
        for (int i = 0; i < keys.length; i += 2) {
            resultMap.put(keys[i], jedis.get(keys[i]));
            resultMap.put(keys[i + 1], jedis.get(keys[i + 1]));
        }

        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        jedis.close();
    }
}
  1. 使用 GETSET 实现数据更新并返回旧值 假设我们有一个记录系统状态的变量,每次更新状态时需要返回旧状态。
import redis.clients.jedis.Jedis;

public class GetSetExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String statusKey = "system:status";

        // 初始化状态
        jedis.set(statusKey, "running");

        // 更新状态并获取旧状态
        String oldStatus = jedis.getSet(statusKey, "maintenance");
        System.out.println("旧系统状态: " + oldStatus);
        System.out.println("新系统状态: " + jedis.get(statusKey));

        jedis.close();
    }
}
  1. 使用 STRLEN 获取字符串长度 假设我们存储了一篇文章内容,需要获取文章的字符长度。
import redis.clients.jedis.Jedis;

public class StrLenExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String articleKey = "article:1";
        String articleContent = "This is a sample article for testing STRLEN command.";

        jedis.set(articleKey, articleContent);
        long length = jedis.strlen(articleKey);
        System.out.println("文章字符长度: " + length);

        jedis.close();
    }
}
#我的2024牛客高光时刻##牛客创作赏金赛##聊聊我眼中的AI#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务