《Redis应用实例》Java实现(1):缓存文本数据(字符串键 + JSON哈希)

> 📚 这是《[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哈希可存储对象序列化开销完整对象缓存(如用户资料)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值