71.工作中redis的常用场景总结

文章目录

  • 一、简介
  • 二、统计访问次数
  • 三、缓存
  • 四、分布式锁
  • 五、限流
  • 六、排行榜
  • 七、作为Session的存储器,存用户登录状态
  • 八、位统计
  • 九、生成全局ID

一、简介

Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现。

陆陆续续也写了一些Go操作redis以及redis使用场景的案例了,本文就记录一下工作中Redis常用的一些场景,做一个小结。

20. go-redis基本使用
70.Redis缓存优化实践(基于分类树场景)

二、统计访问次数

对于很多官方网站的首页,经常会有一些统计首页访问次数的需求。访问次数只有一个字段,如果保存到数据库中,再最后做汇总显然有些麻烦。

该业务场景可以使用Redis,定义一个key,比如:OFFICIAL_INDEX_VISIT_COUNT

在Redis中有incr命令,可以实现给value值加1操作:

incr OFFICIAL_INDEX_VISIT_COUNT

当然如果你想一次加的值大于1,可以用incrby命令,例如:

incrby OFFICIAL_INDEX_VISIT_COUNT 5

这样可以一次性加5

该场景下需要注意:68. redis计数与限流中incr+expire的坑以及解决办法(Lua+TTL)

三、缓存

Redis 的最常用的用例是缓存,以加快网络应用的速度。在这种用例中,Redis 将经常请求的数据存储在内存中。它允许网络服务器频繁访问的数据。这就减少了数据库的负载,并缩短应用程序的响应时间。在大规模应用中,缓存分布在 Redis 服务器集群中。
在这里插入图片描述

Redis 作为分布式缓存时需要考虑的其他问题包括:

  • 设置正确的 TTL (Time to Live)
  • 处理冷启动时对数据库的密集访问
  • HotKey 、BigKey 29.Go处理Redis HotKey 以及30.Go处理Redis BigKey 以及69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey
  • 缓存击穿、雪崩、穿透等问题 49.Go避免大量并发访问DB、避免缓存击穿、缓存穿透、缓存雪崩以及使用延迟双删保证数据一致性
  • 延迟双删解决数据一致性问题

四、分布式锁

需要协调对某些共享资源的访问时,就会使用分布式锁。Redis 通过其原子命令(如 SETNX, SET if Not eXists)来做分布式锁。它允许调用者设置一个不存在的键。

比如,客户端通过设置一个唯一的 Key 来获取锁:

SETNX lock "1234abcd" EX 3

如果Key尚未设置,SETNX 命令返回 1,表明锁已被客户端获取。客户端完成工作后 删除 Key ,释放锁。

如果 Key 已被设置,SETNX 命令返回 0,表明锁已被其他客户机持有。在这种情况下,客户端会等待并重试 SETNX 操作,直到锁被其他客户端释放。

请注意,这种简单的实现对于许多用例来说已经足够好了,但并非完全容错。对于生产应用,许多 Redis 客户端库提供高质量的分布式锁实现。 聊聊redis分布式锁的8大坑

五、限流

使用Redis还有一个非常常用的的业务场景是做限流。当然还有其他的限流方式,比如:使用nginx,但使用Redis控制可以更精细。

比如:限制同一个ip1分钟之内只能访问10次接口,10分钟之内只能访问50次接口,1天之内只能访问100次接口。如果超过次数,则接口直接返回:请求太频繁了,请稍后重试。此时可以在Redis中保存用户的请求次数记录。

比如:key是用户ipvalue是访问的次数从1开始,后面每访问一次则加1。如果value超过一定的次数,则直接拦截这种异常的ip。当然也需要设置一个过期时间,异常ip如果超过这个过期时间,比如:1天,则恢复正常了,该ip可以再发起请求了。或者限制同一个用户id
26.redis实现日限流、周限流(含黑名单、白名单)
27.Go实现一月(30天)内不发送重复内容的站内信给用户
同样,该场景下涉及到计数incr,所以也需要注意:68. redis计数与限流中incr+expire的坑以及解决办法(Lua+TTL)

六、排行榜

很多网站有排行榜的功能,比如:商城中有商品销量的排行榜,游戏网站有玩家获得积分的排行榜。

通常情况下,我们可以使用Sorted Set保存排行榜的数据。

使用ZADD可以添加排行榜的数据,使用ZRANGE可以获取排行榜的数据。

例如:

ZADD rank:score 100 "周星驰"
ZADD rank:score 90 "周杰伦"
ZADD rank:score 80 "周润发"
ZRANGE rank:score 0 -1 WITHSCORES

返回数据:

 "周星驰""100""周杰伦""90""周润发""80"

七、作为Session的存储器,存用户登录状态

另一个常见用例是将 Redis 用作 Session 存储,在无状态服务之间共享 Session 数据。

当用户登录网络应用程序时,服务端会创建一个唯一的 Session IDSession 数据会存储在 Redis 中,然后 Session 作为 Cookie 的一部分返回给客户端。

当用户向应用程序发出请求时,Session ID 会包含在请求中。无状态网络服务器会使用 Session 数据。值得注意的是 Redis 是内存数据库。如果 Redis 服务器重启,存储在 Redis 中的 Session 数据会丢失。

即使 Redis 提供了 RDBAOF 等持久化选项,但这些选项在重启时加载数据的时间往往太长,不实用。在实际生产环境中,数据会复制到备份实例。如果主实例崩溃,备份迅速升级,接管流量。

