# 文档

# 简介

Tedis 所有功能都由 typescript 编写实现,最后生成原生 javascript 代码,支持 javascript(commonjs)和 typescript 调用。项目采用 typescript 有诸多好处,不仅便于源码的开发维护,同时提供的类型文件,让用户在编辑器提示下拥有更友好的开发体验和更高的开发效率。

# 特性

  • 类型支持:本项目使用 typescript 编写实现,提供类型检查的同时享受编辑器的代码提示。
  • 异步编程:使用 promise、async,让你远离回调地狱,逻辑书写更直观。
  • 连接池:复用 TCP 连接,充分利用 redis 性能,提高程序健壮性。

# 名称由来

Tedis 是为 nodejs 平台开发的 redis 客户端,名称由来受 java 平台 jedis 的启发,加上开发语言为 typescript,故取 Tedis 一名,也由此希望 Tedis 能够在今后发展中一切向好,成为 nodejs 平台中 redis 客户端的翘楚。

# 为什么不是

  • node_redis

node_redis 起步较早,已经经受过时间的考验,功能覆盖面全,运行稳定。但代码大部分由古老版本的 javascript 构成,并且首选流程为回调函数。虽然可以通过 promisebluebird 改造来支持异步调用,但是 API 语法会相对丑陋。因为其作者并不喜欢 typescript,在 issues 中也明确表示过项目没有支持 typescript 的打算,社区因此维护了一套 @types/redis 类型文件,但是由于 node_redis 并没有原生支持异步调用,加上其功能实现太过 geek,社区版的类型文件只是实现了原始接口,结合异步改造后代码提示与类型检查效果并不理想。

  • co-redis

co-redis 是在 node_redis 基础上通过 generators 特性封装的 redis 客户端,其算然在node_redis回调基础上调用流程更清晰,但是此项目太久没有维护,相对于asyncawaitgenerators还是要稍逊一些,外加缺乏 typescript 支持,代码提示方面并不友好。

  • node-redlock

node-redlock新特性支持不及时,虽然有单元测试,但是不够全面,类型文件暂不支持。

# 快速开始

yarn add tedis
# 或者 npm install tedis --save
// commonjs
const { Tedis, TedisPool } = require("tedis");

// es
import { Tedis, TedisPool } from "tedis";

// TypeScript
import { Tedis, TedisPool } from "tedis";

实例化

Tedis

参数 类型 默认值
host? string 127.0.0.1
port? number 6379
password? string
timeout? number
const tedis = new Tedis({
  host: "127.0.0.1",
  port: 6379,
  password: "password"
});

TedisPool

参数 类型 默认值
host? string 127.0.0.1
port? number 6379
password? string
min_conn? number 1
max_conn? number 10
timeout? number
const tedispool = new TedisPool({
  host: "127.0.0.1",
  port: 6379
});

const tedis = await tedispool.getTedis();
// do task ...
tedispool.putTedis(tedis);

# API 案例

// key
await tedis.keys("*");
await tedis.exists("a");

// string
await tedis.set("string1", "abcdefg");
await tedis.get("string1");

// hash
await tedis.hmset("hash1", {
  name: "tom",
  age: 23
});
await tedis.hgetall("hash1");

// list
await tedis.lpush("list1", ["a", "b", "c", "d", 1, 2, 3, 4, 5]);
await tedis.llen("list1");

// set
await tedis.sadd("set1", ["a", "b", "c", "d", 1, 2, 3, 4, 5]);
await tedis.scard("set1");

// zset
await tedis.zadd("zset1", [
  [1, "a"],
  [10, "a"],
  [2, "adg"],
  [3, "aertet"],
  [4, "afg"]
]);
await tedis.zcard("zset1");

// base
tedis.close();

# 连接池

使用Tedis初始化 client 使用的是单个 tcp 连接,在服务并发没有上规模的时候单实例足以应付。当并发足够大的时候,单实例的 tcp 连接并没有发挥出 redis 真正的能力,这个时候你可能就需要使用TedisPool来提升服务能力了

警告

当使用TedisPool时,记得取出的实例使用完后调用putTedis归还释放,以保证下一次正常使用