npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@yunflyjs/yunfly-plugin-redis

v0.0.1

Published

yunfly redis plugin.

Downloads

1

Readme

redis 插件

使用方式

    1. 安装依赖
// v3
yarn add @yunflyjs/yunfly-plugin-redis
    1. config.plugin.ts 中声明插件
const plugins: { [key: string]: string }[] = [
  {
    name: 'redis',
    package: '@yunflyjs/yunfly-plugin-redis',
  },
];
export default plugins;
    1. config.default.ts 中启用插件
  • 对象

config.redis = {
  enable: true,
  host: '127.0.0.1',
  port: 6379,
};
  • 函数
config.redis = () => {
  const host = apolloConfig['EXAMPLE-REDIS-HOST'];
  const password = apolloConfig['EXAMPLE-REDIS-PASSWORD'];
  const port = apolloConfig['EXAMPLE-REDIS-PORT'];
  return {
    enable: true,
    host,
    password,
    port,
  };
};
  • cluster 模式
config.redis = {
  enable: true,
  startupNodes: [
    {
      port: 6379,
      host: '127.0.0.1',
    },
    {
      port: 6379,
      host: '127.0.0.2',
    },
  ],
  options: {},
};
  1. 框架中使用
import { redis } from @yunflyjs/yunfly-plugin-redis

redis.set('key','example');
redis.get('key');

参数说明

| 字段 | 类型 | 必填 | 说明 | | ------ | ------- | ---- | ------------------- | | enable | boolean | 是 | 是否开启 redis 能力 | | host | string | 是 | host 配置 | | port | number | 是 | port 配置 |

  • 其他通用配置项

| 方法名 | 类型 | 必填 | 说明 | | --------- | ------ | ---- | ---------------------- | | username | string | 否 | 鉴权用户 | | password | string | 否 | 鉴权密码 | | db | number | 是 | 默认数据库(默认为 0) | | keepAlive | number | 否 | 持久链接时间 | | ...... | any | 否 | 其他参数 |

  • options 完整参数 interface:
interface RedisCommonConfig {
  username?: string;
  password?: string;
  db?: number;
  keepAlive?: number;
  family?: number;
  noDelay?: boolean;
  connectionName?: string;
  dropBufferSupport?: boolean;
  enableReadyCheck?: boolean;
  enableOfflineQueue?: boolean;
  connectTimeout?: number;
  disconnectTimeout?: number;
  commandTimeout?: number;
  autoResubscribe?: number;
  autoResendUnfulfilledCommands?: number;
  lazyConnect?: number;
  tls?: AnyOptionConfig;
  keyPrefix?: string;
  retryStrategy?: Function;
  maxRetriesPerRequest?: number;
  reconnectOnError?: Function;
  readOnly?: boolean;
  stringNumbers?: boolean;
  enableAutoPipelining?: boolean;
  autoPipeliningIgnoredCommands?: string[];
  maxScriptsCachingTime?: number;
}

cluster 模式 配置参数说明

| 方法名 | 类型 | 必填 | 说明 | | ----------------- | -------- | ---- | -------------- | | enable | boolean | 是 | 是否开启 | | startupNodes | Object[] | 是 | redis 单机节点 | | startupNodes.host | string | 是 | 链接地址 | | startupNodes.port | number | 是 | 端口 | | options | Object | 否 | 其他参数 |

  • options 详细参数 ts 类如下:
interface RedisClusterCommonConfig {
  clusterRetryStrategy?: Function;
  dnsLookup?: any;
  enableOfflineQueue: boolean;
  enableReadyCheck?: boolean;
  scaleReads?: string;
  maxRedirections?: number;
  retryDelayOnFailover?: number;
  retryDelayOnClusterDown?: number;
  retryDelayOnTryAgain?: number;
  slotsRefreshTimeout?: number;
  slotsRefreshInterval?: number;
  redisOptions?: AnyOptionConfig;
}
interface StartupNodesConfig {
  port: number;
  host: string;
}
interface RedisClusterConfig {
  enable: boolean;
  startupNodes: StartupNodesConfig[];
  options?: RedisClusterCommonConfig;
}

Redis 常见使用案例

