Redis(76)Redis作为缓存的常见使用场景有哪些?

作者:Victor356日期:2025/10/22

Redis作为缓存的常见使用场景包括数据库查询缓存、会话管理、分布式锁、缓存热点数据、计数器和限流等。以下是详细的说明和代码示例:

1. 数据库查询缓存

数据库查询缓存是最常见的使用场景之一,缓存数据库查询结果以减少直接访问数据库的频率,从而提升系统性能。

示例代码:

1import redis.clients.jedis.Jedis;
2import com.fasterxml.jackson.databind.ObjectMapper;
3
4public class DatabaseQueryCache {
5    private Jedis jedis;
6    private static final ObjectMapper objectMapper = new ObjectMapper();
7
8    public DatabaseQueryCache(Jedis jedis) {
9        this.jedis = jedis;
10    }
11
12    public <T> T getCachedData(String key, Class<T> clazz, DataProvider<T> provider, int cacheTime) {
13        try {
14            // 尝试从缓存中获取数据
15            String cacheValue = jedis.get(key);
16            if (cacheValue != null) {
17                return objectMapper.readValue(cacheValue, clazz);
18            }
19
20            // 如果缓存中没有数据,则从数据源中获取数据
21            T data = provider.getData();
22            // 将数据序列化后存储到缓存中,并设置缓存过期时间
23            jedis.setex(key, cacheTime, objectMapper.writeValueAsString(data));
24            return data;
25        } catch (Exception e) {
26            e.printStackTrace();
27            return null;
28        }
29    }
30
31    public interface DataProvider<T> {
32        T getData();
33    }
34
35    public static void main(String[] args) {
36        Jedis jedis = new Jedis("localhost", 6379);
37        DatabaseQueryCache cache = new DatabaseQueryCache(jedis);
38
39        String userId = "123";
40        String cacheKey = "user:" + userId;
41        int cacheTime = 3600; // 缓存 1 小时
42
43        User user = cache.getCachedData(cacheKey, User.class, () -> {
44            // 模拟从数据库查询用户数据
45            return getUserFromDatabase(userId);
46        }, cacheTime);
47
48        System.out.println("User: " + user);
49        jedis.close();
50    }
51
52    private static User getUserFromDatabase(String userId) {
53        // 模拟数据库查询
54        User user = new User();
55        user.setId(userId);
56        user.setName("John Doe");
57        user.setEmail("[email protected]");
58        return user;
59    }
60
61    static class User {
62        private String id;
63        private String name;
64        private String email;
65
66        // Getters and Setters
67
68        @Override
69        public String toString() {
70            return "User{id='" + id + "', name='" + name + "', email='" + email + "'}";
71        }
72    }
73}
74

2. 会话管理

将用户会话信息存储在Redis中,以实现分布式会话管理。这样可以在多个服务器之间共享会话信息,提高系统的可扩展性和高可用性。

示例代码:

1import redis.clients.jedis.Jedis;
2
3import java.util.UUID;
4
5public class SessionManager {
6    private Jedis jedis;
7
8    public SessionManager(Jedis jedis) {
9        this.jedis = jedis;
10    }
11
12    public String createSession(String userId) {
13        String sessionId = UUID.randomUUID().toString();
14        String key = "session:" + sessionId;
15        jedis.hset(key, "userId", userId);
16        jedis.expire(key, 3600); // 会话过期时间为1小时
17        return sessionId;
18    }
19
20    public String getUserIdBySessionId(String sessionId) {
21        String key = "session:" + sessionId;
22        return jedis.hget(key, "userId");
23    }
24
25    public void destroySession(String sessionId) {
26        String key = "session:" + sessionId;
27        jedis.del(key);
28    }
29
30    public static void main(String[] args) {
31        Jedis jedis = new Jedis("localhost", 6379);
32        SessionManager sessionManager = new SessionManager(jedis);
33
34        // 创建会话
35        String sessionId = sessionManager.createSession("user123");
36        System.out.println("Session created: " + sessionId);
37
38        // 获取用户ID
39        String userId = sessionManager.getUserIdBySessionId(sessionId);
40        System.out.println("User ID: " + userId);
41
42        // 销毁会话
43        sessionManager.destroySession(sessionId);
44        System.out.println("Session destroyed.");
45
46        jedis.close();
47    }
48}
49

3. 分布式锁

Redis提供了便捷的分布式锁功能,用于在分布式系统中实现互斥访问共享资源。

