Nest探索(十一)Redis 入门

前言

在学习前端或后端的过程中,多少会接触 Mysql、MongoDB 等数据库,二者分别是关系型数据库和非关系型数据库的代表之一。这些数据库都是通过硬盘来存储数据的,在进行数据读取和修改等操作时,需要查询硬盘中的数据,再加载到内存中进行处理。由于磁盘的读写速度相对较慢,因此会导致 Mysql 等数据库的响应速度变慢。

Redis(Remote Dictionary Server)是一个开源的内存数据库,对数据的读取及修改可以在内存中高效地执行。Redis 遵守 BSD 开源协议,是基于 key-value 的存储系统。

根据菜鸟教程的介绍,Redis 有以下优点:

  • 性能极高:能够支持每秒数十万次的读写操作,可以用于处理高并发请求,比如缓存、会话管理、排行榜等。
  • 丰富的数据类型:Redis 不仅支持基本的键值存储,还提供字符串、列表、集合、哈希表、有序集合等。
  • 原子性操作:Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
  • 持久化:Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。
  • 支持发布/订阅模式:Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。
  • 单线程模型:尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。
  • 主从复制:Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。

安装Redis

首先,去Redis 官网下载安装包并安装好。此外,还可以使用 docker 安装,这里不赘述了。

安装完成后目录内容如下:

我们可以发现,Redis分为server端和cli端,我们需要先把server端跑起来,再在cli端中输入相应的命令。

  • 运行server端:
vbscript 复制代码
redis-server.exe redis.windows.conf

运行后可以看到以下输出:

我们可以将安装路径添加到系统变量中,比如我的安装路径是"D:\Program Files\Redis",那么下次就直接输入redis-server即可。

退出 server 端,需要在 cli 中输入 shutdown ,然后再输入 exit 即可:

arduino 复制代码
127.0.0.1:6379> shutdown
not connected> exit

直接关闭命令行界面,下次启动 server 时可能会报错,因此建议先使用命令 shutdown 关闭。

  • 运行cli端:
makefile 复制代码
redis-cli
127.0.0.1:6379>

使用快捷键 Ctrl + C 就可以退出 cli。

Redis配置文件

Redis 有2个配置文件,这两个配置文件的配置项大致是一致的。

  • redis.windows.conf: 在命令行或者脚本中运行 Redis 时生效。我们一般是在该文件进行配置。

  • redis.windows-service.conf: 当 Redis 运行作为 service/daemon 时生效,也就是在后台运行,受系统管理。

设置端口和密码

Redis 的cli端默认是运行在6379端口。我们可以在redis.windows.conf文件中指定端口,比如修改为6378:

yaml 复制代码
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6378

Redis 可以指定密码。在配置文件中,取消注释并修改 foobared 为相应的密码。需要注意的是,Redis的密码建议设置超强难度的密码,因为外界可以每秒尝试 150k 次的密码破解,简单的密码容易被攻破。

arduino 复制代码
# requirepass foobared

当设置密码后,可以使用 -a 携带密码:

css 复制代码
redis-cli -p 6379 -a 123

更推荐的做法是使用 auth xxx

bash 复制代码
λ redis-cli -p 6379
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 111
(error) ERR invalid password
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

在输入 ping 时响应是 PONG,说明密码正确了。

设置过期时间

一般情况下,我们会设置 redis 的 key 的过期时间,使用 expire 命令:

vbnet 复制代码
expire key 1

比如设置 1 秒过期,到了过期时间就会自动删除。

查询剩余的过期时间使用 ttl:

vbnet 复制代码
set key 11
expire key 20
ttl key

字符串 string

我们使用 set 命令设置字符串 name 的值为 hhh,使用 get 命令可以获取对应的键值。

使用 keys * 可以获取所有的键,使用 keys *n*获取的是包含字母 n 的所有键。

type 查询键的类型。

exists 查询键是否存在。

bash 复制代码
127.0.0.1:6379> set name hhh
OK
127.0.0.1:6379> get name
"hhh"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> keys n*
1) "name"
127.0.0.1:6379> keys *n*
1) "name"
2) "count"

127.0.0.1:6379> type key
string
127.0.0.1:6379> exists key
(integer) 1

列表 list

可以直接新建列表 mylist,并从左侧插入数据 xxx:lpush mylist xxx

