首页 > 数据库 >图解Redis适用场景

图解Redis适用场景

时间:2023-11-27 14:34:51浏览次数:34  
标签:存储 场景 JWT 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 技术

各有优势,选择取决于具体的应用场景和需求:

  1. 安全性:JWT 更加安全,因为它不需要服务器端存储会话数据,全部的数据可以通过加密的 JWT 编码在客户端;而 Redis 存储在服务器端,如果 Redis 被攻击可能会洩漏会话数据。

  2. 伸缩性:Redis 会话存储更易水平扩展,通过集群可以很好的承载大量会话;JWT 需要应用层进行扩展。

  3. 实现难度:Redis 会话存储实现简单,直接利用 Redis API 即可;JWT 需要选用算法和密钥,客户端和服务端都需要一些代码实现。

  4. 跨域访问:JWT 更适合跨域场景,因为可以直接在请求头中携带。Redis只能在同域下访问。

  5. 适用场景:

  • 需要 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完成其工作。

img

通过删除键来释放日志。现在,若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 发布!

标签:存储,场景,JWT,Redis,会话,图解,数据,客户端
From: https://www.cnblogs.com/JavaEdge/p/17859277.html

相关文章

  • 分析安科瑞Acrel-EIOT能源物联网平台的工作原理以及应用场景—李笑曼
    安科瑞电气股份有限公司李笑曼壹柒捌贰壹壹贰玖柒叁叁1功能Acrel-EIoT能源物联网开放平台是一套基于物联网数据中台,建立统一的上下行数据标准,为互联网用户提供能源物联网数据服务的平台。用户仅需购买安科瑞物联网传感器,选配网关,自行安装后扫码即可使用手机和电脑得到所需的行......
  • 小米二面:Redis 如何保证数据不丢失?
    前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候,我发现了一个问题,回答的不是很好,也就是我们今天要聊的这个问题:Redis如何保证数据不丢失?很多人看到这个问题的第一反应是,这个问题不难,就是Redis的持久化技术嘛!但如果你这样回答,可能......
  • Redis RedisTemplate
    1、RedisTemplate使用PipeLine管道命令RedisTemplate使用最详解(五)---opsForZSet()2、redisTemplate.opsForZSet().add("zSet","aaa",1);redisTemplate.opsForZSet().add("zSet","bbb",2);redisTemplate.opsFo......
  • 写写Redis十大类型hyperloglog(基数统计)的常用命令
    hyperloglog处理问题的关键所在和bitmap差不多,都是为了减少对sql的写操作,提高性能,用于基数统计的算法。基数就是一种数据集,用于收集去重后内容的数量。会有0.81%的误差hyperloglog是string类型,但是不会存储数组的本身,不会像集合一样返回数组应用场景:①统计某个网站某个文章的uv(u......
  • 分布式锁-redis
    packageredis.clients.jedis;importjava.net.URI;importjavax.net.ssl.HostnameVerifier;importjavax.net.ssl.SSLParameters;importjavax.net.ssl.SSLSocketFactory;importorg.apache.commons.pool2.impl.GenericObjectPool;importorg.apache.commons.pool2.im......
  • redis基础命令复习(Sring,Hash,List,Set,SortedSet)
    1,Redis数据结构:  https://redis.io/commands  2,Redis命令---Redis通用命令(常见的有,keys,del,exists,expire,ttl)2.1,keys:查看符合模板的所有key,不建议在生产环境设备上使用 打开redis:win+R,输入cmd,打开命令提示符后,输入redis-server;  再另外打开一个命令提示......
  • node连接redis基础用法
     //*************redis基础用法**********************///1.导入redis,最好是下载3版本constredis=require('redis')//2.创建客户端constcli=redis.createClient({host:'localhost',port:6379})/***3.设置数据库*参1:k值*参2:v值*参3:'ex'|&#......
  • 大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异
    最近有客户在使用Elasticsearch搜索服务时发现集群有掉节点,并且有master收集节点信息超时的日志,节点的负载也很高,不只是data节点,master和协调节点的cpu使用率都很高,看现象集群似乎遇到了性能瓶颈。查看了Hot_threads,发现大量线程被权限验证相关的类和方法占用,主要在RB......
  • 大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异
    最近有客户在使用Elasticsearch搜索服务时发现集群有掉节点,并且有master收集节点信息超时的日志,节点的负载也很高,不只是data节点,master和协调节点的cpu使用率都很高,看现象集群似乎遇到了性能瓶颈。查看了Hot_threads,发现大量线程被权限验证相关的类和方法占用,主要在......
  • 关于点赞业务对MySQL和Redis和MongoDB的思考
    点赞​ 在我个人理解中,点赞业务比较频繁,很多人业务可能都会有这个,比如:博客,视频,文章,动态,评论等,但是不应该是核心业务,不应该大量地请求MySQL数据库,给数据库造成大量的资源消耗,MySQL的数据库是非常宝贵的.以某音为例,当我去搜索的时候,全抖音比较高的点赞数目应该是在1......