示例代码:

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.params.SetParams;
3
4public class RedisDistributedLock {
5    private Jedis jedis;
6    private String lockKey;
7    private String lockValue;
8    private int expireTime;
9
10    public RedisDistributedLock(Jedis jedis, String lockKey, int expireTime) {
11        this.jedis = jedis;
12        this.lockKey = lockKey;
13        this.expireTime = expireTime;
14        this.lockValue = String.valueOf(Thread.currentThread().getId());
15    }
16
17    public boolean acquireLock() {
18        SetParams params = new SetParams().nx().px(expireTime);
19        String result = jedis.set(lockKey, lockValue, params);
20        return "OK".equals(result);
21    }
22
23    public boolean releaseLock() {
24        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
25                           "return redis.call('del', KEYS[1]) else return 0 end";
26        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
27        return result.equals(1L);
28    }
29
30    public void executeWithLock(Runnable task) {
31        if (acquireLock()) {
32            try {
33                task.run();
34            } finally {
35                boolean released = releaseLock();
36                if (!released) {
37                    System.out.println("Failed to release lock.");
38                }
39            }
40        } else {
41            System.out.println("Failed to acquire lock, try again later.");
42        }
43    }
44
45    public static void main(String[] args) {
46        Jedis jedis = new Jedis("localhost", 6379);
47        RedisDistributedLock lock = new RedisDistributedLock(jedis, "resource_lock", 10000);
48
49        lock.executeWithLock(() -> {
50            System.out.println("Executing critical section.");
51            try {
52                Thread.sleep(5000);
53            } catch (InterruptedException e) {
54                Thread.currentThread().interrupt();
55            }
56            System.out.println("Critical section completed.");
57        });
58
59        jedis.close();
60    }
61}
62

4. 缓存热点数据

将频繁访问的热点数据缓存到Redis中,以提高响应速度和系统吞吐量。

示例代码:

1import redis.clients.jedis.Jedis;
2
3import java.util.HashMap;
4import java.util.Map;
5
6public class HotDataCache {
7    private Jedis jedis;
8
9    public HotDataCache(Jedis jedis) {
10        this.jedis = jedis;
11    }
12
13    public Map<String, String> getHotData(String key) {
14        Map<String, String> data = jedis.hgetAll(key);
15        if (data.isEmpty()) {
16            data = fetchDataFromDatabase(key);
17            jedis.hmset(key, data);
18            jedis.expire(key, 3600); // 设置缓存过期时间1小时
19        }
20        return data;
21    }
22
23    private Map<String, String> fetchDataFromDatabase(String key) {
24        // 模拟从数据库获取热点数据
25        Map<String, String> data = new HashMap<>();
26        data.put("field1", "value1");
27        data.put("field2", "value2");
28        return data;
29    }
30
31    public static void main(String[] args) {
32        Jedis jedis = new Jedis("localhost", 6379);
33        HotDataCache cache = new HotDataCache(jedis);
34
35        String key = "hot_data:123";
36        Map<String, String> data = cache.getHotData(key);
37        System.out.println("Hot data: " + data);
38
39        jedis.close();
40    }
41}
42

5. 计数器和限流

使用Redis的原子操作实现计数器和限流功能,如实现API请求限流、访问计数等。

示例代码:

