前言
在学习前端或后端的过程中,多少会接触 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 是开发工作中不可或缺的一种技能。