Redis超时处理法优雅解决超时问题(redis超时怎么处理)

Redis超时处理法是将超时处理任务与检测超时分离,分别由定期尝试调用超时处理函数和将执行即将超时任务及其超时时间存储在…

Redis超时处理法是将超时处理任务与检测超时分离,分别由定期尝试调用超时处理函数和将执行即将超时任务及其超时时间存储在Redis中两个客户端来完成。

### 一、客户端1——定期尝试调用超时处理函数

定期尝试调用超时处理函数的客户端一般是一个Redis服务器的客户端,每隔一段时间(比如1-3秒)从Redis中取出超时任务,然后调用其超时处理函数,完成超时处理任务。此客户端的大体步骤如下:

1. 从Redis的list类型的key中获取需要处理的任务;

2. 调用任务相关的超时处理函数;

3. 删除已处理的任务;

以Node.js为例,定期尝试调用超时处理函数的客户端可以编写成如下代码:

“`js

const Redis = require(‘ioredis’);

const redis = new Redis();

const rpopAndDoTimeout = async function () {

let listKey = `timeout-task-list`;

const taskObj = awt redis.rpop(listKey);

if (taskObj) {

const timeoutEntity = JSON.parse(taskObj);

doTaskTimeout(timeoutEntity);

}

};

// 定时任务

setInterval(rpopAndDoTimeout, 1000);


### 二、 客户端2——将执行即将超时任务及其超时时间存储在Redis中

将执行即将超时任务及其超时时间存储在Redis中一般是另一个Redis服务器的客户端,用户每次产生一个新任务或者修改已有任务,都会通过此客户端将该任务及其超时时间存入Redis中。其大体步骤如下:

1. 用户提交新任务;
2. 计算并设置任务的超时时间;
3. 将任务及其超时时间(使用EPOCH时间格式存储)组装成任务信息放入Redis的list类型的key;

以Python为例,将执行即将超时任务及其超时时间存储在Redis中的客户端可以编写成如下代码:

```py
import json
import redis
import time
def pushTimeoutTaskToRedis(timeoutEntity):
# T【任务超时时间】
T = time.time() + timeoutEntity.timeout
task_obj = {
"id": timeoutEntity.id,
"ttl": T
}

task_str = json.dumps(task_obj)

# 将任务放入Redis中
r = redis.Redis(host='localhost', port=6379, db=0)
list_key = "timeout-task-list"
r.lpush(list_key, task_str)

通过以上两个客户端设计,就可以用redis来实现优雅解决超时问题。

香港服务器首选港服(Server.HK),2H2G首月10元开通。
港服(Server.HK)(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

为您推荐

港服(Server.HK)MongoDB教程:MongoDB 索引

MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件...

港服(Server.HK)PostgreSQL教程PostgreSQL 别名

PostgreSQL 别名 我们可以用 SQL 重命名一张表或者一个字段的名称,这个名称就叫着该表或该字段的别名。 创建...

港服(Server.HK)Memcached教程:Memcached stats 命令

Memcached stats 命令 Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号...

港服(Server.HK)Redis教程:Redis 数据类型

Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集...

港服(Server.HK)Redis教程:Redis GEO

Redis GEO Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 ...
返回顶部