字符串 (string)

  • 如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。

set

  • 将键 key 设定为指定的“字符串”值。

返回值:

  • 如果 SET 命令正常执行那么回返回 OK,否则如果加了 NX 或者 XX 选项,但是没有设置条件。那么会返回 null。
// 设置key:'key1' 的值为'bff-example',并且 10 秒之后过期。
await redis.set('key1', 'bff-example', 'EX', 10); // return "OK"

备注:

  • key 尽量带上 团队名或者空间名前缀
  • value 值是字符串,如果是对象,请做好数据转换处理。
  • 尽量设置过期时间, 单位为 【秒】

get

  • 返回 key 的 value。如果 key 不存在,返回特殊值 null。如果 key 的 value 不是 string,就返回错误,因为 GET 只处理 string 类型的 values。

返回值:

  • key 对应的 value,或者 null(key 不存在时)
redis.set('key1', 'bff-example', 'EX', 10);

await redis.get('key1'); // return bff-example
await redis.get('key2'); // return null

del

  • 删除字段信息
redis.set('key1', 'bff-example', 'EX', 10);

await redis.del('key1'); // return 'OK'

// 删除多个key
await redis.del('key1', 'key2', 'key3');

mget

  • 返回所有指定的 key 的 value。对于每个不对应 string 或者不存在的 key,都返回特殊值 nil。正因为此,这个操作从来不会失败。

返回值:

  • 指定的 key 对应的 values 的 list
redis.set('key1', 'hello');
redis.set('key2', 'world');
redis.set('key3', 'world');

await redis.mget('key1', 'key2'); // return ["hello","world","world"]

mset

  • 对应给定的 keys 到他们相应的 values 上。MSET 会用新的 value 替换已经存在的 value

返回值:

  • 总是 OK,因为 MSET 不会失败。
await redis.mset('key1', 'hello', 'key2', 'world'); // return 'OK'

await redis.get('key1'); // return "hello"
await redis.mget('key1', 'key2'); // return "hello","world"

集合 (Sets)

  • 不重复且无序的字符串元素的集合;
  • Redis Set 是 String 的无序排列。SADD 指令把新的元素添加到 set 中。对 set 也可做一些其他的操作,比如测试一个给定的元素是否存在,对不同 set 取交集,并集或差,等等。

sadd

  • 添加一个或多个指定的 member 元素到集合的 key 中.指定的一个或者多个元素 member 如果已经在集合 key 中存在则忽略.如果集合 key 不存在,则新建集合 key,并添加 member 元素到集合 key 中.

返回值:

  • 返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.
// 以下两种方式等价
await redis.sadd('myset', 'hello', 'world'); // return 'OK'
await redis.sadd('myset', ['hello', 'world']); // return 'OK'

scard

  • 返回集合存储的 key 的基数 (集合元素的数量)。

返回值:

  • 集合的基数(元素的数量),如果 key 不存在,则返回 0.
redis.sadd('myset', 'hello', 'world');
await redis.scard('myset'); // return 2
await redis.scard('myset1'); // return 0

srem

  • 在 key 集合中移除指定的元素. 如果指定的元素不是 key 集合中的元素则忽略 如果 key 集合不存在则被视为一个空的集合,该命令返回 0

返回值:

  • 从集合中移除元素的个数,不包括不存在的成员.
redis.sadd('myset', 'hello', 'world');
await redis.srem('myset', 'hello'); // return 1

sunion

  • 返回给定的多个集合的并集中的所有成员 【集合并集】

返回值:

  • 并集的成员列表
redis.sadd('myset', 'hello', 'world');
redis.sadd('myset1', 'world', '!');

await redis.sunion('myset', 'myset1'); // return ["hello","!","world"]
await redis.sunion('myset3', 'myset4'); // return []

列表 (Lists)

  • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边), 他们基本上就是链表;

lpush

  • 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。

返回值:

  • 在 push 操作后的 list 长度。
redis.lpush('mylist', '!');
redis.lpush('mylist', 'world');
redis.lpush('mylist', 'hello');

await redis.lrange('mylist', 0, 1); // return ['hello','world']

