4.2过期时间

*4.2.1命令介绍

在redis中使用 expire 命令设置一个键的过期时间后redis会自动删除它.

expire key seconds (seconds单位是秒,必须是整数)

  • 返回值是1表示设置成功,返回0则表示键不存在或设置失败

查看见还有多久被删除: ttl key

  • 返回值是键的剩余时间,-1表示该键没有设置过期时间,-2表示该键不存在

取消键的过期事件设置: persist key

为该键重新赋值也会清除键的过期时间

pexpire key msec (msec单位是毫秒)

expireat key Unix (使用Unix时间作为键的过期时间)

pexpireat key Unix (时间单位是毫秒)

  • watch命令监测一个拥有过期时间的键,该键时间到期自动删除,并不会被watch

    命令认为该键被改变
    127.0.0.1:6379> set foo '李白乘舟将欲行'
OK
127.0.0.1:6379> expire foo 300
1
127.0.0.1:6379> ttl foo
293
127.0.0.1:6379> ttl foo
248
127.0.0.1:6379> persist foo
1
127.0.0.1:6379> ttl foo
-1

4.2.2实现访问频率限制之一

减轻服务器压力,限制每个用户(以IP计)一段时间最大访问量.

例如要限制每分钟每个用户最多只能访问100个页面:

对每个访问用户使用一个名为 rate.limiting:用户IP 的字符串类型键,每次

用户访问则使用incr命令递增该键的键值.如果递增后的值是1(第一次访问页面),则

同时还要设置该键的过期时间为1分钟.这样每次用户访问页面时都读取该键的键

值,如果超过100就表明该用户的访问频率超过了限制,需要提示用户稍后访问.该

键每分钟会自动删除,所以下一分钟用户的访问次数又会重新计算.

伪代码:

    $isKeyExists = exists rate.limiting:$IP
if $isKeyExists is 1
$times = incr rate.limiting:$IP
if $times > 100
print 访问频率超过了限制,请稍后再试
exit
else
multi
incr rate.limiting:$IP
expire $keyName, 60
exec

4.2.3实现访问频率限制之二

4.2.2中伪代码问题:只能限制从计数开始的这一分钟内次数,不能限制任意一分钟内访

问次数.伪代码:

    $listLength = llen rate.limiting:$IP
if $listLength < 10
lpush rate.limiting:$IP, now()
else
$time = lindex rate.limiting:$IP, -1
if now() - $time < 60
print 访问频率超过了限制,请稍后再试
exit
else
lpush rate.limiting:$IP, now()
ltrim rate.limiting:$IP, 0, 9

