• 使用Redis加锁对请求进行去重


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

    如一个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 知道和做到差好多,多做一些东西,多写些代码,少谈些主义

  • 相关阅读:
    责任链
    ITERATOR(迭代器)设计模式
    CSocket必须使用stream socket不能够使用数据报 socket
    由《win32多线程程序设计》临界区的问题所想
    JavaScript 中的FileReader对象(实现上传图片预览)
    PHP中递归的实现(附例子)
    Git 与 SVN 命令学习笔记
    Apache服务器在80端口配置多域名虚拟主机的方法
    MySQL数据表range分区例子
    MySQL主从复制技术的简单实现
  • 原文地址:https://www.cnblogs.com/zhangpengfei5945/p/12982382.html
Copyright © 2020-2023  润新知