简介
Deno 是一个新生的 JavaScript 和 TypeScript 运行时环境,与 Node.js 相比,它支持 Promise 和 async/await,并且带有内置的模块加载器。此外,Deno 还有一个强大的标准库,可以大大减少开发者的工作量。和 Node.js 一样,Deno 也可以使用第三方模块,比如 Redis 模块,来扩展其功能。
Redis 是一种高效的内存缓存数据库,可以快速存储和查询键值对。在 Deno 应用程序中,使用 Redis 缓存可以提高应用程序的性能和响应速度。
本文将分享如何在 Deno 应用程序中使用 Redis 缓存技巧,包括安装 Redis 模块、参与互动、进行测试和优化代码。
安装 Redis 模块
在 Deno 应用程序中使用 Redis 缓存,首先需要安装 Redis 模块。目前,Deno 社区支持两个 Redis 模块:redis
和 redis-deno
。这两个模块都提供了一组 API,用于连接和通信 Redis 服务器。
以下是安装 redis
模块的命令:
deno install --allow-net --name=redis https://deno.land/x/redis/mod.ts
使用此命令后,您可以在 Deno 应用程序中通过以下语句导入 redis
模块:
import { Redis } from "https://deno.land/x/redis/mod.ts";
以下是安装 redis-deno
模块的命令:
deno install --allow-net --name=redis https://deno.land/x/redis_deno/mod.ts
使用此命令后,您可以在 Deno 应用程序中通过以下语句导入 redis-deno
模块:
import { createRedis } from "https://deno.land/x/redis_deno/mod.ts";
参与互动
连接 Redis 并在 Deno 应用程序中使用缓存,您需要了解 Redis 的一些基本概念。
连接 Redis
在使用 Redis 之前,首先需要连接 Redis 服务器,可以使用 redis
模块提供的 connect
方法和 redis-deno
模块提供的 createRedis
方法,创建 Redis 连接。例如:
// javascriptcn.com 代码示例 // 使用 redis 模块 const redis = await Redis.connect({ hostname: "localhost", port: 6379, }); // 使用 redis-deno 模块 const redis = await createRedis({ hostname: "localhost", port: 6379, });
数据类型
Redis 提供了多种数据类型,常用的有字符串、哈希、列表、集合和有序集合。您可以使用 redis
模块提供的 set
、hset
、lpush
、sadd
和 zadd
方法,使用 redis-deno
模块提供的 set
、hset
、lpush
、sadd
和 zadd
方法,向 Redis 中存储数据,例如:
// javascriptcn.com 代码示例 // 使用 redis 模块 await redis.set("key", "value"); await redis.hset("hash", "field", "value"); await redis.lpush("list", "value"); await redis.sadd("set", "value"); await redis.zadd("zset", [["value", 1]]); // 使用 redis-deno 模块 await redis.set("key", "value"); await redis.hset("hash", "field", "value"); await redis.lpush("list", "value"); await redis.sadd("set", "value"); await redis.zadd("zset", [["value", 1]]);
缓存过期
为了避免缓存一直存在,您可以使用 redis
模块提供的 setex
方法和 redis-deno
模块提供的 setex
方法,设置存活时间,例如:
// 使用 redis 模块 await redis.setex("key", 60, "value"); // 使用 redis-deno 模块 await redis.setex("key", 60, "value");
获取缓存
一旦 Redis 连接建立,您可以使用 redis
模块提供的 get
、hget
、lrange
、smembers
和 zrange
方法,使用 redis-deno
模块提供的 get
、hget
、lrange
、smembers
和 zrange
方法,从 Redis 中检索数据。例如:
// javascriptcn.com 代码示例 // 使用 redis 模块 const value = await redis.get("key"); const hashValue = await redis.hget("hash", "field"); const listValues = await redis.lrange("list", 0, -1); const setValues = await redis.smembers("set"); const zsetValues = await redis.zrange("zset", 0, -1); // 使用 redis-deno 模块 const value = await redis.get("key"); const hashValue = await redis.hget("hash", "field"); const listValues = await redis.lrange("list", 0, -1); const setValues = await redis.smembers("set"); const zsetValues = await redis.zrange("zset", 0, -1);
删除缓存
如果您想从 Redis 中删除记录,可以使用 redis
模块提供的 del
方法和 redis-deno
模块提供的 del
方法,例如:
// 使用 redis 模块 await redis.del("key"); // 使用 redis-deno 模块 await redis.del("key");
进行测试
为了测试您的 Deno 应用程序是否成功使用 Redis 缓存,可以编写一个简单的测试脚本。以下是一个使用 redis
模块的示例:
// javascriptcn.com 代码示例 import { Redis } from "https://deno.land/x/redis/mod.ts"; const redis = await Redis.connect({ hostname: "localhost", port: 6379, }); const key = "hello"; const value = "world"; // 通过 key 从 Redis 获取 value let cacheValue = await redis.get(key); if (!cacheValue) { console.log(`[${new Date().toISOString()}] 缓存未命中`); await redis.set(key, value); console.log(`[${new Date().toISOString()}] Redis 写入 ${key}=${value}`); cacheValue = value; } else { console.log(`[${new Date().toISOString()}] 缓存命中`); } console.log(`[${new Date().toISOString()}] 值:${cacheValue}`); // 从 Redis 删除缓存 await redis.del(key); await redis.quit();
以下是使用 redis-deno
模块的相同示例:
// javascriptcn.com 代码示例 import { createRedis } from "https://deno.land/x/redis_deno/mod.ts"; const redis = await createRedis({ hostname: "localhost", port: 6379, }); const key = "hello"; const value = "world"; // 通过 key 从 Redis 获取 value let cacheValue = await redis.get(key); if (!cacheValue) { console.log(`[${new Date().toISOString()}] 缓存未命中`); await redis.set(key, value); console.log(`[${new Date().toISOString()}] Redis 写入 ${key}=${value}`); cacheValue = value; } else { console.log(`[${new Date().toISOString()}] 缓存命中`); } console.log(`[${new Date().toISOString()}] 值:${cacheValue}`); // 从 Redis 删除缓存 await redis.del(key); await redis.quit();
测试应该返回类似以下内容的结果:
[2022-06-25T16:49:56.969Z] 缓存未命中 [2022-06-25T16:49:56.970Z] Redis 写入 hello=world [2022-06-25T16:49:56.976Z] 值:world
优化代码
当您开始在 Deno 应用程序中使用 Redis 缓存时,可能需要为缓存添加一些逻辑,以便确保缓存数据的完整性和有效性。以下是一些提示:
键
Redis 缓存键应该具有唯一性,以确保缓存不会发生冲突。为了避免键的重复,您可以使用应用程序数据的散列值作为 Redis 缓存键。
const data = { id: 1, name: "John Smith" }; const key = `user:${JSON.stringify(data).hashCode()}`;
过期
缓存的时间越长,可能越容易失效。为了避免这种情况,您可以使用 setex
方法在 Redis 缓存中设置过期时间。
await redis.setex(key, 600, JSON.stringify({ id: 1, name: "John Smith" }));
在此示例中,数据将在 10 分钟后过期。
缓存策略
您应该考虑使用不同的缓存策略,以满足不同的应用程序需求。例如:
- 热门数据缓存策略: 缓存最常使用的数据(比如用户信息、商品信息等等)。
- 动态数据缓存策略: 缓存频繁变化的数据(比如存储在内存中的用户认证数据)。
- 链接信息缓存策略: 缓存频繁使用和连接的数据(比如 Redis 的连接信息)。
软性过期
在某些情况下,数据的过期时间已过期,但是您可能仍然希望使用该数据,而不希望从新进行计算。可以使用软性过期,提供一个 "最大使用时间",以确保缓存值不会太旧。
例如:
// javascriptcn.com 代码示例 const key = "user:1"; const maxAge = 86400; // 一天 let cacheValue = await redis.get(key); if (!cacheValue) { // 获取新数据,并在 Redis 中缓存 24 小时 const newCacheValue = await getUser(id); await redis.setex(key, maxAge, JSON.stringify(newCacheValue)); cacheValue = newCacheValue; } if (Math.floor(Date.now() / 1000) - cacheValue.timestamp >= maxAge) { // 使用缓存数据 } else { // 获取新数据,并在 Redis 中缓存 24 小时 const newCacheValue = await getUser(id); await redis.setex(key, maxAge, JSON.stringify(newCacheValue)); cacheValue = newCacheValue; } // 使用缓存数据
这样,当数据过期时,您可以先使用旧的数据,然后异步获取新的数据,并进行更新。
总结
通过使用 Redis 缓存,您可以显着提高 Deno 应用程序的性能和响应速度。使用 redis
模块或 redis-deno
模块,从 Redis 中检索数据并将数据写入 Redis 缓存非常容易。同时,您还应该注意缓存键的唯一性、缓存的过期时间和缓存策略,以确保缓存数据的完整性和有效性。
最后,如果您需要更深入地了解 Redis 的应用,建议查阅 Redis 的官方文档。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6539e0547d4982a6eb37d27c