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); });