> 📚 这是《[Redis应用实例 · Java 实战版](https://github.com/yourname/redis-in-action-java)》系列的第 1 篇。
> 💡 所有代码已开源至gitee:[https://gitee.com/zoumingbotu/redis-in-action-java.git)(https://github.com/yourname/redis-in-action-java)
> 🛑 本文不复制原书文字,仅提供 Java 实现参考,**强烈推荐购买原书支持作者**。
书籍目录:
https://www.ptpress.com.cn/shopping/buy?bookId=08689438-76f8-46ab-908a-364ecf4c5e5d
前言
最近在读人民邮电出版社2024年出版的《Redis应用实例》,这本书通过25个真实场景讲解了 Redis 的核心应用,非常实用。
但作为一个 Java 程序员,我发现书中的示例代码全是 Python 写的,理解起来有些障碍。于是,我决定把这本书的所有案例用 Java 重写一遍,并分享出来,希望能帮到和我一样的开发者。
本章我们来实现 **“缓存文本数据”** ——这是 Redis 最基础也最常用的场景之一。
📖 原书内容回顾
第 1章 缓存文本数据 3
1.1 需求描述 3
1.2 解决方案:使用字符串键缓存单项数据 3
1.3 实现代码:使用字符串键缓存单项数据 4
1.4 解决方案:使用JSON/哈希键缓存多项数据 5
1.5 实现代码:使用JSON/哈希键缓存多项数据 6
🛠️ 技术选型
本系列使用以下技术栈:
- Redis 客户端:`Jedis`(轻量级,适合教学)
- JSON 序列化:`Fastjson`
- 构建工具:Maven
✅Maven 依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
#✅ RedisUtils:Redis工具类,封装了jdesi连接和断开连接redis服务器
package com.foxbill.redisinaction;
import redis.clients.jedis.Jedis;
/**
* Redis工具类,提供Redis连接和断开连接的公共方法
*/
public class RedisUtils {
/**
* 连接到Redis服务器并选择指定数据库
* @param host Redis服务器地址
* @param port Redis服务器端口
* @param password Redis服务器密码
* @param timeout 连接超时时间(毫秒)
* @param dbIndex 数据库索引
* @return Jedis实例
*/
public static Jedis connectToRedis(String host, int port, String password, int timeout, int dbIndex) {
Jedis jedis = new Jedis(host, port, timeout);
jedis.auth(password); // 进行密码认证
jedis.select(dbIndex); // 选择指定数据库
System.out.println("成功连接到Redis服务器并选择数据库" + dbIndex);
return jedis;
}
/**
* 断开与Redis服务器的连接
* @param jedis Jedis实例
*/
public static void disconnectFromRedis(Jedis jedis) {
if (jedis != null && jedis.isConnected()) {
jedis.close();
System.out.println("已关闭Redis连接");
}
}
}
✅ MainApp:主应用类,包含了程序的主体框架
package com.foxbill.redisinaction;
import redis.clients.jedis.Jedis;
/**
* 主应用类,作为程序的入口点
* 负责统一管理Redis连接和调用其他功能模块
*/
public class MainApp {
public static void main(String[] args) {
System.out.println("======= redis in action with Jedis ======");
// Redis服务器连接信息
String host = "localhost";
int port = 6379;
String password = "Ro998otPass";
int timeout = 5000; // 连接超时时间(毫秒)
int dbIndex = 3; // 使用数据库3
Jedis jedis = null;
try {
//连接Redis
jedis = RedisUtils.connectToRedis(host, port, password, timeout, dbIndex);
System.out.println("");
mainfun(jedis);
System.out.println("");
} catch (Exception e) {
System.err.println("程序执行过程中发生错误: " + e.getMessage());
e.printStackTrace();
} finally {
//断开Redis连接
RedisUtils.disconnectFromRedis(jedis);
}
}
public static void mainfun(Jedis jedis) {
Chapter1.start(jedis);
}
}
✅ Chapter1:第一章需求实现类
package com.foxbill.redisinaction;
import com.alibaba.fastjson.JSON;
import com.foxbill.redisinaction.entity.User;
import redis.clients.jedis.Jedis;
public class Chapter1 {
public static void start(Jedis jedis) {
try {
cacheText(jedis);
cacheTextWithExpiretime(jedis);
cacheHash(jedis);
cacheJson(jedis);
} catch (Exception e) {
System.err.println("执行Redis操作时出错: " + e.getMessage());
}
}
/*使用字符串键缓存单项数据*/
private static void cacheText(Jedis jedis) {
// 设置字符串键值对
jedis.set("chapter1:hello", "Hello, Redis with Jedis!");
// 获取字符串键值对
String value = jedis.get("chapter1:hello");
System.out.println("获取键'chapter1:hello'的值: " + value);
}
/*使用字符串键缓存单项数据,同时设置过期时间*/
private static void cacheTextWithExpiretime(Jedis jedis) {
// 设置字符串键值对,并设置超时时间
long expireTime = 100L; //100秒
jedis.setex("chapter1:hello2", expireTime,"Hello2, Redis with Jedis!");
// 获取字符串键值对
String value = jedis.get("chapter1:hello2");
System.out.println("获取键'chapter1:hello2'的值,100秒后失效: " + value);
}
/*使用哈希键缓存多项数据*/
private static void cacheHash(Jedis jedis) {
// 设置hash
jedis.hset("chapter1:userinfo:id1","name", "zhang san");
jedis.hset("chapter1:userinfo:id1","age", "10");
jedis.hset("chapter1:userinfo:id1","id", "1");
// 获取hash
String name = jedis.hget("chapter1:userinfo:id1","name");
String age = jedis.hget("chapter1:userinfo:id1","age");
System.out.println("获取hash值: name:" + name + ",age:"+age);
}
/*使用JSON缓存多项数据*/
private static void cacheJson(Jedis jedis) {
// 设置字符串键值对
User user = new User("lisi",15);
String jsonString = JSON.toJSONString(user);
jedis.set("chapter1:userinfo:id2", jsonString);
// 获取字符串键值对
String value = jedis.get("chapter1:userinfo:id2");
User user1 = JSON.parseObject(value, User.class);
System.out.println("获取键'chapter1:userinfo:id2'的值: " + user1);
}
}
总结
| 方案 | 优点 | 缺点 | 适用场景 |
| 字符串键 | 简单直接 | 不适合结构化数据 | 单项缓存(如昵称、配置) |
| JSON哈希 | 可存储对象 | 序列化开销 | 完整对象缓存(如用户资料) |

被折叠的 条评论
为什么被折叠?



