redis 常用操作

简述

redis 本身的下载与编译参见官网下载

js 使用 ioredis 来操作。

const Redis = require("ioredis");

// 连接
const redis = new Redis({
  port: process.env.redisPort,
  host: process.env.redisEndpoint,
  password: process.env.redisPW,
});

对于多数 redis 的命令,js 都有函数来代理操作,其格式如下

redis[SOME_REDIS_COMMAND_IN_LOWERCASE](ARGUMENTS_ARE_JOINED_INTO_COMMAND_STRING)

举个例子,redis.set("mykey", "Hello") 就等同于 redis> SET mykey "Hello"

key-value 增删改查

命令官方文档 GETSET key value

- SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
- GET key

redis> GETSET foo "bar" "EX" 10
OK
redis> GET foo
"bar"

用 JS 操作如下

// js 设置 redis.set("foo", "bar");
// 等效于命令 redis> SET foo "bar"
// 返回 promise
redis.set("foo", "bar");

// 设置并且过期时间是 10 秒
redis.set("foo", "bar", "EX", 10);

// 支持 callback 模式返回
redis.get("foo", function (err, result) {
  if (err) {
    console.error(err);
  } else {
    console.log(result); // 结果 bar
  }
});

// 或者是 then 调用
redis.get("foo").then(function (result) {
  console.log(result);
});

// 删除
redis.del("foo");

无序集合操作

- SADD key member [member ...]  添加
- SMEMBERS key  列出成员
- SCARD key  查看集合的元素数量
- SCARD key  查看集合的元素数量
- SPOP key [count]  从集合中推出最近加入的元素
- SREM key member [member ...]  删除指定元素

redis> SADD myset 7
(integer) 1
redis> SADD myset 5
(integer) 1
redis> SADD myset 7
(integer) 0
redis> SADD myset 6
(integer) 1
redis> SCARD myset
(integer) 3
redis> SMEMBERS myset
1) "5"
2) "6"
3) "7"
redis> SPOP myset
"5"

redis> SREM myset 7
(integer) 1
redis> SMEMBERS myset
1) "6"

简要提几个 js 的操作

// 下列两种 sadd 效果相同:
redis.sadd("myset", 1, 3, 5, 7);
redis.sadd("myset", [1, 3, 5, 7]);

// 查看成员
// 返回 promise
redis.smembers("myset")

redis.spop("set"); // Promise resolves to "5" or another item in the set

有序集合

与之相近的还有 ZADD,这是另外一种有序的集合,具体见 redis官网 ZADD,总之操作举例如下

> ZADD sortedSet 1 "one"
> ZADD sortedSet 3 "three"
> ZADD sortedSet 6 "six"
> ZADD sortedSet 2 "two"

> ZRANGE sortedSet 0 -1
1) "one"
2) "two"
3) "three"
4) "six"
// 添加
redis.zadd("sortedSet", 1, "one", 3, "three", 6, "six", 2, "two", );
// 相当于 redis> ZRANGE sortedSet 0 -1
redis.zrange("sortedSet", 0, -1).then((res) => console.log(res));

Hash Map 的操作

> hset myhash key1 "value1"
(integer) 1
> hset myhash key6 "value6"
(integer) 1
> hset myhash key2 "value2"
(integer) 1
> hget myhash key6
"value6"
> hgetall myhash
1) "key1"
2) "value1"
3) "key6"
4) "value6"
5) "key2"
6) "value2"
// myhash 是哈希 map 集名,field1 是 key,Hello 是 value
redis.hset("myhash", "key1", "value1");
redis.hget("myhash", "key2").then((res) => console.log(res)); // value2
redis.hgetall("myhash").then((res) => console.log(res));

其他相关的命令

HDEL 删除
HEXISTS 判断某键是否存在
HGET
HGETALL
HKEYS 获取所有键名
HLEN 判断 hash map 长度
HSET
HVALS 获取所有键值

订阅发布

var Redis = require("ioredis");
var redis = new Redis();
var pub = new Redis();

// 同时订阅 news 和 music 两个通道,
redis.subscribe("news", "music", function (err, count) {
  // `count` represents the number of channels we are currently subscribed to.
    
  // 发布新消息
  pub.publish("news", "Hello world!");
  pub.publish("music", "Hello again!");
});

// 监听 message 事件。
redis.on("message", function (channel, message) {
  // Receive message Hello world! from channel news
  // Receive message Hello again! from channel music
  console.log("Receive message %s from channel %s", message, channel);
});

参考

redis 官网

github-ioredis