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出来,然后给业务系统使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql从库重新搭建的流程

背景 生产环境上的主从集群,因为一些异常原因,导致主从同步失败。现记录下通过重做mysql从库的方式来解决,重做过程不影响主库。 步骤 1、在主库上的操作步骤 备份主库所有数据,并将dump.sql文件拷贝到从库/tmp目录 mysqldump …

【JS逆向】某居深圳登陆信息加密逆向分析探索!

某二手房深圳站点的登陆信息加密逆向分析探索,需要分析查找关键的加密位置,位置在前上部分,需要理解一点代码,往上寻找一段代码,加密特征比较明显,找到后即可调试出来! 网址: aHR0cH…

电子学会C/C++编程等级考试2023年12月(八级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:生理周期 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集…

激光无人机打击系统——光束控制和指向系统

激光无人机(UAV)打击系统中的光束控制和指向系统通常包括以下几个关键组件和技术: 激光发射器:这是系统的核心,负责生成高能量的激光束。常用的激光类型包括固体激光器、化学激光器、光纤激光器等,选择取决…

基于JavaWeb+SSM+Vue智能社区服务小程序系统的设计和实现

基于JavaWebSSMVue智能社区服务小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相…

高性能跨平台网络通信框架 HP-Socket v5.9.5

项目主页 : http://www.oschina.net/p/hp-socket开发文档 : https://www.docin.com/p-4478351216.html下载地址 : https://github.com/ldcsaa/HP-SocketQQ Group: 44636872, 663903943 v5.9.5 更新 一、主要更新 问题修复:由于 v5.9.4 版本升级了 KCP 导致 UDP AR…

【网络安全】-入门版

secure 一、基本工具1、metasploit framework ps.本着兴趣爱好,加强电脑的安全防护能力,并严格遵守法律和道德规范。一、基本工具 1、metasploit framework msf(metasploit framework)是一个开源的渗透测试框架,用于…

Node.JS CreateWriteStream(大容量写入文件流优化)

Why I Need Node.JS Stream 如果你的程序收到以下错误,或者需要大容量写入很多内容(几十几百MB甚至GB级别),则必须使用Stream文件流甚至更高级的技术。 Error: EMFILE, too many open files 业务场景,我们有一个IntradayMissingRecord的补…

软件测试|使用matplotlib绘制箱型图

简介 绘制箱型图(Box Plot)是一种常用于可视化数据分布的方法,它可以显示数据的中位数、四分位数、异常值等统计信息。Matplotlib 是一个强大的 Python 数据可视化库,可以轻松绘制箱型图。在本文中,我们将介绍如何使用…

Java学习笔记(七)——操作数组工具类Arrays

文章目录 ArraysArrays.toString()Arrays.binarySearch()Arrays.copyOf()Arrays.copyOfRange()Arrays.fill()Arrays.sort()升序排序降序排序 Arrays 操作数组的工具类。 Arrays.toString() import java.util.Arrays;public class test40 {public static void main(String[] a…

instance_spawn_groups

字段介绍 此表通过 Boss 状态管理副本内的刷新组一旦满足任何 FLAG_ACTIVATE_SPAWN 条件,将激活预设的刷新组,任何 FLAG_BLOCK_SPAWN 条件将不激活刷新组 instance_spawn_groups instanceMapId 副本地图 IDbossStateId Boss 状态 ID,取值参…

在 EggJS 中实现 Redis 上锁

配置环境 下载 Redis Windows 访问 https://github.com/microsoftarchive/redis/releases 选择版本进行下载 - 勾选 [配置到环境变量] - 无脑下一步并安装 命令行执行:redis-cli -v 查看已安装的 Redis 版本,能成功查看就表示安装成功啦~ Mac brew i…

读元宇宙改变一切笔记11_区块链

1. 区块链 1.1. 由一个去中心化的“验证者”网络所管理的数据库 1.2. 一些观察者认为区块链是在结构上实现元宇宙的必要条件,而其他人则认为这种说法是荒谬的 1.3. 与集中式数据库不同,区块链记录不存储在单个位置,也不由单方管理 1.3.1.…

MySQL---多表查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

Halcon 边缘提取

文章目录 算子Halcon edges_image 示例Halcon frei_amp 示例Halcon kirsch_amp示例Halcon sobel_amp示例Halcon sobel_amp 算子示例Halcon sobel_dir 算子示例Halcon close_edges关闭图像间隙示例Halcon close_edges_length关闭图像间隙示例 算子 edges_image 对于图像进行边缘…

华为荣耀MagicBook V14集显(HGE-WXX)工厂模式原装出厂Windows11系统22H2,含F10智能还原重置

荣耀V14笔记本电脑(HGE-WXX)(HGE-W56)(HGE-W76)原厂OEM预装Win11系统,恢复开箱状态一模一样 链接:https://pan.baidu.com/s/1VR4_ZY3Wj_xHyrETf-LqLA?pwd47uk 提取码:47uk 原厂系统自带指纹驱动、面部识别驱动、显卡、声卡、网卡、蓝牙…

C语言-memchr函数字节查找

一、函数介绍 名称 NAMEmemchr, memrchr, rawmemchr - scan memory for a character //查找内存中的字符头文件 #include <string.h>函数原型 void *memchr(const void *s, int c, size_t n);//正向-查找void *memrchr(const void *s, int c, size_t n);//倒向-查找vo…

正反转控制电路图

1、倒顺开关正、反转控制电路图 倒顺开关直接接在主电路中&#xff0c;不适合用作大容量的电动机控制&#xff0c;一般用在额定电流10A、功率3kW以下的小容量电动机控制电路中。 2、接触器联锁正、反转控制电路图 接触器联锁正、反转控制电路的主电路中连接了两个接触器KM1和…

Pycharm详细安装 配置教程

继上次安装完Anaconda之后&#xff0c;现在更新最新版本的pycharm的安装和使用教程~~~ Anaconda&#xff1a;是一个开源的Python发行版本&#xff0c;其中包含了conda、Python等180多个科学包及其依赖项。【Anaconda和Pycharm详细安装 配置教程_anconda安装时clear the packag…

【软件测试】学习笔记-网站伸缩性架构设计

这篇文章探讨网站的伸缩性架构设计是什么&#xff0c;以及在设计测试用例时需要注意哪些点。 可伸缩性和可扩展性的概念区别 可伸缩性翻译自Scalability&#xff0c;指的是通过简单地增加硬件配置而使服务处理能力呈线性增长的能力。最简单直观的例子&#xff0c;就是通过在应…