ioredis
ioredis 是一个强大且流行的 Node.js库,用于与 Redis 进行交互。Redis 是一个开源的内存数据结构存储系统。ioredis 提供了一个简单高效的 API,供 Node.js 应用程序与 Redis 服务器进行通信。
以下是 ioredis 的一些主要特点:
- 高性能:ioredis 设计为快速高效。它支持管道操作,可以在一次往返中发送多个 Redis 命令,从而减少网络延迟。它还支持连接池,并且可以在连接丢失时自动重新连接到 Redis 服务器。
- Promises 和 async/await 支持:ioredis 使用 promises,并支持 async/await 语法,使得编写异步代码和处理 Redis 命令更加可读。
- 集群和 sentinel 支持:ioredis 内置支持 Redis 集群和 Redis Sentinel,这是 Redis 的高级功能,用于分布式设置和高可用性。它提供了直观的 API,用于处理 Redis 集群和故障转移场景。
- Lua 脚本:ioredis 允许你使用 eval 和 evalsha 命令在 Redis 服务器上执行 Lua 脚本。这个功能使得你可以在服务器端执行复杂操作,减少客户端与服务器之间的往返次数。
- 发布/订阅和阻塞命令:ioredis 支持 Redis 的发布/订阅机制,允许你创建实时消息系统和事件驱动架构。它还提供了对 BRPOP 和 BLPOP 等阻塞命令的支持,允许你等待项目被推送到列表中并原子地弹出它们。
- 流和管道:ioredis 支持 Redis 的流数据类型,允许你消费和生成数据流。它还提供了一种方便的方式将多个命令进行管道化,减少与服务器之间的往返次数。
使用方法
安装:
npm i ioredis
连接redis
import IoRedis from 'ioredis';
const redis = new IoRedis({
host: 'localhost',
port: 6379,
})
1. 字符串的用法
存储字符串并且设置过期时间
ioredis.setex(‘key’, 10, ‘value’)
普通存储
ioredis.set(‘key’, ‘value’)
读取
ioredis.get(‘key’)
// redis字符串的用法
redis.set("name", "zhangsan")
redis.get("name").then(res => {
console.log(res) // zhangsan
})
2. 集合的用法
添加元素到集合
redis.sadd(‘setname’, ‘element1’, ‘element2’, ‘element3’);
从集合中移除元素
redis.srem(‘setname’, ‘element2’);
检查元素是否存在于集合中
redis.sismember(‘setname’, ‘element1’)
.then((result) => {
console.log(‘Is member:’, result); // true
});
获取集合中的所有元素
redis.smembers(‘setname’)
.then((members) => {
console.log(‘Members:’, members);
});
// redis集合的用法
redis.sadd("set", "a", "b", "c")
// 从集合中移除元素
redis.srem("set", "a")
// 获取集合中的元素个数
redis.scard("set").then(res => {
console.log(res) // 2
})
// 判断元素是否在集合中
redis.sismember("set", "b").then(res => {
console.log(res) // 1
})
redis.smembers("set").then(res => { // 获取集合中的所有元素
console.log(res)
})
3. 哈希表的用法
//redis 哈希表的用法啊
redis.hset("hash", "name", "zhangsan")
redis.hset("hash", "age", 18)
// 读取指定
redis.hget("hash", "name").then(res => {
console.log(res) // zhangsan
})
// 读取所有
redis.hgetall("hash").then(res => {
console.log(res) // { name: 'zhangsan', age: '18' }
})
4.list的用法
// list的用法
redis.lpush("list", "a", "b", "c") // 从左边插入元素(头插)
redis.rpush("list", "d", "e", "f") // 从右边插入元素(尾插)
// 获取所有
redis.lrange("list", 0, -1).then(res => {
console.log(res) // [ 'c', 'b', 'a', 'd', 'e', 'f' ]
})
// 获取指定位置的元素
redis.lindex("list", 2).then(res => {
console.log(res) // a
})
// 获取列表长度
redis.llen("list").then(res => {
console.log(res)
})
// 删除指定位置的元素
redis.lrem("list", 0, "a").then(res => {
console.log(res) // 1
})
5. 发布于订阅
import IoRedis from 'ioredis';
const redis = new IoRedis({
host: 'localhost',
port: 6379,
})
// redis发布于订阅
// 订阅
redis.subscribe('channel')
//监听事件
redis.on('message', (channel, message) => {
console.log(`Received message ${message} from channel ${channel}`);
})
// 发布
const redis2 = new IoRedis({
host: 'localhost',
port: 6379,
})
redis2.publish('channel', 'Hello, world!');
定时任务
什么是定时任务
定时任务是指在预定的时间点或时间间隔内执行的任务或操作。它们是自动化执行特定逻辑的一种方式,可用于执行重复性的、周期性的或计划性的任务。
定时任务通常用于以下情况:
- 执行后台任务:定时任务可用于自动执行后台任务,如数据备份、日志清理、缓存刷新等。通过设定适当的时间点或时间间隔,可以确保这些任务按计划进行,而无需手动干预。
- 执行定期操作:定时任务可用于执行定期操作,如发送电子邮件提醒、生成报告、更新数据等。通过设定适当的时间点,可以自动触发这些操作,提高效率并减少人工操作的需求。
- 调度任务和工作流:定时任务可以用于调度和协调复杂的任务和工作流程。通过设置任务之间的依赖关系
安装依赖
npm install node-schedule
一般定时任务都是用cron
表达式去表示时间的
Cron表达式是一种用于指定定时任务执行时间的字符串表示形式。它由6个或7个字段组成,每个字段表示任务执行的时间单位和范围。
Cron表达式的典型格式如下:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └── 星期(0 - 6,0表示星期日)
│ │ │ │ └───── 月份(1 - 12)
│ │ │ └────────── 日(1 - 31)
│ │ └─────────────── 小时(0 - 23)
│ └──────────────────── 分钟(0 - 59)
└───────────────────────── 秒(0 - 59)
每个字段可以接受特定的数值、范围、通配符和特殊字符来指定任务的执行时间:
- 数值:表示具体的时间单位,如1、2、10等。
- 范围:使用
-
连接起始和结束的数值,表示一个范围内的所有值,如1-5表示1到5的所有数值。 - 通配符:使用
*
表示匹配该字段的所有可能值,如*
表示每分钟、每小时、每天等。 - 逗号分隔:使用逗号分隔多个数值或范围,表示匹配其中任意一个值,如1,3表示1或3。
- 步长:使用
/
表示步长,用于指定间隔的数值,如*/5
表示每隔5个单位执行一次。 - 特殊字符:Cron表达式还支持一些特殊字符来表示特定的含义,如
?
用于替代日和星期字段中的任意值,L
表示最后一天,W
表示最近的工作日等。
以下是一些常见的Cron表达式示例:
* * * * *
:每分钟执行一次任务。0 * * * *
:每小时的整点执行一次任务。0 0 * * *
:每天的午夜执行一次任务。0 0 * * 1
:每周一的午夜执行一次任务。0 0 1 * *
:每月的1号午夜执行一次任务。0 0 1 1 *
:每年的1月1日午夜执行一次任务。
案例
-
每5秒钟打印一句hello word
import schedule from "node-schedule"; schedule.scheduleJob("*/5 * * * * *", () => { console.log("Hello World!"); })