一、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使用注意事项与最佳实践

  1. 键名设计:使用冒号分隔的层次结构,如 user:1001:profile

  2. 内存管理:合理设置过期时间,避免内存泄漏

  3. 管道优化:使用Pipeline批量执行命令,减少网络开销

  4. 连接池:使用连接池管理Redis连接,避免频繁创建连接

  5. 持久化策略:根据业务需求选择合适的RDB或AOF持久化方式

  6. 集群部署:数据量较大或并发较高时,考虑使用Redis集群

  7. 监控告警:监控Redis的内存、连接数、命中率等关键指标


五、总结

Redis以其高性能、丰富的数据结构和原子操作特性,成为Java开发中不可或缺的组件。通过合理使用Redis的各种命令和特性,我们可以构建出高性能、可扩展的分布式系统。建议在实际开发中,结合业务场景灵活选择数据结构,并注意性能优化和资源管理。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