图解Redis适用场景
Redis以其速度而闻名。
1 业务数据缓存
1.1 通用数据缓存
string,int,list,map。Redis 最常见的用例是缓存对象以加速 Web 应用程序。
此用例中,Redis 将频繁请求的数据存储在内存。允许 Web 服务器快速返回频繁访问的数据。这减轻数据库的负载并提高应用程序RT。
规模扩张时,缓存分布在 Redis 服务器集群中。分片可平均分配集群中的缓存负载。
1.2 实时热数据
最新N条数据
2 会话存储
在无状态服务器之间共享会话数据。当用户登录 Web 应用程序时,会话数据与唯一会话 ID 一起存储在 Redis并作为 cookie 返给客户端。
当用户向应用程序发出请求时,请求中包含会话 ID,无状态 Web 服务器使用 ID 从 Redis 检索会话数据。
风险
若 Redis 服务器重启,则存储在 Redis 中的会话数据丢失。尽管 Redis 通过RDB和 AOF 或仅追加文件提供持久性,它们允许将会话数据保存到磁盘并在重启事件中重新加载到内存。但这些选项在生产通常需要太长时间加载,并不实用。相反,在这种情况下使用复制。数据复制到备份实例。在主实例崩溃时,备份实例会很快被提升以接管流量。
Redis 会话存储 V.S JWT 技术
各有优势,选择取决于具体的应用场景和需求:
安全性:JWT 更加安全,因为它不需要服务器端存储会话数据,全部的数据可以通过加密的 JWT 编码在客户端;而 Redis 存储在服务器端,如果 Redis 被攻击可能会洩漏会话数据。
伸缩性:Redis 会话存储更易水平扩展,通过集群可以很好的承载大量会话;JWT 需要应用层进行扩展。
实现难度:Redis 会话存储实现简单,直接利用 Redis API 即可;JWT 需要选用算法和密钥,客户端和服务端都需要一些代码实现。
跨域访问:JWT 更适合跨域场景,因为可以直接在请求头中携带。Redis只能在同域下访问。
适用场景:
- 需要 sessions 的场景更适合 Redis 会话存储,比如要跟踪用户状态的 web 应用。
- 对安全性要求高的 API、跨域应用更适合 JWT。
- 如果是内部系统或者对安全要求不高,Redis会话存储就足够了。
所以,你需要根据应用的具体场景、安全性需求、实现成本等因素权衡考虑,选择更适合的会话管理方案。两者也可以结合使用。
3 全局一致计数
全局流控计数(Rate Limiter)
简单的限流组件,但有问题,不建议使用。还是要用滑动窗口算法。
使用其在某些计数器上递增命令并为这些计数器设置到期时间来用作Rate Limiter。
基本的速率限制算法的工作原理
对于每个传入的请求,请求 IP 或用户ID 作K。
使用incr 命令递增K的请求数。 将当前计数与允许的速率限制比较:
- 若计数在速率限制内,则处理请求
- 若计数超过限制,则拒绝请求
K被设置为在特定时间窗口内过期,如 1min,以便为下一时间窗口重置计数。
诸如漏桶算法类的更复杂Rate Limiter也可用 Redis 实现。
秒杀的库存计算
抢红包
全局唯一ID
4 高效的统计计数
- id去重 记录访问ip等全局bitmap操作
- UV、PV等访问量 非严格一致性要求
5 发布订阅与Stream
Pub-Sub 模拟队列 subscribe comments publish comments java
Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于MQ。
可参考 https://www.runoob.com/redis/redis-stream.html
6 分布式锁
当应用程序中的多个节点需要协调对某些共享资源的访问时,使用分布式锁。 Redis 用作分布式锁,具有原子命令如 SETNX 或如果不存在则设置,使得caller只在K不存在时才能设置K。
工作原理
Client 1试图通过使用 SETNX 命令设置具有唯一值和TTL的K来获取锁。如果该K尚未设置,则 SETNX 返回1表示锁已被Client 1获得。Client 1完成其工作。
通过删除键来释放日志。现在,若K已设置,SETNX返回 0,表示锁已经被另一客户端持有。此时,Client 1会等待并重试 SETNX 操作,直到另一个客户端释放该锁。
对许多用例来说,这个简单的实现可能就足够好了,但它对生产使用来说不是完全容错。许多 Redis 客户端库提供直接开箱即用的高质量分布式锁实现。
获取锁 原子性操作
SET dlock my_random_value NX PX 30000
释放锁,lua脚本,保证原子性+单线程,从而具有事务性
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])
else return 0
end
7 业务数据处理
- 非严格一致性要求的数据:评论,点击等
- 业务数据去重:订单处理的幂等校验等
- 业务数据排序:排名,排行榜等
本文由博客一文多发平台 OpenWrite 发布!
相关文章:

图解Redis适用场景
Redis以其速度而闻名。 1 业务数据缓存 1.1 通用数据缓存 string,int,list,map。Redis 最常见的用例是缓存对象以加速 Web 应用程序。 此用例中,Redis 将频繁请求的数据存储在内存。允许 Web 服务器快速返回频繁访问的数据。这…...

