场景:对请求过来相同的数据进行去重

如一个Http的Get请求中

/get?a=zhangsan

/get?a=lisi

/get?a=zhangsan

/get?a=wangwu

/get?a=lisi

a 的值相同的请求,每天处理一次,我们会怎么解决呢?

  1. 常规思路:

判断这个请求是否存在,如果不存在则处理,存在则不处理

技术方案:

使用Redis 进行处理,KEY 如: STR:zhangsan

判断STR:zhangsan 是否存在,不存在则处理,处理完成则将该key改为1(注意处理请求需要花费时间,所以中间有Gap时间),并且失效时间设置为当天23点59分59秒

  1. 出现问题:

同一时刻,两个zhangsan 同时请求过来,然后Redis判断 STR:zhangsan 是否存在,这个时候都不存在,两个请求都进行了处理

问题出现原因:

使用Redis 中Exists 判断以后再进行逻辑操作,这个逻辑操作比较耗时,或者说两个请求同时到达。简单总结就是,应该进行加锁处理,然后再进行自己的逻辑处理。问题出现的原因是Exists 判断以后,中间有一个Gap的时间,也可以理解为 Exists 和 Set 是两个操作,不是一个原子性的操作,在这两个操作中间如果有请求进来都会造成不一致的情况。

  1. 修复问题

修改为对key进行Incr操作,当返回结果为1的时候进行处理,如果不为1不进行处理。这就可以简单实现我们对请求的简单去重操作了。

  1. 总结:

4.1 对Redis操作自以为很了解,真正应用到项目中并不熟练

4.2 设计方案不合理,没有考虑到并发请求

4.3 知道和做到差好多,多做一些东西,多写些代码,少谈些主义

使用Redis加锁对请求进行去重的更多相关文章

  1. redis加锁

    1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 ...

  2. redis加锁的几种实现

    redis加锁的几种实现 2017/09/21 1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在, ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重

    为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都 ...

  4. Redis系列-远程连接redis并给redis加锁

    假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...

  5. Redis加锁与解锁

    Redis加锁 customerM = BaseMemCached.setMLock(customerId); /** * 个人账户表加锁 **/ public static CustomerM se ...

  6. redis 加锁与解锁的详细总结,解决线程并发导致脏数据

    1.前言 对每个controller来说都是全新且单独的,原因是多线程,如果多个请求操作共有的数据,这样的并发操作会导致脏数据 怎么解决? mysql可以使用积极锁解决, 这里讲解的是redis的解决 ...

  7. PHP中redis加锁和解锁的简单实现

    背景说明 在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存.这时就需要对资源加锁.实现锁的方式有很多,比如数据库锁.文件锁等等.本文简单介绍PHP中使用redis来实 ...

  8. redis 加锁与释放锁(分布式锁1)

    使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置 分布式锁使用 impor ...

  9. redis 加锁与释放锁(分布式锁)

    使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置

  10. 应对高并发场景的redis加锁技巧

    // 获取锁getLock() {    // 是否有正在执行的线程    boolean hasLock = false;    try {        hasLock = redisClient ...

随机推荐

  1. NumPy学习12

    今天学习了 22, NumPy矩阵乘法 23, NumPy IO操作 numpy_test12.py : import numpy as np ''' 22, NumPy矩阵乘法 矩阵乘法是将两个矩阵 ...

  2. C++判断文本编码

    #include <iostream> #include <fstream> #include <string> #include <sstream> ...

  3. docker-compose up -d 运行容器秒自动停止解决方案

    正常的我们运行Docker-Compose的服务 docker-compose -f docker-compose.yml up -d mysql-setup 执行Docker ps 查看存活的容器 ...

  4. vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果

    2025 AI实战vue3+deepseek+arcoDesign仿DeepSeek/豆包网页版AI聊天助手. vue3-web-deepseek 实战网页PC版智能AI对话,基于vite6+vue3 ...

  5. Pydantic字段元数据指南:从基础到企业级文档增强

    title: Pydantic字段元数据指南:从基础到企业级文档增强 date: 2025/3/28 updated: 2025/3/28 author: cmdragon excerpt: 通过Py ...

  6. String常见面试题

    第一题:打印的结果是true还是false呢? 在之前我们就说过这题,执行s1时,检查字符串常量池,发现没有"abc",于是创建"abc",执行s2时,接着检查 ...

  7. AspNetCore Json序列化设置

    AspNetCore 中的Json序列化处理已经默认使用Newtonsoft.Json库了... 比如像MVC中: public I 不过使用过程中会发现一些问题,其实这算默认设置吧: Json序列化 ...

  8. C# using 别名

    场景重现 当using的多个库出现类名重复的情况时... 解决办法 使用类的完全限定名称,例如: // 不需要using,避免using名称重复导致的异常 // 使用类的完全限定名称,俗称全名. Sy ...

  9. DeepseekScanner deepseek+python实现代码审计实战

    一.功能概述 DeepseekScanner实现了扫描源代码项目中的所有代码文件发送给deepseek进行安全审计的功能.具体细节包括扫描所有子目录中的代码文件,然后依次将代码文件切片发送到deeps ...

  10. JAVA基础之多线程一期

    一.并发与并行的区别 并发:指同一时间段,两个或多个事件交替进行 并行:指同一时间段,两个或多个事件同时进行 二.进程与线程的区别 进程:正在内存中运行的程序就是进程 线程:线程归属于进程,它是进程中 ...