(突然发现之前用了那么久的Redis都没有沉淀一篇博客,今天来补一个)

安装

安装Redis一般有两种方式,实机安装和Docker部署。

实机安装,在Linux下

$sudo apt-get update
$sudo apt-get install redis-server

在Windows下,先去[官方Github下载安装包,下载后直接安装即可。

Docker部署,使用以下命令进行Docker部署

$docker pull redis
$docker run --name redis-container -d -p 6378:6379 redis
$docker exec -it redis-container /bin/bash

命令行工具

Redis 官方包分为redis-server和redis-cli两个部分,就是字面意思,服务端和客户端,服务端是redis存储的核心,cli是客户端,用来进行一些读写操作。

Redis的Docker镜像中带了redis-cli,我们将基于此进行演示。

$redis-cli
root@35c8aace717e:/data# redis-cli
127.0.0.1:6379> set test "test string"
OK
127.0.0.1:6379> get test
"test string"
127.0.0.1:6379>del test
(integer) 1
127.0.0.1:6379>

上面我们进行了一次最基础的读写操作,通过set key value将字符串“test string”写入,通过get key读取刚才写入的字符串,通过del key删除这个键值。

这只是redis最基础的操作,redis还支持其他数据结构:

List

List(列表) :列表是简单的字符串队列,通过lpush/rpush添加元素,lpop/rpop弹出元素。下面的命令行演示了List常用的一些操作

127.0.0.1:6379> lpush key:1 value:1 # 左侧添加value
(integer) 1
127.0.0.1:6379> rpush key:1 value:2 value:3 value:4 value:5 # 右侧添加value
(integer) 5
127.0.0.1:6379> llen key:1 # 获取长度
(integer) 5
127.0.0.1:6379> lrange key:1 0 -1 # 遍历输出list元素
1) "value:1"
2) "value:2"
3) "value:3"
4) "value:4"
5) "value:5"
127.0.0.1:6379> lpush key:2 value:6 # 向一个新的key添加value
(integer) 1
127.0.0.1:6379> lmove key:1 key:2 left right # 将key1的元素移动到key2,从key1左侧取出,key2右侧加入
"value:1"
127.0.0.1:6379> lrange key:2 0 -1 # 遍历key1
1) "value:6"
2) "value:1"
127.0.0.1:6379> lpop key:1 # key1左侧弹出(queue)
"value:2"
127.0.0.1:6379> rpop key:1 # key1右侧弹出(stack)
"value:5"
127.0.0.1:6379> lrange key:1 0 -1 # 遍历输出key剩余元素
1) "value:3"
2) "value:4"
127.0.0.1:6379>

每一步的操作都已经写在注释了,会了这些操作就已经掌握了Redis 中 List的使用方法。

Set

Set(集合):集合是无序的字符串集合,通过sadd添加元素,smembers获取所有元素。

127.0.0.1:6379> sadd set:1 value:1 # 添加元素到set1
(integer) 1
127.0.0.1:6379> sadd set:1 value:2 value:3 # 添加多个元素到set1
(integer) 2
127.0.0.1:6379> smembers set:1 # 获取set的所有元素
1) "value:1"
2) "value:2"
3) "value:3"
127.0.0.1:6379> sadd set:2 value:1 value:4 # 添加多个元素到set2
(integer) 2
127.0.0.1:6379> sdiff set:1 set:2 # 获取set1和set2的差异元素
1) "value:2"
2) "value:3"
127.0.0.1:6379> smismember set:1 value:1 # 查询set1中某元素的计数
1) (integer) 1
127.0.0.1:6379> smismember set:1 value:1 value:3 # 批量查询set1中元素的计数
1) (integer) 1
2) (integer) 1
127.0.0.1:6379> sinter set:1 set:2 # set1和set2的共同元素
1) "value:1"
127.0.0.1:6379> spop set:1 # 随机移除set1的元素
"value:1"
127.0.0.1:6379> srem set:1 value:2 # 指定移除set1中的元素
(integer) 1
127.0.0.1:6379> smembers set:1 # 获取set1中的所有元素
1) "value:3"
127.0.0.1:6379> srandmember set:2 # 随机获取set2中的元素
"value:4"
127.0.0.1:6379> srandmember set:2
"value:4"
127.0.0.1:6379> srandmember set:2
"value:4"
127.0.0.1:6379> srandmember set:2
"value:4"
127.0.0.1:6379> srandmember set:2
"value:1"
127.0.0.1:6379> srandmember set:2
"value:4"
127.0.0.1:6379>

