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 是开发工作中不可或缺的一种技能。

参考

相关推荐
安冬的码畜日常8 分钟前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n036 分钟前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。1 小时前
案例-任务清单
前端·javascript·css
zqx_72 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己2 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称3 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色3 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2343 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河3 小时前
CSS总结
前端·css
BigYe程普4 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发