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进行了简单的案例实践,但是逻辑可以应用到实际环境下。
redis入门到精通系列(二):redis操作的两个实践案例的更多相关文章
- redis入门到精通系列(四):Jedis--使用java操作redis详解
(一)前言 如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用.Java语言通过JDBC操作mysql,用Jedis操作redis.当然了,java操作redis的方式不止jedis一种 ...
- redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...
- redis入门到精通系列(五):redis的持久化操作(RDB、AOF)
(一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...
- redis入门到精通系列(一)
(一)为什么要用Nosql 如果你是计算机本科学生 ,那么一定使用过关系型数据库mysql.在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿 ...
- redis入门到精通系列(九):redis哨兵模式详解
(一)哨兵概述 前面我们讲了redis的主从复制,为了实现高可用,会选择一台服务器作为master,多台服务器作为slave.现在有这样一种情况,master宕机了,这时系统会选择一台slave作为m ...
- redis入门到精通系列(八):redis的高可用--主从复制详解
(一)主从复制介绍 前面所讲的关于redis的操作都属于单机操作,单机操作虽然操作简单,但是处理能力有限,无法高可用.所谓高可用性,就是指当一台服务器宕机的时候,有备用的服务器能顶替上,在单机操作上这 ...
- redis入门到精通系列(七):redis高级数据类型详解(BitMaps,HyperLogLog,GEO)
高级数据类型和五种基本数据类型不同,并非新的数据结构.高级数据类型往往是用来解决一些业务场景. (一)BitMaps (1.1) BitMaps概述 在应用场景中,有一些数据只有两个属性,比如是否是学 ...
- redis入门到精通系列(六):redis的事务详解
(一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...
- DBProxy 入门到精通系列(二):DBProxy快速入门教程
这里主要用来了解有关DBProxy方面的部署及基本的配置,以及模拟架构 1 DBProxy方面的安装部署 1)基础环境的部署 # .x86_64 Percona-Server-client-.x86_ ...
随机推荐
- .Net Minimal Api 介绍
Minimal API是.Net 6中新增的模板,借助C# 10的一些特性以最少的代码运行一个Web服务.本文脱离VS通过VS Code,完成一个简单的Minimal Api项目的开发. 创建项目 随 ...
- SpringCloud 2020.0.4 系列之 JWT用户鉴权
1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...
- Java经典面试题(二)-不古出品
@ 目录 1. 为什么说 Java 语言"编译与解释并存"? 2.Oracle JDK 和 OpenJDK 的对比? 3.字符型常量和字符串常量的区别? 4.Java 泛型了解么? ...
- 求求你们了,别再写满屏的 if/ else 了!
为什么我们写的代码都是 if-else? 程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进 ...
- Python批量爬取谷歌原图,2021年最新可用版
文章目录 前言 一.环境配置 1.安装selenium 2.使用正确的谷歌浏览器驱动 二.使用步骤 1.加载chromedriver.exe 2.设置是否开启可视化界面 3.输入关键词.下载图片数.图 ...
- [loj3048]异或粽子
先对其求出前缀异或和,然后$o(k)$次枚举,每次选择最大值,考虑如何维护可以全局开一个堆,维护出每一个点的最大值的最大值,那么相当于要在一个点中删去一个点再找到最大值将这些删去的点重新建成一颗tri ...
- FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口
针对上一篇FastAPI(六十二)实战开发<在线课程学习系统>需求分析需求的功能,我们对需要的接口进行梳理,大概的规划出来现有的接口,作为我们第一版的接口的设计出版,然后我们根据设计的接口 ...
- Ubuntu文件系统结构
/bin: bin是Binary的缩写.存放系统中最常用的可执行文件(二进制). /boot: 这里存放的是linux内核和系统启动文件,包括Grub.lilo启动器程序. /dev: dev是Dev ...
- LOJ 3066 - 「ROI 2016 Day2」快递(线段树合并+set 启发式合并)
LOJ 题面传送门 人傻常数大,需要狠命卡--/wq/wq 画个图可以发现两条路径相交无非以下两种情况(其中红色部分为两路径的重叠部分,粉色.绿色的部分分别表示两条路径): 考虑如何计算它们的贡献,对 ...
- CSP-S 2021 游记
福兮祸之所伏 胜利是一种肯定,代表我应该在这条路上坚定不移地走下去. 胜利也是一种危机,它粉饰太平.养虎自齧,并把人最丑陋的一些想法暴露出来:虚荣心.骄傲心都在这个过程中被放大,懒惰心.自满心也找到了 ...