可以一次性插入多个数据:lpush mylist 111 222

需要注意的是,lpush是从左边插入,因此lrange mylist 0 10查看列表内容时可以看到先打印的是 World 。还可以使用命令lrange mylist 0 -1,其中下标 -1 代表到最后,也就是列举出列表的所有数据。

exists mylist是检查列表是否存在,1表示存在,0表示不存在。

llen mylist是获取列表的长度。

bash 复制代码
127.0.0.1:6379> lpush mylist "Hello"
(integer) 1
127.0.0.1:6379> lpush mylist "World"
(integer) 2
127.0.0.1:6379> exists mylist
(integer) 1

127.0.0.1:6379> lrange mylist 0 10
1) "World"
2) "Hello"
127.0.0.1:6379> lrange mylist 0 -1
1) "World"
2) "Hello"

127.0.0.1:6379> lpop mylist
"World"
127.0.0.1:6379> lrange mylist 0 -1
1) "Hello"
127.0.0.1:6379>

127.0.0.1:6379> llen mylist
(integer) 1

相应的, lpop 是从左侧删除元素;rpush 是从右侧插入元素,而 rpop 是从右侧删除元素。

哈希 hash

参考官方文档,举个例子就一目了然了。

主要是 hset 设置哈希值,hget 获取对应的值。hgetall 可以获取所有的哈希值,会把键和值都列出来。hkeys 和 hvals 分别是只获取哈希的所有键和所有值。

bash 复制代码
127.0.0.1:6379> hset myhash field1 "Hello"
(integer) 1
127.0.0.1:6379> hget myhash field1
"Hello"
127.0.0.1:6379> hset myhash field2 "Hello2" field3 "Hello3"
(integer) 2
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "Hello"
3) "field2"
4) "Hello2"
5) "field3"
6) "Hello3"
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379> hvals myhash
1) "Hello"
2) "Hello2"
3) "Hello3"
127.0.0.1:6379>

集合 set

集合是无序的、唯一的。

sadd 添加集合元素;smembers 获取集合元素;spop 移除并返回集合中的一个随机元素。

bash 复制代码
127.0.0.1:6379> sadd myset 11
(integer) 1
127.0.0.1:6379> sadd myset 12
(integer) 1
127.0.0.1:6379> sadd myset 12
(integer) 0
127.0.0.1:6379> smembers myset
1) "11"
2) "12"

127.0.0.1:6379> spop myset
"12"
127.0.0.1:6379> smembers myset
1) "11"

有序集合 sortedSet

有序集合的语法有:

  • zadd key score1 member1 [score2 member2]:添加元素

  • zrange key min max:按照score排序后,获取指定排名范围内的元素,如果带上 WITHSCORES 会返回成员及其对应的分数。

举个例子:

bash 复制代码
zadd zkey 1 redis
zadd zkey 2 mysql
zadd zkey 3 mongodb
zadd zkey 6 aa
zadd zkey 5 bb

zrange zkey 0 10
1) "redis"
2) "mysql"
3) "mongodb"
4) "bb"
5) "aa"

127.0.0.1:6379> zrange zkey 0 10 WITHSCORES
 1) "redis"
 2) "1"
 3) "mysql"
 4) "2"
 5) "mongodb"
 6) "3"
 7) "bb"
 8) "5"
 9) "aa"
10) "6"

有序集合默认是从小到大返回的,如果要倒序,可以使用 zrevrange (也就是加上 reverse 的前缀 rev):

bash 复制代码
127.0.0.1:6379> zrevrange zkey 0 10
1) "aa"
2) "bb"
3) "mongodb"
4) "mysql"
5) "redis"

后记

本文介绍了 Redis 的安装配置,以及设置端口、密码、过期时间等,还介绍了 string、list、hash、set、sortedSet 等数据类型。命令的更多语法,可以查询官方文档

Redis 通常是使用命令行操作的,此外我们还可以使用可视化的官方工具Redis Insight,这里就不赘述了。

总的来说,学习和掌握 Redis 是开发工作中不可或缺的一种技能。

参考

相关推荐
崔庆才丨静觅12 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606113 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了13 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅13 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅13 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅14 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment14 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅14 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊14 小时前
jwt介绍
前端
爱敲代码的小鱼14 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax