以下是一个基于本地缓存 + Redis ZSet + 定时任务的榜单方案,适用于高并发场景:
方案概述
- 本地缓存 :在应用服务器本地缓存榜单数据,减少对 Redis 的访问频率,提高读取速度。
- Redis ZSet :使用 Redis 的有序集合存储榜单数据,利用其高效的排序和范围查询功能。
- 定时任务 :定期更新本地缓存和 Redis ZSet 中的榜单数据,确保数据的实时性和准确性。
数据存储架构
全局前 1000 名榜单存储在 Redis 中
More »Java, Spring Boot, Microservice, Cloud, Architecture and DevOps Tutorials
以下是一个基于本地缓存 + Redis ZSet + 定时任务的榜单方案,适用于高并发场景:
全局前 1000 名榜单存储在 Redis 中
More »在互联网领域,限流是指对进入系统的请求数量或频率进行控制的一种机制,以防止系统因流量暴增而过载,从而保障系统的稳定性和可用性。
当请求超过限流阈值时,系统可以采取不同的拒绝策略:
More »在实际项目中,区分偶发性超时和频繁超时的重试策略非常重要。偶发性超时可能是由于网络抖动或临时负载过高引起的,适合立即重试;而频繁超时则可能是系统过载或下游服务不可用,此时应避免重试,以免加剧问题。
在实际面试的过程中,经常会遇到类似的面试题目,这时候可以这样回答:
在处理大量请求时,我们经常会遇到超时的情况。为了合理控制重试行为,避免所谓的“重试风暴”,我设计了一个基于时间窗口的算法。在这个算法中,我们维护了一个滑动窗口,窗口内记录了每个请求的时间戳以及该请求是否超时。每当一个请求超时后,我们会统计窗口内超时的请求数量。如果超时请求的数量超过了设定的阈值,我们就认为当前系统压力较大,不适合进行重试;否则,我们认为可以安全地进行重试。
然而,随着并发量的增加,普通版的滑动窗口算法暴露出了一些问题。特别是在高并发场景下,窗口内需要维护的请求数量可能非常大,这不仅占用了大量内存,而且在判定是否需要重试时还需要遍历整个窗口,这大大增加了算法的时间复杂度。
为了解决这个问题,我们进一步设计了进阶版的算法。在这个版本中,我们引入了ring buffer 来优化滑动窗口的实现。具体来说,我们不再以时间为窗口大小,而是使用固定数量的比特位来记录请求的超时信息。每个比特位对应一个请求,用1表示超时,用0表示未超时。当所有比特位都被标记后,我们从头开始再次标记。
这种设计极大地降低了内存占用,因为无论并发量多高,我们只需要固定数量的比特位来记录请求的超时状态。同时,在判定是否需要重试时,我们只需要统计ring buffer中为1的比特数量,这大大简化了算法的实现并提高了效率。
More »
2024 年的付费软件:
TablePlus:
Typora:
ICloud:每月 6 元
B 站大会员:每月 15 元
More »今天我做了什么?
更新文章 我的VPS服务部署记录
将 memos 中的书签导入 hoarder,并将 memos 版本退回到 0.21.0 ,因为 0.21.0 之后的版本去掉了分享功能。同时需要修改 memos api,同步修改 fetch_memos.py 文件,将 https://memos.chensoul.cc/api/v1/memos 改为 https://memos.chensoul.cc/api/v2/memos
More »ThingsBoard 源码地址:https://github.com/thingsboard/thingsboard,其 .github/workflows 目录下面有两个文件:
check-configuration-files.yml
:使用 python 脚本校验 yaml 文件license-header-format.yml
:是给文件添加 license 并提交代码到 git 仓库check-configuration-files.yml
More »ThingsBoard 源码地址:https://github.com/thingsboard/thingsboard,启动成功之后,使用系统管理员: [email protected] / sysadmin 进行登陆。
登陆系统之后,点击左边的设置和安全菜单,进行相应的配置。
设置 -> 基本设置、发送邮件、通知
More »sdk install quarkus
quarkus create && cd code-with-quarkus
出现异常:
More »在本文中,我们将了解从 JUnit 4 迁移到 JUnit 5 所需的步骤。我们将了解如何运行新版本的现有测试,以及迁移代码需要进行哪些更改。
JUnit 5 与之前的版本不同,采用模块化设计。新架构的关键点在于将编写测试、扩展和工具之间的关注点分开。
More »