Redis缓存数据库表(列单独缓存)

​ 在Redis中缓存数据库表数据,而不使用JSON结构来表示value,通常意味着我们会将数据库表的每一行数据映射为Redis中的一个或多个键值对。下面是一个简单的Java示例,展示了如何使用Jedis库来缓存数据库表的部分数据。

​ 假设我们有一个User表,它包含id、username和email字段,我们想要缓存id和username。

​ 首先,添加Jedis依赖到你的pom.xml中:

xml 复制代码
<dependencies>  
    <!-- 其他依赖... -->  
    <dependency>  
        <groupId>redis.clients</groupId>  
        <artifactId>jedis</artifactId>  
        <version>3.7.0</version> 
    </dependency>  
</dependencies>

​ 然后,创建User类和相关的操作类:

java 复制代码
import redis.clients.jedis.Jedis;  
  
// 数据库中的User表对应的Java类  
class User {  
    private int id;  
    private String username;  
    private String email;  
  
    // 构造器、getter和setter方法...  
}  
  
// Redis操作类  
class RedisCache {  
    private Jedis jedis;  
  
    public RedisCache(String host, int port) {  
        jedis = new Jedis(host, port);  
    }  
  
    // 缓存User数据  
    public void cacheUser(User user) {  
        String userIdKey = "user:id:" + user.getId();  
        String usernameKey = "user:username:" + user.getId();  
          
        jedis.set(userIdKey, String.valueOf(user.getId()));  
        jedis.set(usernameKey, user.getUsername());  
    }  
  
    // 根据ID获取缓存中的User数据  
    public User getUserById(int id) {  
        String userIdKey = "user:id:" + id;  
        String usernameKey = "user:username:" + id;  
          
        String userId = jedis.get(userIdKey);  
        String username = jedis.get(usernameKey);  
          
        if (userId != null && username != null) {  
            User user = new User();  
            user.setId(Integer.parseInt(userId));  
            user.setUsername(username);  
            // 注意:这里我们没有缓存email,所以需要从数据库获取或设为null  
            // 根据实际需求,你也可以选择缓存email或其他字段  
            return user;  
        }  
        return null;  
    }  
  
    // 关闭连接  
    public void close() {  
        if (jedis != null) {  
            jedis.close();  
        }  
    }  
}  
  
// 主类,用于演示如何使用RedisCache  
public class RedisCacheExample {  
    public static void main(String[] args) {  
        RedisCache redisCache = new RedisCache("localhost", 6379);  
  
        // 假设这是从数据库获取的User对象  
        User userFromDatabase = new User();  
        userFromDatabase.setId(1);  
        userFromDatabase.setUsername("john_doe");  
        userFromDatabase.setEmail("john.doe@example.com");  
  
        // 将User对象缓存到Redis中  
        redisCache.cacheUser(userFromDatabase);  
  
        // 从Redis中根据ID获取User对象  
        User cachedUser = redisCache.getUserById(1);  
        if (cachedUser != null) {  
            System.out.println("Cached User ID: " + cachedUser.getId());  
            System.out.println("Cached Username: " + cachedUser.getUsername());  
        } else {  
            System.out.println("User not found in cache");  
        }  
  
        // 关闭Redis连接  
        redisCache.close();  
    }  
}

​ 在这个例子中,我们创建了一个RedisCache类来管理Redis中的操作。cacheUser方法用于将User对象的部分信息(这里是id和username)存储到Redis中,而getUserById方法则根据ID从Redis中检索这些信息并重新构建User对象。注意,我们没有缓存email字段,所以如果你需要它,你需要从数据库获取或根据业务需求处理。

​ 这个示例没有包含实际的数据库访问代码,因为这取决于你使用的具体数据库和ORM框架。在实际应用中,你会从数据库中获取User对象,然后调用cacheUser方法将其缓存到Redis中。当需要获取用户信息时,首先尝试从Redis中通过getUserById方法获取,如果Redis中没有,再回退到数据库查询。

相关推荐
草莓熊Lotso6 分钟前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
Chenyu_3105 小时前
DPDK、TC 和 XDP:Linux 高性能网络到底在优化什么
linux·服务器·网络·缓存
Lethehong6 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码6 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
cspttty7 小时前
2027用户研究求职准备:应用统计学如何补齐研究设计与业务表达
大数据·数据库
我不会起名字3227 小时前
Redis 突然只能读不能写:MISCONF 报错的 3 类触发条件与 4 步恢复
运维·redis·持久化·排查·misconf
roman_日积跬步-终至千里8 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
猫咪很可爱8 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
我不会起名字3228 小时前
Redis 从 0 到 1(九):主库宕机 30 秒自动切主——1 主 2 从 3 哨兵 + Go 客户端
redis·docker·sentinel·高可用·哨兵
XLYcmy8 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包