1import redis.clients.jedis.Jedis;
2
3public class RateLimiter {
4    private Jedis jedis;
5    private String key;
6    private int limit;
7    private int expireTime;
8
9    public RateLimiter(Jedis jedis, String key, int limit, int expireTime) {
10        this.jedis = jedis;
11        this.key = key;
12        this.limit = limit;
13        this.expireTime = expireTime;
14    }
15
16    public boolean isAllowed() {
17        long count = jedis.incr(key);
18        if (count == 1) {
19            jedis.expire(key, expireTime); // 设置过期时间
20        }
21        return count <= limit;
22    }
23
24    public static void main(String[] args) {
25        Jedis jedis = new Jedis("localhost", 6379);
26        RateLimiter limiter = new RateLimiter(jedis, "api_rate_limiter", 100, 60); // 每分钟限制100次请求
27
28        for (int i = 0; i < 120; i++) {
29            if (limiter.isAllowed()) {
30                System.out.println("Request " + (i + 1) + ": allowed");
31            } else {
32                System.out.println("Request " + (i
33

Redis(76)Redis作为缓存的常见使用场景有哪些?》 是转载文章,点击查看原文


相关推荐


Redis(74)Redis分布式锁与ZooKeeper分布式锁有何区别?
Victor3562025/10/21

Redis和ZooKeeper都是用来实现分布式锁的常用工具,但它们在实现机制、性能、可用性和一致性方面有显著区别。以下是详细的比较和结合代码的解释。 1. 实现机制 Redis分布式锁: 实现机制:基于简单的字符串操作,通过SET NX PX命令来实现锁,使用Lua脚本确保原子性。Redis是一个内存数据库,操作速度非常快。 一致性:Redis提供的是最终一致性,不能完全保证严格的强一致性。 可用性:Redis是AP系统(高可用性和分区容错性),可能在网络分区时提供较高的可用性,但在一致性方


Qt的QT_QPA_EGLFS_INTEGRATION环境变量浅解
华丽的周遭2025/10/20

在Qt嵌入式开发中,环境变量QT_QPA_EGLFS_INTEGRATION用于控制 ​​EGLFS(Embedded GL Framework for Systems)平台插件​​ 与底层显示子系统的集成方式。 它主要适用于基于OpenGL ES的无头(Headless)或嵌入式设备场景(如无X11/Wayland的嵌入式Linux系统),尤其在ZynqMP这类SoC方案中,常用于配置Qt应用的图形渲染与显示输出。 ​​一、核心作用​​ EGLFS是Qt提供的轻量级平台插件,直接通过EG


【粉丝福利社】从算筹到卫星导航:这本书藏着人类文明的进化密码
愚公搬代码2025/10/18

💎【行业认证·权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者 🏆【荣誉殿堂】 🎖 连续三年蝉联"华为云十佳博主"(2022-2024) 🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023) 🎖 十余个技术社区年度杰出贡献奖得主 📚【知识宝库】 覆盖


Git提交后追加修改操作指南
字节逆旅2025/10/17

在开发时经常会遇到在git commit后,又把文件修改了一下的情况,此时要如何操作才能避免提交多个commit呢? 前面你已经走了这两步: git add . git commit -m "fix:修改了一个bug" 此时你提交的代码还在本地暂存区,然后你又发现没改完,又有新修改文件产生。 接下来,你的操作步骤应该是这样的: 基本步骤 将修改的文件添加到暂存区(Staging Area) 这里还是和你平时提交前一样,使用 git add 命令。 # 添加某个特定文件 git add <


前端必备:JS数组与对象完全指南,看完秒变数据处理高手!
良山有风来2025/10/16

一、为什么你的代码总是处理不好数据? 你是不是经常遇到这样的场景: 从后端拿到一堆数据,却不知道如何快速筛选出需要的内容 想要对数据进行排序、过滤、转换,却写出一堆复杂的for循环 面对嵌套的对象结构,感觉像是在走迷宫,总是找不到想要的数据 别担心,这都不是你的问题!很多前端开发者都在数据处理上栽过跟头。今天这篇文章,就带你彻底掌握JavaScript中最核心的两种数据结构:数组和对象。 读完本文,你将获得: 数组和对象的完整操作方法大全 实际开发中最常用的数据处理技巧 避免常见坑点的最佳


云原生-k8s
dalianwawatou2025/10/14

k8s的优缺点 优点:部署应用方便,具有高可用、负载均衡功能,能自动扩容、对Pod进行监控 缺点:需要很多机器,成本投入大 安装 服务器准备 首先安装三台虚拟机,一台主节点,两台从节点,规划如下 操作系统:Rocky_linux9.6 配置: 4核cpu +/8Gib 内存/20G磁盘 网卡模式:NAT 角色IP主机名主节点master192.168.52.131k8s1从节点node1192.168.52.132k8s2从节点node2192.168.52.133k8s3


HTTPS 真的牢不可破吗?—— 中间人攻击与安全机制解析
程序员三明治2025/10/13

👨‍💻程序员三明治:个人主页 🔥 个人专栏: 《设计模式精解》 《重学数据结构》 🤞先做到 再看见! 在实际应用中,我们可能会遇到这样的情况:当客户端通过浏览器向服务端发起 HTTPS 请求时,请求被“假基站”劫持并转发至“中间人服务器”。于是,客户端实际上是与中间人完成了 TLS 握手,而中间人再与真正的服务端建立 TLS 连接。具体流程如下: 具体过程如下: 客户端发起 HTTPS 连接请求,被假基站重定向至中间人服务器。中间人随后向真实服务端发起 H


苦练Python第62天:零基础玩转CSV文件读写,csv模块实战​
倔强青铜三 VIP.1 初学乍练2025/10/11

前言 大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连! 欢迎来到苦练Python第62天! 今天我们来学习Python标准库中的csv模块。 一、CSV 是什么?能做什么? CSV(Comma-Separated Values,逗号分隔值)是一种纯文本表格格式。 每行是一条记录(record),行内每个字段(field)用分隔符(通常是逗号)隔开。 结构简单、体积小、兼容性强,几乎所有电子表格、数据库、数据分析工具都支持。 常见场景 Excel /


某大厂跳动面试:计算机网络相关问题解析与总结
360_go_php2025/10/10

​ 在参加像字节跳动这样的互联网公司面试时,计算机网络的知识是一个常见的考察点。以下是一些常见的计算机网络面试问题和详细解答,在面试中打下坚实的基础。 1. HTTPS通信过程 HTTPS (HyperText Transfer Protocol Secure) 是一种安全的 HTTP 协议,通过 TLS/SSL 加密实现数据的保密性和完整性。HTTPS 的通信过程包括以下几个步骤:​编辑 客户端发起连接:客户端向服务器发送请求,使用 HTTPS 协议。 服务器响应:服务器返回其 SSL/T


CentOS安装Jenkins
何中应2025/10/8

说明:之前介绍过用 Docker 的方式部署 Jenkins,本文介绍通过安装包的方式部署最新版的 Jenkins 在云服务器上安装Jenkins 第一步:准备工作 安装 Jenkins 的前提,是需要服务器有 JDK、Maven 和 Git 环境,如下: 这几个环境,参看上面的文章进行安装,最新版的 Jenkins 需要 JDK17 或 JDK21,Maven 最好装 3+ 第二步:安装启动 找一个合适的目录,下载 Jenkins 安装包 wget https://mirro

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0