掌握Python BentoML:构建、部署和管理机器学习模型
更多资料获取 📚 个人网站:ipengtao.com BentoML是一个开源的Python框架,旨在简化机器学习模型的打包、部署和管理。本文将深入介绍BentoML的功能和用法,提供详细的示例代码和解释,帮助你更好地理解和应用这个强大的工…...

西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告
目录 一、计算/设计过程 二、画出并填写实验指导书上的预表 三、画出并填写实验指导书上的虚表 四、粘贴原理仿真、工程仿真截图 一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入…...

熟悉SVN基本操作-(SVN相关介绍使用以及冲突解决)
一、SVN相关介绍 1、SVN是什么? 代码版本管理工具它能记住你每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2、SVN跟Git比,有什么优势 使用简单,上手快目录级权限控制,企业安全必备子目录checkout,减少…...
代码随想录二刷 |字符串 |反转字符串II
代码随想录二刷 |字符串 |反转字符串II 题目描述解题思路 & 代码实现 题目描述 541.反转字符串II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果…...

哪吒汽车拔头筹,造车新势力首家泰国工厂投产
中国造车新势力首家泰国工厂投产!11月30日,哪吒汽车位于泰国的首家海外工厂——泰国生态智慧工厂正式投产下线新车,哪吒汽车联合创始人兼CEO张勇、哪吒汽车泰国合作伙伴BGAC公司首席执行官万查曾颂翁蓬素等出席仪式。首辆“泰国制造”的哪吒汽…...

Redis String类型
String 类型是 Redis 最基本的数据类型,String 类型在 Redis 内部使用动态长度数组实现,Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先,Redis 中所…...

lxd提权
lxd/lxc提权 漏洞介绍 lxd是一个root进程,它可以负责执行任意用户的lxd,unix套接字写入访问操作。而且在一些情况下,lxd不会调用它的用户权限进行检查和匹配 原理可以理解为用用户创建一个容器,再用容器挂载宿主机磁盘…...

Ubuntu+Tesla V100环境配置
系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 查看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…...

leetcode:用栈实现队列(先进先出)
题目描述 题目链接:232. 用栈实现队列 - 力扣(LeetCode) 题目分析 我们先把之前写的数组栈的实现代码搬过来 用栈实现队列最主要的是实现队列先进先出的特点,而栈的特点是后进先出,那么我们可以用两个栈来实现&…...
<JavaEE> 什么是进程控制块(PCB Process Control Block)?
目录 一、进程控制块的概念 二、进程控制块的重要属性 2.1 唯一身份标识(PID) 2.2 内存指针 2.3 文件描述符表 2.4 状态 2.5 优先级 2.6 记账信息 2.7 上下文 一、进程控制块的概念 进程控制块(Process Control Block, PCBÿ…...

简历上的工作经历怎么写
通过了简历筛选,后续的面试官会仔细阅读你的简历内容。他们在找什么呢?他们希望搞清楚你在某一段经历中具体干了什么,并且判断你的能力具体达到了什么水平。 简历在线制作下载:百度幻主简历 面试官喜欢具体的经历 越具体&#x…...
数值分析总结
数值分析总结思维导图 Docs 相关代码的使用和注释 列主元Gauss消元法 %%列主元高斯消元法 function xGauss_lzy(A,b)%A为方程组系数矩阵,b为方程组的右侧向量,x为方程组的解 [n,m]size(A);%%得到矩阵A的行和列的宽度 nblength(b);%%方程组右侧向量的长…...
osg demo汇总
1.example_osganimate 演示了路径动画的使用(AnimationPath、AnimationPathCallback),路径动画回调能够做用在Camera、CameraView、MatrixTransform、PositionAttitudeTransform等四种类型的节点上。 演示了osgSim::OverlayNode的使用node 2…...
Leetcode.1590 使数组和能被 P 整除
题目链接 Leetcode.1590 使数组和能被 P 整除 rating : 2039 题目描述 给你一个正整数数组 n u m s nums nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p p p 整除。 不允许 将整个数组都移除。 请你返回你需…...
uniappios请求打开麦克风 uniapp发起请求
第一种 ajax请求方式 uni.request(OBJECT) 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App(自定义组件编译模式)不支持ArrayBuffer类型headerObject否设置请求的 header,header 中不能设置 Referer。…...

Java 注解在 Android 中的使用场景
Java 元注解有 5 种,常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别,有三种: RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中,并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…...

【开源】基于Vue和SpringBoot的数字化社区网格管理系统
项目编号: S 042 ,文末获取源码。 \color{red}{项目编号:S042,文末获取源码。} 项目编号:S042,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…...
Go语言简要介绍
Golang是一种编程语言,也称为Go或者Go语言。它是由Google开发的一种编译型、静态类型的语言。Golang的目标是提高程序开发的效率,同时保证程序的性能和安全。 Golang在语法结构上类似于C语言,但是通过引入新的概念和语法,比如gor…...
STM32H7 RTC及PC13问题
程序加了RTC时间过后,发现原本的RTC定时唤醒中断也不好使了,开始以为是PC13入侵检测引脚问题,经过测试,发现了一个大问题,当使用 HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BCD); 函数后,RTC变得…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...