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); });