Redis命令参考手册详解:Java工程师的实战指南
一、Redis简介与核心特性
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),并提供了丰富的操作命令。其主要特性包括:
-
高性能:基于内存操作,读写速度极快
-
数据结构丰富:支持字符串、哈希、列表、集合、有序集合等
-
原子性:所有操作都是原子性的,支持事务
-
持久化:支持RDB和AOF两种持久化方式
-
高可用:支持主从复制、哨兵、集群模式
-
功能丰富:支持发布订阅、Lua脚本、流水线等
二、核心命令详解与Java实战示例
1. 通用命令(General)
通用命令是操作Redis的基础,常用于键的管理和系统状态查询。
常用命令:
-
DEL key:删除键 -
EXISTS key:判断键是否存在 -
KEYS pattern:查找匹配模式的键(生产环境慎用) -
EXPIRE key seconds:设置键的过期时间 -
TTL key:查看键的剩余生存时间
Java示例(使用Jedis):
Jedis jedis = new Jedis("localhost", 6379);
// 设置键值对
jedis.set("name", "huangz");
// 设置过期时间
jedis.expire("name", 60);
// 获取剩余时间
Long ttl = jedis.ttl("name");
// 判断键是否存在
Boolean exists = jedis.exists("name");
2. 字符串(String)
字符串是Redis中最基础的数据类型,常用于缓存、计数器等场景。
常用命令:
-
SET key value:设置键值 -
GET key:获取值 -
INCR key:自增1 -
DECR key:自减1 -
APPEND key value:追加字符串 -
GETSET key value:设置新值并返回旧值
Java示例:
// 计数器实现
jedis.set("page_view", "100");
jedis.incr("page_view"); // 自增1
String views = jedis.get("page_view"); // "101"
// 缓存示例
jedis.setex("cache_user", 300, "user_data"); // 设置带过期时间的缓存
3. 哈希表(Hash)
哈希表适合存储对象,如用户信息、商品属性等。
常用命令:
-
HSET key field value:设置字段值 -
HGET key field:获取字段值 -
HMSET key field1 value1 field2 value2:批量设置字段 -
HGETALL key:获取所有字段和值 -
HINCRBY key field increment:对字段值进行增减
Java示例:
// 存储用户信息
Map<String, String> user = new HashMap<>();
user.put("name", "huangz");
user.put("age", "30");
jedis.hmset("user:1001", user);
// 获取用户信息
Map<String, String> userInfo = jedis.hgetAll("user:1001");
String name = jedis.hget("user:1001", "name");
4. 列表(List)
列表可用于实现消息队列、最新消息列表等。
常用命令:
-
LPUSH key value:从左侧插入元素 -
RPUSH key value:从右侧插入元素 -
LPOP key:从左侧弹出元素 -
RPOP key:从右侧弹出元素 -
LRANGE key start stop:获取指定范围的元素 -
BLPOP key timeout:阻塞式左侧弹出
Java示例:
// 消息队列实现
jedis.lpush("task_queue", "task1");
jedis.lpush("task_queue", "task2");
String task = jedis.rpop("task_queue"); // 消费者获取任务
// 最新消息列表
jedis.lpush("news", "news1");
jedis.ltrim("news", 0, 9); // 只保留最新的10条
5. 集合(Set)
集合用于存储不重复的元素,支持交集、并集、差集等操作。
常用命令:
-
SADD key member:添加元素 -
SREM key member:移除元素 -
SMEMBERS key:获取所有元素 -
SINTER key1 key2:求交集 -
SUNION key1 key2:求并集 -
SISMEMBER key member:判断元素是否存在
Java示例:
// 标签系统
jedis.sadd("article:1001:tags", "java", "redis", "database");
jedis.sadd("article:1002:tags", "java", "spring");
// 获取共同标签
Set<String> commonTags = jedis.sinter("article:1001:tags", "article:1002:tags");
6. 有序集合(Sorted Set)
有序集合常用于排行榜、优先级队列等场景。
常用命令:
-
ZADD key score member:添加带分数的元素 -
ZRANGE key start stop:按分数升序获取元素 -
ZREVRANGE key start stop:按分数降序获取元素 -
ZRANK key member:获取元素排名 -
ZINCRBY key increment member:增加元素分数
Java示例:
// 排行榜实现
jedis.zadd("leaderboard", 100, "player1");
jedis.zadd("leaderboard", 200, "player2");
jedis.zincrby("leaderboard", 50, "player1"); // 增加分数
// 获取前三名
Set<String> top3 = jedis.zrevrange("leaderboard", 0, 2);
7. 发布订阅(Pub/Sub)
发布订阅模式用于实现消息广播、实时通知等。
常用命令:
-
PUBLISH channel message:发布消息 -
SUBSCRIBE channel:订阅频道 -
PSUBSCRIBE pattern:订阅模式
Java示例:
// 订阅者
JedisPubSub listener = new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("收到消息:" + message);
}
};
new Thread(() -> jedis.subscribe(listener, "news")).start();
// 发布者
jedis.publish("news", "Hello, Redis!");
8. 事务(Transaction)
Redis事务保证了一系列命令的原子性执行。
常用命令:
-
MULTI:开启事务 -
EXEC:执行事务 -
DISCARD:取消事务 -
WATCH key:监视键,实现乐观锁
Java示例:
// 使用事务
Transaction tx = jedis.multi();
tx.set("a", "1");
tx.incr("a");
tx.get("a");
List<Object> results = tx.exec(); // 返回所有命令的执行结果
9. Lua脚本(Scripting)
Lua脚本用于实现复杂的原子操作,避免竞态条件。
常用命令:
-
EVAL script numkeys key [key ...] arg [arg ...]:执行Lua脚本 -
EVALSHA sha1 numkeys key [key ...] arg [arg ...]:通过SHA1执行脚本 -
SCRIPT LOAD script:加载脚本 -
SCRIPT KILL:终止正在执行的脚本
Java示例:
// 执行Lua脚本实现原子操作
String script = "return redis.call('GET', KEYS[1])";
Object result = jedis.eval(script, 1, "mykey");
// 限流器示例
String luaScript = "local current = redis.call('incr', KEYS[1]) " +
"if current == 1 then redis.call('expire', KEYS[1], 1) end " +
"return current";
Long count = (Long) jedis.eval(luaScript, 1, "ip:127.0.0.1");
10. 连接与服务器管理
常用命令:
-
AUTH password:认证密码 -
SELECT index:选择数据库 -
INFO:获取服务器信息 -
CONFIG GET parameter:获取配置参数 -
CLIENT LIST:列出客户端连接 -
SLOWLOG GET:获取慢查询日志
Java示例:
// 获取服务器信息
String info = jedis.info();
System.out.println("Redis版本:" + jedis.info("server").split("\n")[0]);
// 获取慢查询日志
List<Slowlog> slowlogs = jedis.slowlogGet();
三、Redis在Java项目中的典型应用场景
1. 缓存加速
将热点数据(如用户信息、商品详情)缓存到Redis中,减少数据库压力。
2. 会话管理
使用Redis存储用户会话信息,实现分布式Session。
3. 消息队列
利用List结构实现简单的消息队列,或使用Pub/Sub实现实时消息推送。
4. 排行榜与计数器
使用有序集合实现实时排行榜,使用INCR命令实现访问计数。
5. 分布式锁
使用SETNX命令实现简单的分布式锁,确保资源互斥访问。
6. 限流与频率控制
结合Lua脚本实现IP限流、API调用频率控制等。
四、Redis使用注意事项与最佳实践
-
键名设计:使用冒号分隔的层次结构,如
user:1001:profile -
内存管理:合理设置过期时间,避免内存泄漏
-
管道优化:使用Pipeline批量执行命令,减少网络开销
-
连接池:使用连接池管理Redis连接,避免频繁创建连接
-
持久化策略:根据业务需求选择合适的RDB或AOF持久化方式
-
集群部署:数据量较大或并发较高时,考虑使用Redis集群
-
监控告警:监控Redis的内存、连接数、命中率等关键指标
五、总结
Redis以其高性能、丰富的数据结构和原子操作特性,成为Java开发中不可或缺的组件。通过合理使用Redis的各种命令和特性,我们可以构建出高性能、可扩展的分布式系统。建议在实际开发中,结合业务场景灵活选择数据结构,并注意性能优化和资源管理。
更多推荐



所有评论(0)