问题:

  1. 占用较多的存储空间
  2. 出现竞态条件
  • redis获取当前时间命令: time

    返回值:一个包含两个字符串的列表,第一个字符串是当前时间(以UNIX时间戳

    格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数。
        127.0.0.1:6379> time
    1545456190
    429700

4.2.4实现缓存

为了提高网站的负载能力,常常将一些访问频率较高但是对cpu或IO资源消耗较大

的操作的结果缓存起来,并希望这些缓存过一段时间自动过期.

例如教务网站对全校所有学生各个科目成绩汇总排名,并在首页显示钱10名的学生

姓名,伪代码:

    $rank = get cache:rank
if not $rank
$rank = 计算排名
multi
set cache:rank, $rank
expire cache:rank 7200
exec
  • 将结果存储2小时

问题:

  1. 服务器内存有限时,如果大量使用缓存键且过期时间设置得过长会导致redis

    占满内存
  2. 把redis缓存键过期时间设得太短,导致缓存命中率过低且大量内存闲置
  • 实际开发中很难为缓存键设置合理的过期时间,为此限制redis能够使用的最大内存.

    并让redis按照一定的规则淘汰不需要的缓存键.具体的设置方法为:

    修改配置文件的 maxmemory参数,闲置redis最大可用内存大小,当 超出限制redis会依据 maxmemory-policy参数指定的策略来删除不需要的键,直到 redis占用内存小于指定内存.

表4-1 redis支持淘汰键的规则

规则 说明
volatile-lru 使用LRU算法删除一个键(只对设置了过期时间的键)
allkeys-lru 使用LRU算法删除一个键
volatile-random 随机删除一个键(只对设置了过期时间的键)
allkeys-random 随机删除一个键
volatile-ttl 删除过期时间最近的一个键
noeviction 不删除键,只返回错误

maxmemory-policy支持的规则如上表所示.其中LRU算法即"最近最少使用".

Redis自学笔记:4.2进阶-过期时间的更多相关文章

  1. Redis学习笔记(十)——过期时间、访问限制与缓存

    http://irfen.me/redis-learn-10-time-expire-limit-cache/ 过期时间 之前应该提到过 redis 的特性之一是可以设置键的超时时间.命令是expir ...

  2. Redis自学笔记:4.3进阶-排序

    4.3排序 4.3.1有序集合的集合操作 有序集合没有zinter和zunion命令,使用其他命令实现方法: multi zinterstore tempKey ... zrange tempKey ...

  3. Redis自学笔记:4.4进阶-消息通知

    4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...

  4. Redis自学笔记:4.1进阶-事务

    第4章:进阶 4.1事务 4.1.1概述 redis中的事务是一组命令的集合 事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行, 要么都不执行 事务的原理是先将一个事务的命令发送 ...

  5. Redis设置和更新Key的过期时间

    EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的』(volati ...

  6. Redis自学笔记:5.实践

    第5章实践 5.3 python与redis 5.3.1安装 pip install redis 5.3.2使用方法 自己补充内容:Ubuntu下redis开启远程连接 打开redis配置:sudo ...

  7. redis中获取没有设置ttl过期时间的key

    需求:redis作为一个内存型的数据库,我们需要对过期key保持关注,从info keyspace中可以看出有多少key没有设置过期时间,那么到底是哪些呢? 说明:关于redis ttl 的返回值,请 ...

  8. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  9. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

随机推荐

  1. ubuntu 安装Mysql8.0

    1. 去官网下载安装包 下载链接:点击打开链接 https://dev.mysql.com/downloads/mysql/ 如果你的系统是32位选择第一个,64位选择第二个 也可以用wget 下载 ...

  2. Jmeter 谷歌插件工具blazemeter录制脚本

    1.下载谷歌浏览器插件工具:blazemeter. 2.在谷歌浏览器中拖放安装扩展工具:blazemeter. 粘贴的图像828x219 13.5 KB 3.测试网站利用这个工具录制jmter脚本. ...

  3. ajax请求成功 但是被error拦截

    前端与后台的数据格式不符合 例如后台发过来的一段数据格式是json 然而我们却用默认的fromData去解析,便会被error拦截 在ajax 添加 dataType:'json',

  4. String 类的实现(2)引用计数与写时拷贝

    1.引用计数 我们知道在C++中动态开辟空间时是用字符new和delete的.其中使用new test[N]方式开辟空间时实际上是开辟了(N*sizeof(test)+4)字节的空间.如图示其中保存N ...

  5. 滴水穿石-01JAVA和C#的区别

    排名不分先后,想到哪写到哪 1:数组的定义格式不同 java定义: 方式1: ] ; 方式2: ] ; C#中只有方式1 java有两种,C#只有一种 2:继承的实现关键字不同,同时java中实现接口 ...

  6. 蓝桥杯  历届试题 幸运数  dfs

    历届试题 幸运数 时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...

  7. SVN_2008R2 搭建流程与规范

    Svn服务在win2008 搭建 1:svn服务的原理与架构 1.Svn服务可以理解为加强版的ftp文件服务器, svn采用HTTP协议的方式进行文件传输 2.服务端安装好后,普通用户也需要下载一个c ...

  8. webpack学习笔记--配置devServer

    devServer 1-6 使用DevServer 介绍过用来提高开发效率的 DevServer ,它提供了一些配置项可以改变 DevServer 的默认行为. 要配置 DevServer ,除了在配 ...

  9. python_异常处理_断言

    一.Python标准异常 常用异常 Exception 常规错误的基类 AttributeError 试图访问一个对象没有的属性 IOError 输入/ 输出异常,基本上是无法打开文件 ImportE ...

  10. BZOJ1095 [ZJOI2007]Hide 捉迷藏 动态点分治 堆

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ1095.html 题目传送门 - BZOJ1095 题意 有 N 个点,每一个点是黑色或者白色,一开始所 ...