Redis-Key的生存时间

本文介绍Redis中如何利用时效性Key解决网站访问频率限制等问题,包括expire、ttl和persist等命令的使用方法。

在实际开发过程中,经常会遇到一些有实效性的数据,比如限时优惠、缓存、验证码等等,过了一段时间后就应该删除这些数据。如果用关系型数据库,那么就需要在表中增加一个字段存储实效时间,然后定时轮询该字段并判断删除。而在redis中,可以使用expire命令给key设置有效时间来实现这个需求。

操作命令

expire key seconds    #设置key的有效时间  单位为秒
ttl key               #获取key的剩余有效时间
persist key           #设置有时效性的key为持久key

注意,对有实效性的key使用set会字段取消实效设置,变成持久key。

示例:

127.0.0.1:6379> set session:a34d zhangsan
OK
127.0.0.1:6379> expire session:a34d 20
(integer) 1
127.0.0.1:6379> ttl session:a34d
(integer) 2
127.0.0.1:6379> ttl session:a34d
(integer) -2
127.0.0.1:6379> get session:a34d
(nil)
127.0.0.1:6379> set session:a34d 40
OK
127.0.0.1:6379> ttl session:a34d
(integer) -1
127.0.0.1:6379> expire session:a34d 30
(integer) 1
127.0.0.1:6379> ttl session:a34d
(integer) 22
127.0.0.1:6379> persist session:a34d
(integer) 1
127.0.0.1:6379> ttl session:a34d
(integer) -1
127.0.0.1:6379> get session:a34d
"40"
127.0.0.1:6379> 

实践

1)限制具体IP在某个时段内的访问次数
有时,出于对网站的保护,我们需要对同一个ip的访问频率做出限制,以防止黑客攻击、网络爬虫给网站造成负载过大甚至崩溃。

对于这个需求,利用具有时效性的key就可以很好的解决。例如,限制每个用户每分钟最多访问网站100次,对应的思路就是:

对每一个用户创建一个名为rate.limiting:userip的键
设置改键的生存时间为1分钟
每次用户访问时,首先读取这个键的键值
判断是否超过100
使用incr命令将该键值+1
有效时间到,键自动删除
用户再访问时,重建该键,循环往复

伪代码如下:

$isKeyExists = exists rate.limiting:$ip
#如果存在
if $isKeyExists is 1
    $times = incr rate.limiting:$ip
    if $times > 100
        print "post limit"
        exit
else
    incr rate.limiting:$ip   #自动创建并初始值1
    expire rate.limiting:$ip 60

上面的代码有一个非常严重的潜在问题,如果成行在运行完inr rate.limiting:$ip后因为某种原因退出了,那么这个key就没有被设置有效时间,此后,这个ip在访问网站时,就会跳过访问频率的限制。

我们可以利用reids提供的事务能力对上面的代码进行改写

$isKeyExists = exists rate.limiting:$ip
#如果存在
if $isKeyExists is 1
    $times = incr rate.limiting:$ip
    if $times > 100
        print "post limit"
        exit
else
    mulit
        incr rate.limiting:$ip   #自动创建并初始值1
        expire rate.limiting:$ip 60
    exec
Redis-Sys 7.4.2 是 Redis 的一个版本,它支持丰富的命令集,用于操作和管理 Redis 数据库。以下是一些常用的命令及其用途: ### 基础命令 1. **连接与认证** - `redis-cli -h 127.0.0.1 -p 6379`:使用 `redis-cli` 工具连接到本地运行的 Redis 服务[^1]。 - `AUTH password`:如果 Redis 配置了密码保护,使用此命令进行认证。 2. **键操作** - `SET key value`:设置指定键的值。 - `GET key`:获取指定键的值。 - `DEL key`:删除指定键。 - `EXISTS key`:检查指定键是否存在。 - `TTL key`:获取指定键的剩余生存时间(以秒为单位)。 3. **数据类型操作** - **字符串** - `INCR key`:将指定键的值增加 1。 - `DECR key`:将指定键的值减少 1。 - **列表** - `LPUSH key value`:将值插入到列表头部。 - `RPUSH key value`:将值插入到列表尾部。 - `LPOP key`:移除并返回列表的第一个元素。 - `RPOP key`:移除并返回列表的最后一个元素。 - **集合** - `SADD key member`:向集合中添加成员。 - `SMEMBERS key`:获取集合中的所有成员。 - `SREM key member`:从集合中移除成员。 - **哈希表** - `HSET key field value`:设置哈希表中字段的值。 - `HGET key field`:获取哈希表中字段的值。 - `HDEL key field`:删除哈希表中的字段。 4. **服务器管理** - `INFO`:获取 Redis 服务器的各种信息和统计。 - `PING`:测试 Redis 服务器是否响应。 - `SHUTDOWN`:关闭 Redis 服务器。 ### 高级功能 1. **主从复制** - `SLAVEOF host port`:将当前实例配置为指定主机和端口的从服务器。 - `SLAVEOF NO ONE`:停止复制,将当前实例变为主服务器。 2. **哨兵机制** - `SENTINEL MONITOR master-name ip port quorum`:监控指定的主服务器。 - `SENTINEL GET-MASTER-ADDR-BY-NAME master-name`:获取指定主服务器的地址和端口。 - `SENTINEL RESET pattern`:重置所有匹配模式的主服务器的哨兵状态。 3. **集群管理** - `CLUSTER NODES`:显示集群节点信息。 - `CLUSTER MEET ip port`:让当前节点与其他节点握手,加入集群。 - `CLUSTER ADDSLOTS slot1 slot2 ... slotN`:分配槽位给当前节点。 ### 示例代码 以下是一个简单的 Python 脚本,演示如何使用 `redis-py` 库连接到 Redis 服务器并执行一些基本命令: ```python import redis # 连接到 Redis 服务器 r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0) # 设置键值 r.set('mykey', 'myvalue') # 获取键值 value = r.get('mykey') print(f"Value of 'mykey': {value.decode()}") # 删除键 r.delete('mykey') ``` ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值