lrange

  • 返回存储在 key 的列表里指定范围内的元素。 start 和 end 偏移量都是基于 0 的下标,即 list 的第一个元素下标是 0(list 的表头),第二个元素下标是 1,以此类推。
  • 偏移量也可以是负数,表示偏移量是从 list 尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推。

返回值:

  • 指定范围里的列表元素。
redis.lpush('mylist', '!');
redis.lpush('mylist', 'world');
redis.lpush('mylist', 'hello');

await redis.lrange('mylist', 0, 0); // return ['hello']
await redis.lrange('mylist', 0, 1); // return ['hello','world']
await redis.lrange('mylist', -2, -1); // return ["world","!"]

lpop

  • 移除并且返回 key 对应的 list 的第一个元素。

返回值:

  • 返回第一个元素的值,或者当 key 不存在时返回 null
redis.lpush('mylist', 'hello', 'world');
await redis.lpop('mylist'); // return 'world' // 从第一项开始删除
await redis.lpop('mylist'); // return 'world'
await redis.lpop('mylist'); // return null

lset

  • 设置 index 位置的 list 元素的值为 value, 当 index 超出范围时会返回一个 error。
redis.lpush('mylist', 'hello', 'world');

await redis.lset('mylist', 0, 'zane'); // return 'OK'   // 替换第一项
await redis.lrange('mylist', 0, 10); // return [ 'zane', 'hello' ]
  • rpop、rpush 等同理

哈希(Hashes)

  • 由 field 和关联的 value 组成的 map。field 和 value 都是字符串的

hset

  • 设置 key 指定的哈希集中指定字段的值。
  • 如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
  • 如果字段在哈希集中存在,它将被重写。

返回值:

  • 1 如果 field 是一个新的字段
  • 0 如果 field 原来在 map 里面已经存在
redis.hset('myhash', 'key1', 'hello');
redis.hset('myhash', 'key2', 'world');

await redis.hget('myhash', 'key1'); // return 'hello'
await redis.hget('myhash', 'key2'); // return 'world'

hget

  • 返回 key 指定的哈希集中该字段所关联的值

返回值:

  • 该字段所关联的值。当字段不存在或者 key 不存在时返回 null。
redis.hset('myhash', 'key1', 'hello');
redis.hset('myhash', 'key2', 'world');

await redis.hget('myhash', 'key1'); // return 'hello'
await redis.hget('myhash', 'key'); // return null

hdel

  • 从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。

返回值:

  • 返回从哈希集中成功移除的域的数量,不包括指出但不存在的那些域
  • 如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回 0。
redis.hset('myhash', 'key1', 'hello');
redis.hset('myhash', 'key2', 'world');

await redis.hdel('myhash', 'key1'); // return 1
await redis.hdel('myhash', 'key'); // return 0

hlen

  • 返回 key 指定的哈希集包含的字段的数量

返回值:

  • 哈希集中字段的数量,当 key 指定的哈希集不存在时返回 0
redis.hset('myhash', 'key1', 'hello');
redis.hset('myhash', 'key2', 'world');

await redis.hlen('myhash'); //return 2
await redis.hlen('myhash1'); // return 0

hkeys

  • 返回 key 指定的哈希集中所有字段的名字。

返回值:

  • 哈希集中的字段列表,当 key 指定的哈希集不存在时返回空列表。
redis.hset('myhash', 'key1', 'hello');
redis.hset('myhash', 'key2', 'world');

await redis.hkeys('myhash'); // return ['hello','world']
await redis.hkeys('myhash1'); // return []

hgetall

  • 返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍

返回值:

  • 哈希集中字段和值的列表。当 key 指定的哈希集不存在时返回空列表。
redis.hset('myhash', 'key1', 'hello');
redis.hset('myhash', 'key2', 'world');

await redis.hgetall('myhash'); // return { key2: 'world', key1: 'hello' }
await redis.hgetall('myhash1'); // return {}

其他说明

  • redis 还有其他数据类型, 例如 Sorted sets,Bit arrays,HyperLogLogs。 由于前端不常用到,再这里暂时不做文档补充。 若有团队需要请联系 BFF 开发人员,这边来补充相应的文档。
  • redis 还可用于消费队列订阅发布消费等场景。