当前位置: 首页 > news >正文

redis入门到精通系列(二):redis操作的两个实践案例

在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string)、列表类型(list)、散列类型(hash)、集合类型(set)、有序集合类型(sorted_set)。学完基础语法操作后下一步就是通过几个案例来实践操作一下redis。在这里不会采用任何其他语言,单纯使用redis进行模拟操作。

redis的基础操作看这一篇:redis入门到精通系列(一):入门redis看这一篇就够了

(一)实例一:请求调用次数的限制

应用场景:我们都知道服务器的资源总是有限的,因此如果想要让一个网站崩溃的方法之一就是无限次访问调用服务器的资源。当然了,现在的网站肯定都会有应对措施,比如熔断等操作。应对这种一个人频繁访问服务器的情况,还有一种解决方法是限制单个用户在一个时间段内调用的次数。

思路:我们可以限制单个用户在一分钟内只能调用十次,

1.设计一个计数器,记录调用的次数,把用户id作为key,调用次数作为value

2.在调用前获取次数,如果为nil,则以id为key,设置调用次数为1,生命周期为60秒;反之如果存在该key,如果value小于10,则加1;value等于10,则禁止访问。

实践:假设用户的id为123

//首先获取123的值,如果为空,则设置值为1,周期为60s
get 123
setex 123 60 1
//如果值不为空且小于10,则加1
get 123
incr 123

这里判断值是否大于10由后端逻辑控制,在这里不做讲解

 进一步优化:用这种方式限制访问次数有一点小小的缺点:每次取到值后都要先判断是否小于10。我们可以转换一下思路,string类型存在最大值9223372036854775807,我们只需要设置设置第一次访问的值为最大值-10,当超过最大值时,redis会发起异常,通过异常来限制调用次数

实践:

get 123
setex 123 60 9223372036854775797
incr 123

 

 

(二)实例二:微信消息排列顺序

应用场景:手机接受微信消息会按最后一条消息的发送时间由近到远排序,同时置顶的消息永远会排在非置顶之前。这个功能就可以通过redis来实现。

思路:两个list数据类型存放消息通知(用户id),一个list用来存放置顶消息,另一个list用来存放非置顶消息,再用一个string类型存放置顶用户

1.当有人发来消息时,首先查看是否是置顶用户(这一步用后端逻辑实现),再分别存放到两个list中

2.我们把list看作一个栈,先进后出。当一个用户发来消息时,先删除list中该用户,再添加该用户。这一步的目的是始终保持最后发来消息的人排在最前。

实践:假设有4个人,a b c d,模拟a的微信,因为置顶和非置顶的操作一样,这里先不考虑

消息顺序为bccdb

 

(三)总结

这里只是对redis进行了简单的案例实践,但是逻辑可以应用到实际环境下。

相关文章:

  • 给所有的td单元格绑定一个click事件
  • redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
  • 正则表达式与grep详解
  • redis入门到精通系列(四):Jedis--使用java操作redis详解
  • C语言 原码--反码--补码
  • redis入门到精通系列(五):redis的持久化操作(RDB、AOF)
  • 我的学习进度条
  • redis入门到精通系列(六):redis的事务详解
  • Gradle和Android Studio入门
  • redis入门到精通系列(七):redis高级数据类型详解(BitMaps,HyperLogLog,GEO)
  • iTween基础之Shake(摆动)
  • redis入门到精通系列(八):redis的高可用--主从复制详解
  • php二维数组按照某一列排序的方法
  • redis入门到精通系列(九):redis哨兵模式详解
  • android MediaRecorder录制音频
  • ES6指北【2】—— 箭头函数
  • ➹使用webpack配置多页面应用(MPA)
  • 08.Android之View事件问题
  • JAVA SE 6 GC调优笔记
  • java第三方包学习之lombok
  • NSTimer学习笔记
  • passportjs 源码分析
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue 2.3、2.4 知识点小结
  • web标准化(下)
  • 力扣(LeetCode)56
  • 两列自适应布局方案整理
  • 深入浅出Node.js
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 怎么把视频里的音乐提取出来
  • MPAndroidChart 教程:Y轴 YAxis
  • #Ubuntu(修改root信息)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C#)获取字符编码的类
  • (动态规划)5. 最长回文子串 java解决
  • (二)windows配置JDK环境
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (转)ObjectiveC 深浅拷贝学习
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET中winform传递参数至Url并获得返回值或文件
  • @取消转义
  • []常用AT命令解释()
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [Excel] vlookup函数
  • [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
  • [JavaEE]线程的状态与安全
  • [js]- 两个对象的合并(Object.assign)
  • [leetcode] 61. 旋转链表