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

如一个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. JOKER智能可视化平台 20250204版本更新说明

    本次 JOKER 低代码平台更新涵盖了代码生成.环境变量.可视化开发工具等多个关键领域的优化与新增功能,致力于为开发者提供更高效.更安全.更便捷的开发体验.同时,服务端功能的正式发布以及核心升级,进一 ...

  2. 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 ...

  3. 【Linux】3.2 vi和vim编辑器

    vi 和 vim 三种模式的相互转化图 vim 和 vi 的快捷键键盘一览图 vi和vim编辑器 1. vi和vim的基本介绍 所有Linux系统都会内置vi文本编辑器 vim是vi的升级版,可以主动 ...

  4. BaseMultiTableInnerInterceptor源码解读

    本文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-multi-table-inner-interceptor.html 一.概 ...

  5. 探秘Transformer系列之(23)--- 长度外推

    探秘Transformer系列之(23)--- 长度外推 目录 探秘Transformer系列之(23)--- 长度外推 0x00 概述 0x01 背景 1.1 问题 1.2 解决思路 1.3 微调的 ...

  6. 主存的扩展及其与CPU的连接——字扩展

    一块芯片的容量为\(2^{18}B\),而该CPU需要的容量为:\(2^{地址总线位宽}\)=\(2^{21}B\),所以需要8片该芯片来扩展. 由于CPU由21个地址引脚,芯片只有18个地址引脚,C ...

  7. 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 交换两个字母的首字母即 ...

  8. fiddler模拟弱网配置

    1.延长加载时间 Rules-cumtomize rules,打开fiddler scripteditor 搜索simulatemodem-更改时间为需要延长加载的时间(单位为毫秒)-保存退出 2.打 ...

  9. MVVM绑定 填坑,必须在与 DependencyObject 相同的线程上创建 DependencySource

    场景:线程里面构建MVVM实体类,实体类包含 Brush 属性时,构建 SolidColorBrush 需要UI线程,否则会报 "必须在与 DependencyObject 相同的线程上创建 ...

  10. 可持久化 01-trie 简记

    本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...