使用Redis加锁对请求进行去重
场景:对请求过来相同的数据进行去重
如一个Http的Get请求中
/get?a=zhangsan
/get?a=lisi
/get?a=zhangsan
/get?a=wangwu
/get?a=lisi
a 的值相同的请求,每天处理一次,我们会怎么解决呢?
- 常规思路:
判断这个请求是否存在,如果不存在则处理,存在则不处理
技术方案:
使用Redis 进行处理,KEY 如: STR:zhangsan
判断STR:zhangsan 是否存在,不存在则处理,处理完成则将该key改为1(注意处理请求需要花费时间,所以中间有Gap时间),并且失效时间设置为当天23点59分59秒
- 出现问题:
同一时刻,两个zhangsan 同时请求过来,然后Redis判断 STR:zhangsan 是否存在,这个时候都不存在,两个请求都进行了处理
问题出现原因:
使用Redis 中Exists 判断以后再进行逻辑操作,这个逻辑操作比较耗时,或者说两个请求同时到达。简单总结就是,应该进行加锁处理,然后再进行自己的逻辑处理。问题出现的原因是Exists 判断以后,中间有一个Gap的时间,也可以理解为 Exists 和 Set 是两个操作,不是一个原子性的操作,在这两个操作中间如果有请求进来都会造成不一致的情况。
- 修复问题
修改为对key进行Incr操作,当返回结果为1的时候进行处理,如果不为1不进行处理。这就可以简单实现我们对请求的简单去重操作了。
- 总结:
4.1 对Redis操作自以为很了解,真正应用到项目中并不熟练
4.2 设计方案不合理,没有考虑到并发请求
4.3 知道和做到差好多,多做一些东西,多写些代码,少谈些主义
使用Redis加锁对请求进行去重的更多相关文章
- redis加锁
1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 ...
- redis加锁的几种实现
redis加锁的几种实现 2017/09/21 1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在, ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重
为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都 ...
- Redis系列-远程连接redis并给redis加锁
假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...
- Redis加锁与解锁
Redis加锁 customerM = BaseMemCached.setMLock(customerId); /** * 个人账户表加锁 **/ public static CustomerM se ...
- redis 加锁与解锁的详细总结,解决线程并发导致脏数据
1.前言 对每个controller来说都是全新且单独的,原因是多线程,如果多个请求操作共有的数据,这样的并发操作会导致脏数据 怎么解决? mysql可以使用积极锁解决, 这里讲解的是redis的解决 ...
- PHP中redis加锁和解锁的简单实现
背景说明 在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存.这时就需要对资源加锁.实现锁的方式有很多,比如数据库锁.文件锁等等.本文简单介绍PHP中使用redis来实 ...
- redis 加锁与释放锁(分布式锁1)
使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置 分布式锁使用 impor ...
- redis 加锁与释放锁(分布式锁)
使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置
- 应对高并发场景的redis加锁技巧
// 获取锁getLock() { // 是否有正在执行的线程 boolean hasLock = false; try { hasLock = redisClient ...
随机推荐
- JOKER智能可视化平台 20250204版本更新说明
本次 JOKER 低代码平台更新涵盖了代码生成.环境变量.可视化开发工具等多个关键领域的优化与新增功能,致力于为开发者提供更高效.更安全.更便捷的开发体验.同时,服务端功能的正式发布以及核心升级,进一 ...
- Docker daemon error cannot allocate memory
Issue When getting theses errors: Jan 12 00:21:55 -- dockerd[904]: time="2018-01-12T00:21:55.32 ...
- 【Linux】3.2 vi和vim编辑器
vi 和 vim 三种模式的相互转化图 vim 和 vi 的快捷键键盘一览图 vi和vim编辑器 1. vi和vim的基本介绍 所有Linux系统都会内置vi文本编辑器 vim是vi的升级版,可以主动 ...
- BaseMultiTableInnerInterceptor源码解读
本文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-multi-table-inner-interceptor.html 一.概 ...
- 探秘Transformer系列之(23)--- 长度外推
探秘Transformer系列之(23)--- 长度外推 目录 探秘Transformer系列之(23)--- 长度外推 0x00 概述 0x01 背景 1.1 问题 1.2 解决思路 1.3 微调的 ...
- 主存的扩展及其与CPU的连接——字扩展
一块芯片的容量为\(2^{18}B\),而该CPU需要的容量为:\(2^{地址总线位宽}\)=\(2^{21}B\),所以需要8片该芯片来扩展. 由于CPU由21个地址引脚,芯片只有18个地址引脚,C ...
- Codeforces Round 952 (Div. 4)
知识点模块 1.一个正方体x,y,z里面可以放多少个边长为a,b,c的长方体 ans=(x-a+1)*(y-b+1)*(z-c+1) 题解模块 A.Creating Words 交换两个字母的首字母即 ...
- fiddler模拟弱网配置
1.延长加载时间 Rules-cumtomize rules,打开fiddler scripteditor 搜索simulatemodem-更改时间为需要延长加载的时间(单位为毫秒)-保存退出 2.打 ...
- MVVM绑定 填坑,必须在与 DependencyObject 相同的线程上创建 DependencySource
场景:线程里面构建MVVM实体类,实体类包含 Brush 属性时,构建 SolidColorBrush 需要UI线程,否则会报 "必须在与 DependencyObject 相同的线程上创建 ...
- 可持久化 01-trie 简记
本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...