Redis学习笔记-1

本文最后更新于:2023年4月24日 晚上

Redis是什么?

是一个key-value数据库。

安装Redis

下载点此处
点击上面跳转到下载界面(github链接,中国大陆可能难以访问),下载zip压缩包形式的文件,然后将其解压到某一处。在该目录下运行终端(cmd),并执行命令:redis-server.exe redis.windows.conf

ok那么安装这里我卡了半天,之前是用过的,但是现在一启动就:提供无效参数balabala
每个人的解决方法可能都不一样,我建议多搜不同方法试
我自己是这一句Warning: no config file specified, using the default config.,也就是不能直接使用redis-server启动,而是得打全(也就是指定使用哪个配置文件):redis-server.exe redis.windows.conf,挺无语的
如果成功开启Redis的话,会看到Redis的图标,以及最后一句Ready to accept connections,不要关闭这个窗口,在Redis目录下另外打开一个终端并执行redis-cli.exe -h 127.0.0.1 -p 6379(如果没修改过配置文件直接redis-cli.exe也行,后面的hostport参数都是默认的)。成功连接后显示127.0.0.1:6379>
这里如果遇到目标计算机积极拒绝,那我建议和上面一样上网搜,当然跟上述步骤用cmd成功启动Redis的话我觉得是不会出现这个问题的。

Redis数据类型

Redis一共支持五种数据类型:string(字符串)hash(哈希)list(列表)set(集合)zset(有序集合)

使用del <key_1> [key_2]...来删除键,使用select <num>来选择数据库。
要查看更多命令,可以前往:Redis官网

string

最基本的数据类型,一个key对应一个value
只需要注意一下:“string类型是二进制安全的。意思是Redisstring可以包含任何数据。比如jpg图片或者序列化的对象。
相关指令:set <key> <value>get <key>

hash

Redis hash是一个键值对集合
相关指令:hmset <key> <field_1> <value_1> [field_2] [value_2]...hget <key> <field>

list

Redis list是简单的字符串列表,依照插入顺序排序。
相关指令:lpush <key> <value_1> [value_2]...rpush <key> <value_1> [value_2]...lrange <key> <start> <stop>

set

Redis set是字符串的无序集合
相关指令:sadd <key> <member_1> [member_2]...smembers <key>

zset

“每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。”
“zset的成员是唯一的,但分数(score)却可以重复。”
相关指令:zadd <key> <score_1> <member_1> [score_2] [member_2]...zrangebyscore <key> <min> <max>

HyperLogLog

后面添加的新东西,用来做基数统计的算法,基数就是数据集中不重复元素的数量,而这个东西因为是用来计算基数的,所以不会存储输入元素本身。

Stream

后后面添加的新东西,主要用于消息队列MQ(什么物联网应用)。
至于“不是已经有发布订阅模式了吗怎么还有加入个Stream啊?”这个问题,参考网站上说:“但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。简单来说发布订阅可以分发消息,但无法记录历史消息。”
那么Stream呢?“而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。”
每个Stream都有唯一个名称,这个名称就是RedisKey
不过菜鸟教程上的Stream这部分也只是讲了些基础命令就没了,消费者组没怎么讲,之后我会找点其他文档看看,再进行补充。总之先把有的讲了吧!
下面以一个消息中两个字段来创建一个Stream,并对其进行一些操作。假设我们现在需要记录学生的姓名和他们对应的学号,并放入这个Stream中。

由于Redis自带命令提示,所以下面命令不会给出完整格式。

xadd

我们可以用xadd来创建队列和向队列中添加消息。

xadd命令格式:xadd key ID field string [field string ...]ID既可以自己设置,也能够让Redis来设置。自己设置需要保持递增性,如果需要Redis设置,ID处就改为*

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> xadd StudentsInf * StudentID 0 Name Tom
"1682212841653-0"
127.0.0.1:6379> xadd StudentsInf * StudentID 1 Name Amy
"1682212847920-0"
127.0.0.1:6379> xadd StudentsInf * StudentID 2 Name Jack
"1682212857405-0"
127.0.0.1:6379> xadd StudentsInf * StudentID 3 Name Kevin
"1682212867763-0"
127.0.0.1:6379> xadd StudentsInf * StudentID 4 Name Chen
"1682213031310-0"
127.0.0.1:6379> xadd StudentsInf * StudentID 5 Name Kanade
"1682213051016-0"

