学习node.js 十一 使用node.js操作redis和自动任务

ioredis

ioredis 是一个强大且流行的 Node.js库,用于与 Redis 进行交互。Redis 是一个开源的内存数据结构存储系统。ioredis 提供了一个简单高效的 API,供 Node.js 应用程序与 Redis 服务器进行通信。

以下是 ioredis 的一些主要特点:

  1. 高性能:ioredis 设计为快速高效。它支持管道操作,可以在一次往返中发送多个 Redis 命令,从而减少网络延迟。它还支持连接池,并且可以在连接丢失时自动重新连接到 Redis 服务器。
  2. Promises 和 async/await 支持:ioredis 使用 promises,并支持 async/await 语法,使得编写异步代码和处理 Redis 命令更加可读。
  3. 集群和 sentinel 支持:ioredis 内置支持 Redis 集群和 Redis Sentinel,这是 Redis 的高级功能,用于分布式设置和高可用性。它提供了直观的 API,用于处理 Redis 集群和故障转移场景。
  4. Lua 脚本:ioredis 允许你使用 eval 和 evalsha 命令在 Redis 服务器上执行 Lua 脚本。这个功能使得你可以在服务器端执行复杂操作,减少客户端与服务器之间的往返次数。
  5. 发布/订阅和阻塞命令:ioredis 支持 Redis 的发布/订阅机制,允许你创建实时消息系统和事件驱动架构。它还提供了对 BRPOP 和 BLPOP 等阻塞命令的支持,允许你等待项目被推送到列表中并原子地弹出它们。
  6. 流和管道: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!');

定时任务

什么是定时任务

定时任务是指在预定的时间点或时间间隔内执行的任务或操作。它们是自动化执行特定逻辑的一种方式,可用于执行重复性的、周期性的或计划性的任务。

定时任务通常用于以下情况:

  1. 执行后台任务:定时任务可用于自动执行后台任务,如数据备份、日志清理、缓存刷新等。通过设定适当的时间点或时间间隔,可以确保这些任务按计划进行,而无需手动干预。
  2. 执行定期操作:定时任务可用于执行定期操作,如发送电子邮件提醒、生成报告、更新数据等。通过设定适当的时间点,可以自动触发这些操作,提高效率并减少人工操作的需求。
  3. 调度任务和工作流:定时任务可以用于调度和协调复杂的任务和工作流程。通过设置任务之间的依赖关系

安装依赖

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日午夜执行一次任务。

案例

  1. 每5秒钟打印一句hello word

    import schedule from "node-schedule";
    
    schedule.scheduleJob("*/5 * * * * *", () => {
        console.log("Hello World!");
    })
    
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值