.1事务
redis中事务是一组命令的集合。
事务同命令一样都是redis的最小执行单位,Redis保证一个事务中的命令要么都执行,要么都不执行。如果redisClient在发送EXEC命令前掉线,则redis会清空事务队列,事务中的所有命令都不会执行;如果redisClient在发送EXEC命令后掉线,所有的命令依然会被执行,因为redis中已经记录了所有要执行的命令了。
另外,Redis保证一个事务从开始执行到执行结束期间,不会穿插的执行其它的命令或事务。
redis事务举例 |
4.1.2 redis事务的错误处理
命令执行出错的两种情况介绍: |
注意:redis事务没有回滚功能。对于刚才提到的会导致事务执行失败的两种错误,语法错误完全可以在开发时找出并解决;运行错误可以通过做好规划键名规范等来杜绝(这样就不会出现命令与键类型不匹配的情况了)。
4.1.3 Watch与UnWatch
Watch场景 |
|
场景:在事务中,有时候需要先获得一条命令的返回值,然后再根据这个值执行下一条命令;例如用事务来实现incr函数以防止竟态条件。 思路:要保证从get获得键值开始到incr函数执行结束为止,该键值不会被其它客户端修改,这样也可以防止竟态条件。 WATCH命令:用于监控一个或多个键,一旦其中有一个键被修改或者删除,之后的事务就不会执行(EXEC返回空结果nil);监控一直持续到EXEC命令(因为事务中的命令是在EXEC之后执行的,所以在事务中可以修改WATCH监控的键值)。
|
|
存在竟态条件的原始伪码 |
用事务改造以防止竟态条件 |
def incr($key) $value = GET $key if not $value $value = 0 $value = $value + 1 set $key, $value return $value |
def incr($key) WATCH $key $value = GET $key if not $value $value = 0 $value = $value + 1 MULTI set $key, $value result = EXEC // TODO result为nil则递归调用incr,否则返回结果 return result[0] |
UnWatch场景 |
|
4.2 过期时间
expire key seconds |
>> 设置(更新)一个键的过期时间,到期后redis会自动删除。 1表示设置成功; 0表示键不存在或设置失败。 |
pexpire key mseconds |
毫秒 |
ttl key |
>> 返回一个键还有多久到期(秒); 如果键不存在则返回-2; 如果键是永久的(即没有为键设置过期时间)则返回-1。 |
pttl key |
毫秒 |
persist key |
>> 取消键的过期时间设置; 1表示过期时间被成功清除; 否则返回0(键不存在或键本身就是永久的) 注意:set和getset为键赋值也会同时清除键的过期时间。 |
expireAt key utcSeconds pexpireAt key utlMSeconds |
两个不常用的命令,设置键的过期时刻 |
实践 |
1、实现访问频率限制之方案1
此方案的问题: 极端情况下,一个ip在第1分钟的第1秒访问了1次博客,建了一个键并设置60秒到期时间,然后在第1分钟最后一秒又访问80次,这样第一分钟内总共访问81次,是可以通过访问频率限制的,此时该键到期被删除。然后在第2分钟第一秒又访问了1次,会再建同名键并设置60秒的到期时间,第二分钟第2秒又访问了80次,依然可以通过访问频率限制。但是问题是从第1分钟最后1秒到第2分钟第2秒这3秒时间内访问次数是超过了100次的,我们需要粒度更小的控制方案。 |
2、实现访问频率限制之方案2(解决方案1的问题)
|
首页 上一页 1 2 3 下一页 尾页 1/3/3 | |
【大 中 小】【打印】 【繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部】 | |
上一篇:[20190419]shared latch spin cou.. | 下一篇:MySQL slow_log日志表出现非法字.. |