xlen

我们可以用xlen来查看指定队列的长度。

1
2
127.0.0.1:6379> xlen StudentsInf
(integer) 6

xrange

要查看指定队列,则使用xrange命令。其中,-代表最小值,+代表最大值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
127.0.0.1:6379> xrange StudentsInf - +
1) 1) "1682212841653-0"
2) 1) "StudentID"
2) "0"
3) "Name"
4) "Tom"
2) 1) "1682212847920-0"
2) 1) "StudentID"
2) "1"
3) "Name"
4) "Amy"
3) 1) "1682212857405-0"
2) 1) "StudentID"
2) "2"
3) "Name"
4) "Jack"
4) 1) "1682212867763-0"
2) 1) "StudentID"
2) "3"
3) "Name"
4) "Kevin"
5) 1) "1682213031310-0"
2) 1) "StudentID"
2) "4"
3) "Name"
4) "Chen"
6) 1) "1682213051016-0"
2) 1) "StudentID"
2) "5"
3) "Name"
4) "Kanade"

另外,Redis也提供了一个倒序获取消息列表的命令:xrevrange,用法和xrange一致。

xdel

要删除某一消息,可以使用xdel命令。

1
2
127.0.0.1:6379> del StudentsInf 1682212867763-0
(integer) 1

Redis的发布订阅

Redis也有发布订阅通信模式,发布者发布信息到频道,频道转发消息给订阅者,示例如下:
我们需要打开两个redis-cli,先在第一个里面进行频道订阅

1
2
3
4
5
127.0.0.1:6379> subscribe MyTestChannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "MyTestChannel"
3) (integer) 1

然后来到第二个redis-cli进行信息的发布

1
2
127.0.0.1:6379> publish MyTestChannel "Test Message 1"
(integer) 1

接着就能看到另外一边显示出信息了

1
2
3
1) "message"
2) "MyTestChannel"
3) "Test Message 1"

Redis中的事务

既然它是个数据库,那很明显它也有事务!(
Redis的事务处理步骤如下:

开始事务——multi
命令入队——set or other commands
执行事务——exec / 取消事务——discard
但是要注意的是,如果在执行事务的过程中,有命令执行失败并不会打断事务执行,所以也不会回滚之前的操作
Redis的事务还有一个watch命令可以监视key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。
比如现在有两个redis-cli都在使用同一个数据库,第一个在执行事务,第二个改变了第一个事务中监视的key,那么第一个中的事务将被打断。
同样的我们打开两个redis-cli来使用一下watch。在第一个窗口中,我们先使用set命令设置一个键值对:127.0.0.1:6379> set WatchKey "A value"。然后来到第二个窗口,输入如下:

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> watch WatchKey
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> get WatchKey
QUEUED
127.0.0.1:6379> exists WatchKey
QUEUED
127.0.0.1:6379> set WatchKey "No execute"
QUEUED

上面监视了在第一个窗口设置的WatchKey键,然后设置了一个三条命令的事务。这时候先别执行,回到第一个窗口对WatchKey进行修改,比如删除:127.0.0.1:6379> del WatchKey,执行成功后再在第二个窗口执行事务:

1
2
127.0.0.1:6379> exec
(nil)

可以看到exec命令直接返回了null,说明事务没有被执行。

Redis数据备份与恢复

要备份数据库,可以使用savebgsave命令,直接在redis-cli中输入即可,该命令执行后会生成dump.rdb文件。要恢复数据也十分容易,直接将dump.rdb文件置于Redis安装目录并启动服务即可。

Redis密码验证

Redis设置密码访问,使用config set requirepass <password>命令即可。如果需要查看密码,使用config get requirepass命令即可。

可能遇到的问题

redis-cli乱码

Solution: redis-cli --raw

乱七八糟的话

也许以后又学到什么Redis相关再放到这里。

参考

菜鸟教程Redis


这里有一只爱丽丝

希望本文章能够帮到您~


Redis学习笔记-1
https://map1e-g.github.io/2023/04/22/redis-learning-1/
作者
MaP1e-G
发布于
2023年4月22日
许可协议