当前位置: 首页 > 后端技术 > PHP

Redis锁底层原理深入理解

时间:2023-03-30 05:39:12 PHP

redis锁Redis锁有INCR、SETNX、SET,下面说说它们的用法和场景吧!1.INCR:(timer,+1operation)a)语法:INCRkeyb)场景:1)控制1秒内多次访问api;2)记录用户每天访问网站的登录次数;c)为什么我们说Howcanthisbeconsideredalock?当然不能单独认为是锁,因为它一直在+1+1,那怎么办呢?让我们看看以下内容:1)我们如何实现场景1)?FUNCTIONLIMIT_API_CALL(ip)ts=CURRENT_UNIX_TIME()keyname=ip+":"+tscurrent=GET(keyname)IFcurrent!=NULLANDcurrent>10THENERROR“每秒请求太多”ELSEMULTIINCR(keyname,1)EXPIRE(keyname,1)EXECPERFORM_API_CALL()END2)我们如何实现场景2)?INCRkey那么我们在使用INCR的时候,一般是用命令EXPIRE来组合它:(总觉得这种场景的使用太局限了,只有一秒,而且只能+1,而且是递增的by1是不行的,其实我们只是控制数为1,保证只能是1)$redis->incr($key);$redis->expire($key,$outtime);//设置生成时间1秒2.SETNX:这个我就不说了,因为在redis2.6.12版本中会被废弃3.SET:a)语法:SETKEYVALUE[EXseconds][PXmilliseconds][NX|XX]b)场景:1)set最大可以接受512M的长度,所以缓存放这里是没有问题的;2)添加数据,比如添加用户,如果存在则不给出任何操作。c)其实这个锁的实现是利用了set的NX,因为如果NX存在,就不会再增加或修改,同时SET也有一个expires的过期时间来释放锁。总结:上面所谓的锁使用expire,对于内置的NX的运行有一定的保证,也间接实现了对锁的操作,这也是基于对redis底层原理的理解.关注回复wxq,验证通过后加入php微信群,分析公众号中redis的事务锁+分布式锁