Hash

Hash(哈希):哈希是一个键值对集合,一个key对应多个field/value对。

127.0.0.1:6379> hset hash:1 key1 value1 key2 value2 key3 1234 # 设置hash1的键值内容
(integer) 3
127.0.0.1:6379> hget hash:1 key1 # 读取hash1的key1属性
"value1"
127.0.0.1:6379> hgetall hash:1 # 读取hash1的所有键值对,每两个为一组
1) "key1"
2) "value1"
3) "key2"
4) "value2"
5) "key3"
6) "1234"
127.0.0.1:6379> hmget hash:1 key1 key3 # 读取hash1的多个属性
1) "value1"
2) "1234"
127.0.0.1:6379> hincrby hash:1 key3 1000 # hash1的key3属性加100
(integer) 2234
127.0.0.1:6379> hget hash:1 key3
"2234"
127.0.0.1:6379> hlen hash:1 # 获取hash1的length(键值数量)
(integer) 3
127.0.0.1:6379> hdel hash:1 key1 # 删除hash1的key1属性
(integer) 1
127.0.0.1:6379> hgetall hash:1
1) "key2"
2) "value2"
3) "key3"
4) "2234"
127.0.0.1:6379> hmset hash:1 key2 value23 key3 3234 # 修改hash1的多个属性
OK
127.0.0.1:6379> hgetall hash:1
1) "key2"
2) "value23"
3) "key3"
4) "3234"
127.0.0.1:6379>

sort set

Zset(sorted set-有序集合:有序集合和集合一样是string元素的集合,但每个元素都会关联一个double类型的分数,读取时会根据分数进行排序。

127.0.0.1:6379> zadd zset:1 1 hello # zset1 添加hello元素,分数为1
(integer) 1
127.0.0.1:6379> zadd zset:1 2 world # zset1 添加world元素,分数为2
(integer) 1
127.0.0.1:6379> zrange zset:1 0 -1 # 按照分数升序查询zset1所有元素,(1 3查第1-第4个)
1) "hello"
2) "world"
127.0.0.1:6379> zrevrange zset:1 0 -1 # 按照分数倒叙查询zset1所有元素
1) "world"
2) "hello"
127.0.0.1:6379> zrange zset:1 0 -1 withscores # 查询zset1所有元素并显示分数
1) "hello"
2) "1"
3) "world"
4) "2"
127.0.0.1:6379> zrank zset:1 world # 查询zset1中world元素的排名
(integer) 1
127.0.0.1:6379> zrevrank zset:1 world # 查询zset1中world元素的倒数排名
(integer) 0
127.0.0.1:6379> zrem zset:1 hello # 移除zset1中的hello元素
(integer) 1
127.0.0.1:6379> zrange zset:1 0 -1
1) "world"
127.0.0.1:6379>

上面是一些常用的redis结构,还有一些比较偏门的结构看官网文档吧😂。

NodeJS 中常用的 Redis 依赖库是 ioredis,下面来看下他的用法。

首先安装一下依赖

$pnpm install ioredis

接下来就可以使用依赖了,首先进行连接,可以有多种方式进行连接

new Redis(); // 127.0.0.1:6379
new Redis(6380); // 127.0.0.1:6380
new Redis(6379, "192.168.1.1"); // 192.168.1.1:6379
new Redis("/tmp/redis.sock");
new Redis({
  port: 6379,
  host: "127.0.0.1",
  username: "default",
  password: "my-top-secret",
  db: 0, // 默认 0
});

由于是redis官网出品的依赖库,所以各种API都是和redis-cli保持一致的,常用的读写操作如下

import { Redis } from 'ioredis'
 
const redis = new Redis(6378, '100.125.188.135');

(async function () {
  await redis.set('name', '张三');
  const name = await redis.get('name');
  console.log(name);
  
  await redis.rpush('list', '1', '2', '3');
  const list = await redis.lrange('list', 0, -1);
  console.log(list);

  await redis.sadd('set', '2', '1', '3');
  const set = await redis.smembers('set');
  console.log(set);

  await redis.hset('hash', 'name', '张三', 'age', '24');
  const hash = await redis.hget('hash', 'name');
  console.log(hash);

  await redis.zadd('zset', 10, '张三', 2, '李四', 3, '王五');
  const zset = await redis.zrange('zset', 0, -1);
  console.log(zset);
})()

推荐使用TypeScript,掌握redis-cli之后就不用再去额外记库的API了,只要记住命令就可以看到类型提示。

image-20231108224738813


前端小白