使用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 ...
随机推荐
- NumPy学习12
今天学习了 22, NumPy矩阵乘法 23, NumPy IO操作 numpy_test12.py : import numpy as np ''' 22, NumPy矩阵乘法 矩阵乘法是将两个矩阵 ...
- C++判断文本编码
#include <iostream> #include <fstream> #include <string> #include <sstream> ...
- docker-compose up -d 运行容器秒自动停止解决方案
正常的我们运行Docker-Compose的服务 docker-compose -f docker-compose.yml up -d mysql-setup 执行Docker ps 查看存活的容器 ...
- vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果
2025 AI实战vue3+deepseek+arcoDesign仿DeepSeek/豆包网页版AI聊天助手. vue3-web-deepseek 实战网页PC版智能AI对话,基于vite6+vue3 ...
- Pydantic字段元数据指南:从基础到企业级文档增强
title: Pydantic字段元数据指南:从基础到企业级文档增强 date: 2025/3/28 updated: 2025/3/28 author: cmdragon excerpt: 通过Py ...
- String常见面试题
第一题:打印的结果是true还是false呢? 在之前我们就说过这题,执行s1时,检查字符串常量池,发现没有"abc",于是创建"abc",执行s2时,接着检查 ...
- AspNetCore Json序列化设置
AspNetCore 中的Json序列化处理已经默认使用Newtonsoft.Json库了... 比如像MVC中: public I 不过使用过程中会发现一些问题,其实这算默认设置吧: Json序列化 ...
- C# using 别名
场景重现 当using的多个库出现类名重复的情况时... 解决办法 使用类的完全限定名称,例如: // 不需要using,避免using名称重复导致的异常 // 使用类的完全限定名称,俗称全名. Sy ...
- DeepseekScanner deepseek+python实现代码审计实战
一.功能概述 DeepseekScanner实现了扫描源代码项目中的所有代码文件发送给deepseek进行安全审计的功能.具体细节包括扫描所有子目录中的代码文件,然后依次将代码文件切片发送到deeps ...
- JAVA基础之多线程一期
一.并发与并行的区别 并发:指同一时间段,两个或多个事件交替进行 并行:指同一时间段,两个或多个事件同时进行 二.进程与线程的区别 进程:正在内存中运行的程序就是进程 线程:线程归属于进程,它是进程中 ...