php在大并发下redis锁实现

在现如今电商盛行的时期,会出现很多促销活动,最为常见的就是秒杀。在秒杀系统中最为常见的问题就是会出现超卖的情况,那么如何来杜绝超卖的情形了,在业务逻辑层面可以使用缓存以及加锁的手法来避免超卖的情形。

现如今nosql已经非常流行和稳定了,在此我将通过redis和php来说明如何实现锁机制。当然我使用redis加锁并不是我的秒杀系统,而是最近做的一个项目有个用户提现,初期没有考虑到会有人恶意刷新接口,而导致用户无限制提现。经过查看nginx日志,发现用户在同一时间段,通过刷接口的方法超额提现,导致亏损

起初的提现代码如下:

看上面代码逻辑感觉似乎没有什么问题,确实,在正常的情况下是不会出现问题,如果有人恶意的去刷接口的话,上述问题就出现了。为了防止用户恶意刷接口,所以对现有代码做了如下修改

代码调整后似乎防止了用户刷接口的行为,但是后期有用户反映,自己提不了现了。经过一番查看,原来redis的值一直存在,虽然用户操作完成后会删除key,但是也会存在在用户没有完全操作完成而导致流程中断,所以会导致key删除失败,为了解决锁不释放的问题,又对上述代码进行修改,在设置锁的时候,设置一个过期时间,修复如下

这样就可以实现锁不释放的问题,但是上述代码除了使用incr操作外,还可以使用redis的setnx来代替,其实是一样的效果,但是无论你用那种还是有点问题就是,当你写入成功之后,突然断网或服务器宕机的情况,这时还会出现上述问题,那应该如何来解决呢。其实完全可以通过redis的 Multi/Exec结合来解决上述问题,其代码如下

这样就可以解决突然情况带来的妖怪问题了

总结:通过redis可以实现大并发的数据请求操作,通过事务的操作来加锁和释放锁,达到数据完整性

虽然上述问题解决了,但是代码还是有待优化,从 2.6.12 起,SET 涵盖了 SETEX 的功能,并且 SET 本身已经包含了设置过期时间的功能,也就是说,我们前面需要的功能只用 SET 就可以实现。所以上述代码可以简化为

以上就是如何解决并发和恶意刷接口的解决方法,以作记录

Original: https://www.cnblogs.com/tm2015/p/7845503.html
Author: 铁猛
Title: php在大并发下redis锁实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589381/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022-9-2 cookie 和 session

    当客户端关闭后,服务器不关闭,两次获取session是否为同一个?默认情况下。不是。 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cooki…

    Java 2023年6月13日
    067
  • spring boot 3 集成websocket

    第一步:导入依赖 org.springframework.bootspring-boot-starter-websocket 相比前面的章节,新增了websocket的依赖。 编写…

    Java 2023年5月30日
    082
  • Docker内使用Nignx

    //下载镜像 docker pull nginx 运行镜像: default.conf是配置server块的地方,将其映射到本地方便修改 docker run -d -p 80:8…

    Java 2023年6月5日
    0102
  • Java之万年历

    @ 二、Java之万年历 2.1 要求 2.2 思路 2.3 源代码 2.4 结果截图 二、Java之万年历 2.1 要求 输入年份; 输入月份; 输出某年某月的日历。 2.2 思…

    Java 2023年6月5日
    0112
  • 幻灯片:Why Java Sucks and C# Rocks

    昨天在5173与博客园联合举办的技术交流活动中进行了演讲,现在幻灯片终于可以放出了。当然,光看幻灯片本身的效果不大,在演讲过程中我进行了非常多的代码演示和说明,幻灯片本身只能算是一…

    Java 2023年5月29日
    087
  • 6. 站在巨人的肩膀学习Java Filter型内存马

    重新编译,执行命令 我们把恶意的Filter注入内存中,只要符合urlpattern,就可以触发内存shell,但这个Filter内存马注入是一次性的,重启就没有了。 看一下此时的…

    Java 2023年5月29日
    0100
  • rose-jade自动生成dao、model

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/FCWORLD/p/5371923.htmlAuthor…

    Java 2023年6月6日
    060
  • SpringBoot(二十):SpringBoot+Feign:实现Feign日志写入一行几种方案

    默认情况下Feign日志 这么多行,比如一些日志采集系统采集到后不好聚合或者索引查找。 日志写入一行#重写feign.Client.Default 自定义MyClient类 在覆盖…

    Java 2023年5月30日
    070
  • Day10

    package array;import java.util.Arrays;public class ArrayDemo6 { public static void main(St…

    Java 2023年6月5日
    078
  • 国产Java代码补全神器,aiXcoder 2.0实测

    国人的「代码补全工具」aiXcoder近期推出了「本地2.0新版」,笔者感觉试用一番… 发现新的2.0版一改之前1.0版对电脑性能的要求,在笔记本上运行也能保持稳、准、…

    Java 2023年5月29日
    068
  • 3-面向对象(2)

    一、Object类的使用 1.java.lang.Object类的说明: Object类是所Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为j…

    Java 2023年6月7日
    071
  • Ubuntu16桌面版编译OpenCV4的java库和so库

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    0105
  • 循序渐进nginx(二):反向代理、负载均衡、缓存服务、静态资源访问

    反向代理 使用 1.创建代理目标服务端: 2.配置nginx反向代理目标服务端: 3.测试使用: 负载均衡 使用 1.准备服务端 2.修改nginx配置 3.测试 负载均衡策略 负…

    Java 2023年5月30日
    070
  • ObjectPostProcessor使用与多种用户定义方式(9)

    前面介绍了 ObjectPostProcessor的基本概念。相信读者已经明白,所有的过滤器都由对应的配置类来负责创建,配置类在将过滤器创建成功之后,会调用父类的postProce…

    Java 2023年6月13日
    076
  • 继承扩展DataGrid的editors

    @author YHC 一些常见的editors 添加到datagrid以便用户编辑数据,所有的editor都定义在$.fn.datagrid.defaults.editors对象…

    Java 2023年5月29日
    068
  • 控制反转,依赖注入,依赖倒置傻傻分不清楚?

    通过这篇文章,你将了解到 控制反转(IoC)是什么?「反转」到底反转了什么? Spring和IOC之间是什么关系? 依赖注入(DI)和依赖倒置原则(DIP)又是什么? IOC、DI…

    Java 2023年6月7日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球