过期时间
之前应该提到过 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学习笔记之数据类型 3 三、 redis学习笔记之排序 11 四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记...
redis学习笔记redis 是一个开源的 key-value 数据库。它又经常被认为是一个数据结构服务器。 因为它的 value 不仅包括基本的 string 类型还有 list,set ,sorted set 和 hash 类型。当 然这些类型的元素也都是 string...
这个“redis学习笔记.zip”压缩包很可能是包含了关于Redis的学习资料,可能包括概念解释、操作教程、实践案例等内容,适合初学者和有一定基础的学习者参考。 Redis的学习可以分为以下几个主要部分: 1. **基础知识...
本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...
### 超详细的Redis学习笔记知识点汇总 #### 1. Redis 的启动与停止 ##### 1.1 直接启动 Redis 服务 - **默认端口启动**:使用 `$ redis-server` 命令,默认监听端口为 `6379`。 - **指定端口启动**:使用 `$ ...
Redis学习笔记
1. 缓存:Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略,可以合理地使用缓存机制来提高网站的稳定性。 2. 排行榜系统:Redis提供了列表和有序集合数据结构,合理地使用这些...
此外,Key可以设置过期时间,使用expire命令设置过期时间后,Redis会自动删除过期的Key,ttl命令则可以查看Key的剩余存活时间。 Redis支持的五大数据类型包括String、List、Set、Sorted Set和Hash。在本次学习笔记...
在本“Redis学习笔记-包括周阳和狂神说”中,我们将深入探讨Redis的核心概念、功能特性以及实际应用。 1. Redis基本概念 - 键值对:Redis的核心数据结构,键是唯一的标识,值可以是多种类型,如字符串、哈希、列表...
Redis 是一款高性能的键值数据库,它以非关系型、内存存储的方式提供快速的数据访问。Redis 的设计目标是为了处理高并发、高扩展性场景,以及大数据存储问题。它支持多种数据结构,包括字符串(String)、链表(List)、...
本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...
Redis全套学习笔记 完整版pdf.rar set:添加键值对 get:获取值 apend:追价值 strlen:获取值的长度 setnx:key不存在时,设置key的值 incr:原子递增1 decr:原子递减1 incrby/decrby:递增或者递减指定的数字 ...
《狂神说Redis笔记》是针对Redis这一高性能的键值数据库进行深入讲解的资料,它涵盖了Redis的基础概念、核心功能以及在实际应用中的各种策略。Redis作为一款内存数据存储系统,广泛应用于缓存、消息队列、分布式锁等...
- **Key 管理命令**:如 `DEL` 删除 key,`EXPIRE` 设置 key 过期时间。 - **安全和认证管理**:启用认证,如 `AUTH` 登录,`RENAME-KEYSPACE` 更改命名空间。 - **事务管理**:使用 `MULTI`、`EXEC` 开启和提交事务...
redis学习笔记整理 一、 redis 环境搭建 2 二、 redis学习笔记之数据类型 3 三、 redis学习笔记之排序 11 四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七...
简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因 此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来...
Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...