Redis单线程为啥还有incrby方法?


目录

  1. Redis单线程下的漏计数问题
  2. incrby方法解决并发问题

参考:

Redis单线程下的漏计数问题

问题

​ Redis以单线程运行,但是我们在使用Redis处理并发写问题时,还是会使用Redis的incrby方法,而不是直接get和set,为啥呢?

回答

​ 以并发计数为例子,在计数加1的时候,每个请求都会先get再set

String curCnt = redisClient.get("key");
redisClient.set("key", String.valueOf(Integer.valueOf(curCnt) + 1));

​ 单线程运行下,并发请求过来的时候,对于get和set的执行顺序并不能保证,很可能出现下面这种情况

> get key
> get key
> set key
> set key

这种情况下就会漏计数

incrby方法解决并发问题

1、incr命令

Redis Incr 命令将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

2、incrBy命令

Redis Incrby 命令将 key 中储存的数字加上指定的增量值。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

这两个命令在redis服务器上仍然是串行的单线程执行,但是都是原子自增,不可以满足并发写场景的安全性。


文章作者: 小小千千
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小千千 !
评论
  目录