使用Redis保存用户登录状态,有个好处是它可以设置一个过期时间,比如:该时间可以设置成30分钟。

Redis内部有对应的策略,会将过期的数据删除,也有获取数据时才实时删除的逻辑。

八、位统计

比如现在有个需求:有个网站需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。这个需求使用传统的数据库,实现起来比较麻烦,但使用Redisbitmap让我们可以实时的进行类似的统计。

bitmap 是二进制的byte数组,也可以简单理解成是一个普通字符串。它将二进制数据存储在byte数组中以达到存储数据的目的。

保存数据命令使用setbit,语法:

setbit key offset value

具体示例:

setbit user:view:2024-01-20 123456 1

bitmap数组中设置了用户id=123456的登录状态为1,标记2024-01-20已登录。

然后通过命令getbit获取数据,语法:

getbit key offset

具体示例:

getbit user:view:2024-01-17 123456

如果获取的值是1,说明这一天登录了。

如果我们想统计一周内连续登录的用户,只需要遍历用户id,根据日期中数组中去查询状态即可。

九、生成全局ID

在有些需要生成全局ID的业务场景,其实也可以使用Redis

可以使用incrby命令,利用原子性操作,可以执行下面这个命令:

incrby userid 10000

在分库分表的场景,对于有些批量操作,我们可以从Redis中,一次性拿一批id出来,然后给业务系统使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419271.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

台达PLC程序远程上下载 远程在线调试原来是使用了博达V900远程透传模块

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条,用于实现网络连接和连接PLC一台台达PLC及其编程软件ISPSoft一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡,WIFI联网则将WIFI天线插入USB口) …

Python圣诞主题绘图:用turtle库打造冬日奇妙画面【第31篇—python:圣诞节】

文章目录 Python圣诞主题绘图导言代码结构概览详细解析drawlight函数tree函数xzs函数drawsnow函数五角星的绘制 完整代码代码解析总结 Python圣诞主题绘图 导言 圣诞季节是个充满欢乐和创意的时刻。在这个技术博客中,我们将深入探讨如何使用Python的turtle库创建一…

实战 | OpenCV两种不同方法实现粘连大米粒分割计数(步骤 + 源码)

导 读 本文主要介绍基于OpenCV的两种不同方法实现粘连大米分割计数,并给详细步骤和源码。源码和图片素材见文末。 背景介绍 测试图如下,图中有个别米粒相互粘连,本文主要演示如何使用OpenCV用两种不同方法将其分割并计数。 方法一:基于分水岭算法 基于分水岭算法…

助力焊接场景下自动化缺陷检测识别,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工业焊接场景下缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景,在我们前面的博文开发实践中也有一些相关的实践,感兴趣的话可以自行移步阅读即可: 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

maven常见的报错集合及解决

文章目录 maven常见的报错集合及解决第一种版本号报错,电脑系统全局搜索 lastUpdated后缀相关文件--》全选删除2 第二种maven工程是灰色--》使用号解决重新识别maven工程 3 本地的jar,安装第三方的jar包替换掉上图黄色标记部分(注意是否有错误…

maven 基本知识/1.17

maven ●maven是一个基于项目对象模型(pom)的项目管理工具,帮助管理人员自动化构建、测试和部署项目 ●pom是一个xml文件,包含项目的元数据,如项目的坐标(GroupId,artifactId,version )、项目的依赖关系、构建过程 ●生命周期&…

视频怎么添加字幕?这几款工具很实用

视频怎么添加字幕?现在,视频已经成为人们获取信息和娱乐的主要方式之一。然而,很多时候,我们想要更深入地理解视频内容,或者为听力障碍者提供帮助,就需要添加字幕。那么,如何为视频添加字幕呢&a…

QWT 6.2.0编译的库及头文件 :已经打包成3rdparty/qwt,可以直接在你的工程里cmake导入外部库,直接使用

qwt 6.2.0打包好的库及其头文件 链接:https://pan.baidu.com/s/1yDFLUxxxR8sDfMKalA8fVw?pwdo8gg 提取码:o8gg cmake工程导入编译好的qwt 6.2.0外部库 新建CMake Qt项目 # 在生成你的应用add_executable之前添加qwt外部库,你可以在你的…

Django随笔

关于Django的admin 1. 在url中把 from django.contrib import admin 重新解开 把path(admin/,admin.site.urls), 解开 2. 注册app,在配置文件中写 django.contrib.admin, 3.输入命令进行数据库迁移 Django国际化 配置文件中(改成中文) LA…

SpringMVC数据校验

导包 配置springmvc.xml <bean id"validator" class" org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name"providerClass" value"org.hibernate.validator.HibernateValidator ">…

【JavaWeb】XML Tomcat10 HTTP

文章目录 一、XML1.1常见配置文件类型 二、Tomcat102.1 WEB项目的标准结构2.2 Tomcat目录2.3 WEB项目部署的方式2.4 IDEA中开发并部署运行WEB项目2.5 处理配置文件2.6 处理依赖jar包问题2.7 IDEA部署-运行web项目 三、HTTP3.1 HTTP协议的会话方式3.2 请求和响应报文3.3.1 报文的…

OCS2 入门教程(六)- Double Integrator

系列文章目录 前言 双积分器示例是我们最简单的问题。它模拟了一个沿 x 方向移动的一维点质量。模型是线性的&#xff0c;成本函数是二次函数。目标点通过参考管理器模块设置为二次成本。 一、查看文件结构 1.1 ocs2_double_integrator 文件夹 . ├── auto_generated ├─…