incr 过期时间的设置有点纠结 现在俩种方案
第一个
value = get(key)
if (value == null) {
incr(key)
expire(key)
} else{
incr(key)
}
还有就是 用一次设置一次
incr(key)
expire(key)
那个好一点
incr 过期时间的设置有点纠结 现在俩种方案
第一个
value = get(key)
if (value == null) {
incr(key)
expire(key)
} else{
incr(key)
}
还有就是 用一次设置一次
incr(key)
expire(key)
那个好一点
|
1
inc 有返回值的
|
|
optionalDec 13, 2019 via iPhone
2
lua
|
|
threee333Dec 13, 2019
5
我一般都是用的第二种方案,省去了判断,少了一步操作。代价只是 key 被多缓存一段时间多占用一点内存而已。
|
|
swullingDec 13, 2019
7
先不考虑多线程问题,你这两个方案不等价。
|
|
BBCCBBDec 13, 2019
8
if value == null :
set(key, 1, ttl=xxx) else: incr(key) 这样行不行, set 命令支持直接设置 ttl |
|
BBCCBBDec 13, 2019
9
incr 和 expire 分两步执行是有问题的, 网络抖动等会导致可能设置不到 ttl, 就完蛋了
|
|
swullingDec 13, 2019
10
如果希望用方案 2,加一个 multi exec 事务就行了。我个人更喜欢事务,非不得已不用 lua
|
|
rrfengDec 13, 2019 via Android
11
incr 不存在的自动置 0 并递增
multi incr expire exec |
|
qxgDec 13, 2019
12
刚好有这个需求,目前的方案是采用 multi incr + expire,但是耗时比单独 incr 高很多,所以后续优化考虑在本地做一个 map 的缓存,第一次 incr 的时候使用 multi incr + expire,并将 key 存到本地的 map 里,后续只需要判断下本地的 map 里是否存在该 key,如果存在,只需执行 incr 即可。
|
|
tr0ubleDec 13, 2019
13
ok = set key 1 nx ex 10
if ok : count =1 else: count = incr key |
|
hipopMar 16, 2021
14
lua 脚本
count = incr key if (count == 1) then expire key 10000 end |
|
chengziJul 28, 2022
15
```
value = get(key) if (value == null) { incr(key) expire(key) // incr(), expire() 需要保证原子性, 需要用 multi(), exec() 包一下 } else{ incr(key) // get(), incr() 中间是有时间差的, 如果 incr() 时 key 已经过期, 就会出现 key 无法过期释放问题 } ``` 最简单的方案是用 lua 脚本, 或者参考 redis 官网文档里的 RPUSHX 方案 ( https://redis.io/commands/incr/) |