Redis INCR命令

article/2025/9/26 9:47:43

路人甲:嘿,兄弟,知不知道redis的incr命令怎么用?

路人丙:啥?你这都不知道,不就是将key值增1嘛?

路人甲:可以一直一直一直加吗?

路人丙:……

下图是Redis命令参考网站给出的incr命令的使用方法:

大家肯定都知道incr按照1递增,但是又有谁关注过incr的最大值?肯定不少人在看文档的时候把蓝色背景的文字漏了吧。

这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 操作。

看,十进制、64位、有符号、整数,那十进制64位有符号整数到底是多少呢?

咳咳,是-9223372036854775808~9223372036854775807

那我们来实验一下,看看等incr到了最大值9223372036854775807之后,继续调用incr会发生什么?

>

set

max 9223372036854775807

# 什么?你以为我会调用incr 9223372036854775807次?

OK

>

incr max

#

(error) ERR increment or decrement would overflow

>

看到没,报错了,大概意思就是说溢出了,超过9223372036854775807了。decr同理,不贴了就。

但是你真的会在命令行使用redis?都是在业务代码中使用的吧。

先说下我为啥会想到这个incr的问题吧,是这样的,最近在做的一个业务,需要限制用户每天提现的次数为5次,我想这还不简单,次数保存redis,请求一次加一次,用incr最方便了,然后我就写了下面的代码:

$countUserKey =

'tuya:withdraw:count:u:'

. $userid;

if

(MyRedis::incr($countUserKey) >

5

) {

return

$this->echoJson(

1

, [

'data'

=> []],

'每天只能提现5次哦'

);

// 很调皮

}

乍一看,没啥问题啊,真的没问题吗?如果有个无心的人,疯狂请求你这个提现接口,已经到了9223372036854775807次了,会发生啥?

别想了,我自己实验了一下,incr($countUserKey)返回了false,我的天?false 会大于5吗?显然不会,这不是绕过我的次数限制了吗?这还了得,这可是提现。

赶忙改成了如下代码:

$countUserKey =

'tuya:withdraw:count:u:'

. $user_id;

$count = Myredis::incr($countUserKey);

if

5

) {

return

$this->echoJson(

1

, [

'data'

=> []],

'每天只能提现5次哦'

);

// 还是很调皮

}

你看这样就行了吧,其实还是不行,你会让无心的人疯狂请求你这个接口9223372036854775807次?

不存在的,我上面还有个限制,每三分钟你才能请求我这个接口一次,

// 是否有锁

$mutexKey =

"tuya:withdraw_mutex:u:"

. $user_id;

if

(!empty(Myredis::get($mutexKey))) {

return

$this->echoJson(

1

, [

'data'

=> []],

'您操作过于频繁,请3分钟后重试'

);

}

// 加锁

if

(!Myredis::set($mutexKey,

'mutex'

,

180

)) {

Helper::getLogger()->addError(

"WithdrawAction: Set Redis Mutex Error"

, [

'mutexKey'

=> $mutexKey,

'money'

=> $money]);

return

$this->echoJson(

1

, [

'data'

=> []],

'网络开小差了,请稍后重试'

);

}

以上就是在开发中遇到的一个小问题,也希望看到的人能引以为鉴,incr没那么简单!坤哥给我说过,写程序就是要考虑很多边界,处理各种异常,还得努力努力

非要补充一点:

当到达最大值之后,问题和php一样,只是返回的值不一样,这样调用:redis.Incr(key).Val(),直接返回的0,:),你要判断是否大于5还是不行,还是能绕过限制次数的逻辑。

不过还好,这个包你还可以用redis.Incr(key).Err()判断是否发生错误,也可以用redis.Incr(key).Result()得到返回结果和错误,所以一定要尽量使用能返回error类型的方法先做判断,再处理逻辑。

key :=

"max_key"

// 此时redis中max_key的值是9223372036854775807

redis.Incr(key).Val()

// 返回int64类型,值是 0

redis.Incr(key).Err()

// 返回error类型,'ERR increment or decrement would overflow'

redis.Incr(key).Result()

// 返回类型是(int64, error), 值是0,错误也是'ERR increment or decrement would overflow'

# incr真的不能乱用哈

最后的最后,9223372036854775807实在太大了,我算了一下,9223372036854775807这个数,好像是有点大

9223372036854775807秒是106751991167300.65天,QPS是20000的话,也得连续请求5337599558天,哈哈哈哈哈


http://chatgpt.dhexx.cn/article/IstiDgM5.shtml

相关文章

《Redis系列第三篇、incr与decr使用|CSDN创作打卡》

incr与decr的效率要高于set操作,故而个人在开发过程中用作高并发的时候的限制器,效果非常nice的。 接下来看看具体用法与官方解释啊。 incr自增将存储的key数字加一 使用方法 incr testNum incr testNum incr testNum incr testNum incr testNum incr …

incr、incrby、decr、decrby命令的作用和用法

redis中incr、incrby、decr、decrby属于string数据结构,它们是原子性递增或递减操作。 incr递增1并返回递增后的结果;incrby根据指定值做递增或递减操作并返回递增或递减后的结果(incrby递增或递减取决于传入值的正负);decr递减1并返回递减后的结果&…

Redis:字符串INCR、INCRBY、INCRBYFLOAT、DECR、DECRBY命令介绍

