# 文档
# 简介
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 构成,并且首选流程为回调函数。虽然可以通过 promise 和 bluebird 改造来支持异步调用,但是 API 语法会相对丑陋。因为其作者并不喜欢 typescript,在 issues 中也明确表示过项目没有支持 typescript 的打算,社区因此维护了一套 @types/redis 类型文件,但是由于 node_redis 并没有原生支持异步调用,加上其功能实现太过 geek,社区版的类型文件只是实现了原始接口,结合异步改造后代码提示与类型检查效果并不理想。
- co-redis
 
co-redis 是在 node_redis 基础上通过 generators 特性封装的 redis 客户端,其算然在node_redis回调基础上调用流程更清晰,但是此项目太久没有维护,相对于async、await,generators还是要稍逊一些,外加缺乏 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归还释放,以保证下一次正常使用