Redis 是一个性能非常好的内存数据库,部署在应用程序和MySql 数据中间做缓存数据库,可以极大的提升应用程序的性能,本文将介绍 Redi s在 Node.js 环境中的连接方法以及基本的使用。

Windows系统Redis的下载以及可视化管理工具Another Redis Desktop Manager的下载可以参考往期文章:前往文章
搭配可视化工具可以更直观地获取到数据变化的信息。

1.使用ioredis连接Redis

ioredis 是 Nodejs 的一个Redis模块,封装了各种操作 Redis 的 API 。ioredis模块文档

// 导入 ioredis 模块并配置端口和地址
const Redis = require("ioredis");
const redis = new Redis({
  port: 6379, // Redis port
  host: "127.0.0.1", // Redis host
  // username: "default", // needs Redis >= 6
  // password: "my-top-secret",
  db: 2, // Defaults to 0
});

// 连接成功后执行的回调函数
redis.on("connect", () => {
	console.log("Redis connected!");
});

// 连接出错时执行的回调函数
redis.on("error", (error) => {
	console.error("Redis error: ", error);
});

2.使用API操作Redis

(1)String类型

String类型是Redis最常用的数据类型,常用的操作如下:

// 设置键值对
redis.set('age', '20'); // 将键 age 对应的值设置为 20

// 获取键值对
redis.get('age').then(res => {
	console.log(res); // 输出20
});

// 递增操作
redis.incr('age'); // 将键 age 对应的值加 1

// 递减操作
redis.decr('num'); // 将键 age 对应的值减 1

// 设置过期时间
redis.expire('age', 60);  // 设置 age 的过期时间为 60s

// 设置键值对 同时设置过期时间
redis.set("age", "40", "EX", 60); // 将键 age 对应的值设置为40 过期时间为 60s

// 删除键值对
redis.del("sex"); // 将键 sex 对应的键值对删除

// 删除所有键值对
redis.flushall();

(2)List类型

List类型是Redis中的链表结构,可以通过push、pop等操作对列表进行操作,常用的操作如下:

// 在列表头部插入元素
redis.lpush("mylist", "one", "two", "three");

// 在列表尾部插入元素
redis.rpush("mylist", "four", "five", "six");

// 从列表头部弹出元素
redis.lpop("mylist").then((result) => {
  console.log(result); // 输出 'three'
});

// 从列表尾部弹出元素
redis.rpop("mylist").then((result) => {
  console.log(result); // 输出 'six'
});

// 获取列表长度
redis.llen("mylist").then((result) => {
  console.log(result); // 输出 '4'
});

// 获取列表中的元素
redis.lrange("mylist", 0, -1).then((result) => {
  console.log(result); // 输出 ['three','two','one','four','five']
});

// 删除列表中的元素
redis.lrem("mylist", 1, "one").then((result) => {
  console.log(result); // 输出 '1'
});

其中 lrange 方法用于获取指定范围内的元素,第二个参数和第三个参数分别表示开始和结束索引,如果第三个参数为 -1,则表示获取所有元素。lrem 方法用于删除指定元素,第二个参数和第三个参数分别表示删除的个数和删除的元素value,如果第二个参数的值为正数,则移除相应个数值为value的元素。如果参数的值为0,则移除所有值为value的元素。

(3)Hash类型

Hash类型是Redis中的键值对集合,常用的操作如下:

// 设置哈希表中的值
redis.hset("myhash", "field1", "value1");

// 获取哈希表中的值
redis.hget("myhash", "field1").then((result) => {
  console.log(result); // 输出 'value1'
});

// 批量设置哈希表中的值
redis.hmset("myhash", "field2", "value2", "field3", "value3");

// 批量获取哈希表中的值
redis.hmget("myhash", "field1", "field2", "field3").then((result) => {
  console.log(result); // 输出 ['value1', 'value2', 'value3']
});

// 获取哈希表中的字段数量
redis.hlen("myhash").then((result) => {
  console.log(result); // 输出 '3'
});

// 删除哈希表中的字段
redis.hdel("myhash", "field1").then((result) => {
  console.log(result); // 输出 '1'
});

// 获取哈希表中的所有字段名
redis.hkeys("myhash").then((result) => {
  console.log(result); // 输出 ['field2', 'field3']
});

(4)Set类型

Set类型是Redis中的无序集合,常用的操作如下:

// 向集合中添加元素
redis.sadd("myset", "one", "two", "three");

// 从集合中弹出元素
redis.spop("myset").then((result) => {
  console.log(result); // 输出 'three'
});

// 获取集合中的元素数量
redis.scard("myset").then((result) => {
  console.log(result); // 输出 '2'
});

// 获取集合中的所有元素
redis.smembers("myset").then((result) => {
  console.log(result); // 输出 ['one', 'two']
});

(5)Zset类型

Zset类型是Redis中的有序集合,其中的每个成员都有一个相关的score值,常用的操作如下:

// 向有序集合中添加元素
redis.zadd("myzset", 1, "one", 2, "two", 3, "three");

// 获取有序集合中指定范围内的元素
redis.zrange("myzset", 0, -1).then((result) => {
  console.log(result); // 输出 ['one', 'two', 'three']
});

// 获取有序集合中指定范围内的元素,按照分值从大到小排序
redis.zrevrange("myzset", 0, -1).then((result) => {
  console.log(result); // 输出 ['three', 'two', 'one']
});

// 获取有序集合中指定范围内的元素 包括分值
redis.zrange("myzset", 0, -1, "withscores").then(result => {
	console.log(result); // 输出 [ 'one', '1', 'two', '2', 'three', '3' ]
})

// 获取有序集合中指定元素的排名
redis.zrank("myzset", "one").then((result) => {
  console.log(result); // 输出 '0'
});

// 获取有序集合中指定元素的排名,按照分值从大到小排序
redis.zrevrank("myzset", "one").then((result) => {
  console.log(result); // 输出 '2'
});

// 删除有序集合中的元素
redis.zrem("myzset", "one").then((result) => {
  console.log(result); // 输出 '1'
});

(6)Redis事务

Redis事务是指一组命令的集合,即在一次请求中执行多个命令,它们被一起执行。在集合中的每个命令都将会被原子性地执行,然后返回应答,不会因为某个命令执行失败而导致其他命令无法执行的情况。

// multi 用于开启一个事务,exec 来执行事务中的所有命令,
redis.multi()
	.set('name', 'lax')
	.set('age', '22')
	.incr('age')
	.exec()
	.then(res => {
		console.log(res);
	})
	.catch(err => {
		console.log(err);
	});