http://irfen.me/redis-learn-10-time-expire-limit-cache/

过期时间

之前应该提到过 redis 的特性之一是可以设置键的超时时间。命令是expire。

redis > SET session:27e7a id1234
OK
redis > EXPIRE session:27e7a 1200
(integer) 1

EXPIRE命令返回1表示成功,返回0表示键值不存在或设置失败。

同时这里还有一个比较常用的命令是ttl,用于查看一个键还有多久时间会被删除。返回的是剩余时间(秒数)。

这里就不贴代码了,有一点需要说明的是,ttl命令在键不存在或被删除之后,会返回-2,在没有为键设置生存时间(即永久存在,建一个键之后的默认情况)时返回的是-1。大家可以亲自操作一把。

如果想要把一个设置过过期时间的键取消过期时间设置,则需要使用persist命令。

redis > SET session:27e7a id1234
OK
redis > EXPIRE session:27e7a 1200
(integer) 1
redis > TTL session:27e7a
(integer) 1092
redis > PERSIST session:27e7a
(integer) 1
redis > TTL session:27e7a
(integer) -1

这里需要说明一点的是,除了使用persist命令外,使用set、getset命令为键赋值,也会同时消除键的生存时间,如果需要可以重新使用expire命令为键设置生存时间。而其他对键的操作命令(如incr、lpush、hset、zrem)都不会影响键的生存时间。

expire命令的单位是秒,而且这个参数必须为整数,如果需要更精准的时间的话,需要使用pexpire命令设置,其单位为毫秒,同理也需要用pttl命令来看键的剩余毫秒数。当然使用expire命令设置的过期时间也是可以用pttl看键的剩余毫秒数的。

访问限制

有时候我们会有一个需求是需要限制一个用户对一个资源的访问频率,我们假定一个用户(用IP作为判断)每分钟对一个资源访问次数不能超过10次。

我们可以使用一个键,每次用户访问则把值加1,当值加到10的时候,我们设定键的过期时间为60秒,并且禁止访问。这时候下次访问发现值为10,则不让访问了,然后60秒后键被删除,这时候再次创建键。这样就可以解决,但是其实这样时间并不精准,问题还是挺大的。

我们还有一个方案:使用队列。前面的章节也说到了,使用列表类型可以用作队列。

我们设定一个队列rate.limiting.192.168.1.1(假定是这个IP),我们把每次的访问时间都添加到队列中,当队列长度达到10以后,判断当前时间与队列第一个值的时间差是否小于60,如果小于60则说明60秒内访问次数超过10次,不允许访问;否则说明可以访问,则把队列头的值删除,队列尾增加当前访问时间。

这种方法可以比较精准的实现访问限制,但是当限制的次数比较大时,这种方法占用的存储空间也会比较大。

缓存

有时候会把一些对CPU或IO资源消耗比较大的操作结果缓存起来,并设置一定时间的自动过期。比如我们设定一个微博外链的最热站点缓存放于新浪微博的首页,这样我们不可能每次访问都重新计算最热的外链站点,所以我们可以设定两小时更新一次。每次访问是判断这个键有没有,如果存在则直接返回,如果没有则通过计算把内容存入键中,并设定两小时的过期时间。

然而在很多场合这种方法会很恐怖,当服务器内存有限的时候,大量使用缓存切设置生存时间过长就会导致redis占用太多内存,而redis有时候会把系统内存都吃掉,导致系统崩溃。但是设置时间过短又会导致缓存的命中太低。

所以我们最好的办法是设定缓存的淘汰规则。这种方式比较适用于将redis用作缓存系统的时候比较好。

具体就是:修改配置文件中的maxmemory参数,限制redis的最大内存,当超出后会按照maxmemory-policy参数指定的策略删除不需要的键,直到redis占用的内存小于设定值。

规则

说明

volatile-lru

使用LRU 算法 删除一个键(只对设置了生存时间的键)

allkeys-lru

使用LRU算法删除一个键

volatile-random

随机删除一个键(只对设置了生存时间的键)

allkeys- random

随机删除一个键

volatile-ttl

删除生存时间最近的一个键

noeviction

不删除键,只返回错误

其中的LRU算法即是【最近最少使用】。

这里提一句,实际上redis根本就不会准确的将整个 数据库 中最久未被使用的键删除,而是每次从数据库中随机取3个键并删除这3个键里最久未被使用的键。上面提到的所有的随机的操作实际上都是这样的,这个3可以用过redis的配置文件中的maxmemeory-samples参数配置。

Redis学习笔记(十)——过期时间、访问限制与缓存的更多相关文章

  1. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  2. Redis学习笔记十:独立功能之监视器

    通过执行 monitor 命令可以让客户端自己变成一个监视器,实时接收并打印当前处理的命令请求的相关信息. 127.0.0.1:6379> monitor OK 1451752646.83727 ...

  3. Redis学习笔记--Redis数据过期策略详解

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

  4. Redis学习笔记--Redis数据过期策略详解==转

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

  5. 狂神redis学习笔记

    一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用.随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据库就放不下了 ...

  6. redis学习笔记(详细)——高级篇

    redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...

  7. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  8. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  9. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  10. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

随机推荐

  1. trigger()的event事件对象之坑

    问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...

  2. 南阳理工ACM——106背包问题

    描述: 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你 ...

  3. 济南学习 Day2 T2 am

    [问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有

  4. 【风马一族_Python】 实施kNN算法

    一.在PyCharm 5.0.4(编写python程序的IDE) 编写kNN.py文件的代码 -------------------------- 1. kNN.py  运算符模块 --------- ...

  5. VS2015编译错误:调用的目标发生了异常--->此实现不是Windows平台FLPS验证的加密算法的一部分。

    在Win10下安装好几次VS2015(企业版)了,这次发生了一个奇怪的问题,错误截图如下: 控制台.WPF等项目均有此错误!但是ASP.NET项目却可以编译运行!一开始还以为VS2015安装错误,修复 ...

  6. 百度的domain命令到底有用吗?

    曾几何时,站长和seoer们在百度输入domain:xxxxxxxx的时候弹出的结果数量让多少人兴奋和失落,为什么我们对百度的domain命令如此着迷呢?因为我们都认为百度的domain命令是查询网站 ...

  7. php 获取链接参数

    private function getQuerystr($url,$key){        $res = '';        $a = strpos($url,'?');        if($ ...

  8. 使用Animation实现Button的透明度Opacity变化

    接着之前的使Button的Content变化的例子,这里给出使Button的透明度变化的写法. 前台写法: 后台写法: 效果图:Opacity的值正在变小 效果还不错,前台是用Blend生成的,后台的 ...

  9. 2014年互联网IT待遇(包括国内民企、外企、金融机构)

    一.民企 1. 百度 13k*14.6,special 14~17k*14.6 开发类 13K*14.6 (2014) 测试类.前端类 12K*14.6 (2014) 2. 腾讯 11.5k*16,s ...

  10. OSM 中国数据(每天都在更新)

    http://download.geofabrik.de/asia/china.html