命令
描述
语法
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 |
场景示例
- 缓存数据
假设我们有一个查询数据库获取用户信息的操作,为了减少数据库压力,我们可以将查询结果缓存到 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();
}
}
- 计数器
比如统计网站的访问量,每次有用户访问时,对计数器进行自增操作。
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();
}
}
- 分布式锁
在分布式系统中,为了保证同一时间只有一个服务实例执行某个操作,可以使用 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();
}
}
- 使用 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();
}
}
- 使用 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();
}
}
- 使用 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#