INCR INCR key可用版本: > 1.0.0 时间复杂度: O(1)为键key对应的数字字符串(整数)加上一。 演示 如果键key不存在, 那么它的值会先被初始化为 0 , 然后再执行INCR命令。 INCR命令会返回键key对应的数…

利用Redis原子计数器incr实现计数器及接口限流

一、INCR命令介绍 Redis Incr 命令将 key 中储存的数字值增一。 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。且将key的有效时间设置为长期有效 。 如果值包含错误的类型,或字符串类型的值不能表示为数字&#x…

后渗透——内网转发之利用EarthWorm与proxifier搭建正向代理服务器

EarthWorm是一款用于开启 SOCKS v5 代理服务的工具,基于标准 C 开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发。 Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTP…

红蓝对抗之隧道技术第二篇(reGeorg内网穿透、SSH隧道本地Socks代理、SSH远程转发、Earthworm Socks5代理、Tunna正向代理、ICMP隧道、DNS隧道、Frp穿透)

文章目录 隧道应用reGeorg内网穿透SSH本地转发(正向)场景一场景二 SSH远程转发(反向)Earthworm Socks5代理正向代理反向代理 Tunna正向代理ICMP隧道DNS隧道Frp穿透推荐阅读&工具包 隧道应用 在进行内网渗透时,由于外网主机无法直接连接内网主机,所以…

earthworm四步走(解决拨入VPN后使用burp无法抓包的问题)

一、earthworm下载路径:https://github.com/idlefire/ew 二|、解压文件 三、执行命令:ew_for_Win.exe -s ssocksd -l 8888 四、设置burp上游代理

渗透测试之反弹代理(socks代理) (Earthworm工具) (windows和linux中的代理)

反弹代理 内网渗透不光只是反弹一个shell,反弹一个端口,我们更需要对内网进行更深一步的扫描和渗透,这时候就需要设置找到一个代理服务器,充当外网和内网数据转发的节点。 所以出现了反弹代理,也叫反弹socket。 使用…

NOIP 2016 提高组 复赛 第二天 第二题 蚯蚓 earthworm AC代码(单调队列)+15分代码(排序)+35分代码(堆 大顶堆 优先队列)+85分代码(更改堆中元素)

NOIP 2016 提高组 复赛 第二天 第二题 蚯蚓 earthworm AC代码(单调队列)15分代码(排序)35分代码(堆 大顶堆 优先队列)85分代码(更改堆中元素) 总目录详见:NOIP 提高组 复赛 试题 目录 信奥 历年 在线测评地址:https://www.luogu.com.cn/problem/P…

后渗透——内网转发之利用EarthWorm与proxifier搭建反向代理服务器

EarthWorm是一款用于开启 SOCKS v5 代理服务的工具,基于标准 C 开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发。 Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTP…

【教程】使用Earthworm (EW) 做Socks5代理完成内网穿透

EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。 考虑到该工具影响很坏,该工具永久停止更新。 介绍: 示意图: 该工具能够以“正向”、“反向”、“…

内网穿透大杀器--EarthWorm

0x00 前言如果感觉本文对你有帮助,请在文章末尾点个赞,谢谢表哥们支持! 当你在内网渗透,并且拿下一台机器的权限时,你是不是觉得已经算是一次完整的渗透了? 不来一次内网漫游,渗透是不完整的&am…

EW(EarthWorm) 反向 socks5 代理

今天本想对学校的内网服务器进行人生中第一次横向渗透,奈何情况不允许,但好歹学习了一些东西,总要写下来保存 工具: EW: https://github.com/idlefire/ew proxychains: https://github.com/rofl0r/proxychains-ng 小米随身wifi…

使用Earthworm (EW) 做Socks5代理

正向代理 1.选择合适的ew文件(将文件ew_…改为ew.exe,为了在命令行少敲几个字母),上传到边缘服务器 2.边缘服务器输入 ew.exe -s ssocksd -l 8000 3.可借助proxifier工具配置攻击机整台机器的代理(proxifier添加代理服务器,ip为边…

EarthWorm结合proxifier的使用学习

拿下一个目标机器的web权限后,如何在本机就可以通过这台被拿下webshell的机器访问内网的其他主机的端口服务呢? 拿下一个shell后,想要访问这个shell主机的其他内网机器的服务,可以用earthworm作为一个流量转发,把ew对应…

内网渗透-Earthworm的简单使用(内网穿透工具)

Earthworm的简单介绍(一) 文章目录 EarthWorm下载地址1. 普通网络 1.1 跳板机存在公网IP 1.1.1 网络环境1.1.2 使用方法1.1.3 流量走向 1.2 跳板机不存在公网IP,可出网 1.2.1 网络环境1.2.2 使用方法1.2.3 流量走向 2. 二级网络 2.1 一级跳…

基于EarthWorm的正反向socks5代理

EarthWorm EarthWorm(ew)是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,可在复杂网络环境下完成…

earthworm系列-earthworm介绍

earthworm的官方网站:http://www.earthwormcentral.org 1 Earthworm 简介 Earthworm 项目始于1993 年,主要目的是为了解决美国地震区域台网出现的问题。当时,区域内的地震台网存在的主要问题有:观测设备陈旧,…

内网渗透工具Earthworm简单使用

EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限…