目录
- Redis单线程下的漏计数问题
- 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服务器上仍然是串行的单线程执行,但是都是原子自增,不可以满足并发写场景的安全性。