设为首页 加入收藏

TOP

读书笔记——《redis入门指南(第2版)》第四章 进阶——4.1-5(一)
2019-09-17 18:49:43 】 浏览:77
Tags:读书 笔记 redis 入门 指南 第四章 进阶 4.1-5

.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日志表出现非法字..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目