Redis基础知识学习笔记(二)

一.Redis 安装

1.Windows 下安装

Github 下载: https://github.com/tporadowski/redis/releases(推荐)

官网下载: https://redis.io/download(注意没有 Windows 版本的)

Windows 下的.msi 安装和.zip 格式区别:

.msi 是 Windows installer 开发出来的程序安装文件,它可以让你安装,修改,卸载你所安装的程序。说白了.msi 就是 Windows installer 的数据包,把所有和安装文件相关的内容封装在一个包里。此外:它还包含有关安装过程自己的信息。例如:安装序列、目标文件夹路径、安装选项和控制安装过程的属性。
.zip 是一个压缩包,解压之后即可,不需要安装

建议使用 zip 压缩包方式下载,如图:
20240901172300

一般解压缩到除 C 盘之外的盘即可,重命名为 redis
20240901172751

在 redis 的安装目录下打开 cmd 窗口,运行:

1>资源管理器目录进入

20240901173049

2>目录进入命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
cd 切换目录命令示例:

例:cd // 显示当前目录

例:cd … // 进入父目录

例:cd /d d: // 进入上次d盘所在的目录(或在直接输入:d:)

例:cd /d d:\ // 进入d盘根目录

例:cd d: // 显示上次d盘所在的目录

例:cd /d d:\src // 进入d:\src目录
1
redis-server.exe redis.windows.conf

20240901173215

默认端口为 6379,出现图上的图标说明 redis 服务启动成功。命令里面的 redis.windows.conf 可以省略,省略后,使用 redis-server.exe 命令会使用默认的配置。出现这个即表示 redis 服务器启动成功了,切记不要关闭

以同样的方式在 redis 的安装目录下打开 cmd,挨个运行:

1
2
3
4
5
6
7
8
使用redis-cli.exe命令来打开Redis客户端连接本地redis
redis-cli.exe -h 127.0.0.1 -p 6379

设置键值对:
set myKey abc

取出键值对:
get myKey

20240901173731

也可在客户端连接服务器之后使用 ping 命令查看是否连接成功,返回 PONG 则成功

3.配置环境变量

为了方便,建议把 Redis 路径配置到系统变量 Path 值中,这样就省得再输路径了。

我们把 redis 的安装路径复制到系统环境变量的 path 中即可,之后按 ctrl+R 进入 cmd 窗口即可直接运行 redis 命令

2.Linux 下安装

由于 CentOs 停止维护,我们以 Ubuntu 示例,本质流程都一个样

1> 安装 redis

1
2
sudo apt update
sudo apt install redis-server

2> 启动 redis

1
redis-server

3> 查看 redis 是否启动

1
redis-cli

如果终端打开以下内容,即表示安装成功:

1
redis 127.0.0.1:6379>

127.0.0.1 是本机 IP ,6379 是 redis 服务端口。
我们输入 PING 命令,返回 PONG 即表示安装成功

1
2
redis 127.0.0.1:6379> ping
PONG

二.Redis 配置

本机使用 Redis 服务器的话可以挂 vscode 上使用

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)。

1. 查看配置

可以通过 CONFIG 命令查看或设置配置项。(记得打开 redis 服务器)
语法:

1
2
3
4
5
# 查询指定名为<CONFIG_SETTING_NAME>的配置项
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

# 查询配置文件中所有的配置项
CONFIG GET *

20240901175832

2. 编辑配置

你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。
语法:

1
2
# 修改指定名为<CONFIG_SETTING_NAME>的值改为<NEW_CONFIG_VALUE>
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

3. 参数说明

redis.conf 配置项说明如下:

序号配置项说明
1daemonize noRedis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no )
2pidfile /var/run/redis.pid当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定(windows 不支持哦)
3port 6379指定 Redis 监听端口,默认端口为 6379
4bind 127.0.0.1绑定的主机地址
5timeout 300当客户端闲置多长秒后关闭连接,如果指定为 0 ,表示关闭该功能
6loglevel notice指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
7logfile stdout日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给 /dev/null
8databases 16设置数据库的数量,默认数据库为 0,可以使用 SELECT 命令在连接上指定数据库 id
9save<seconds> <changes>指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
10rdbcompression yes指定存储至本地数据库时是否压缩数据,默认为 yes
11dbfilename dump.rdb指定本地数据库文件名,默认值为 dump.rdb
12dir ./指定本地数据库存放目录
13slaveof<masterip> <masterport>设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口
14masterauth<master-password>当 master 服务设置了密码保护时,slave 服务连接 master 的密码
15requirepass foobared设置 Redis 连接密码
16maxclients 128设置同一时间最大客户端连接数,默认无限制
17maxmemory<bytes>指定 Redis 最大内存限制
18appendonly no指定是否在每次更新操作后进行日志记录
19appendfilename appendonly.aof指定更新日志文件名
20appendfsync everysec指定更新日志条件
21vm-enabled no指定是否启用虚拟内存机制
22vm-swap-file /tmp/redis.swap虚拟内存文件路径
23vm-max-memory 0将所有大于 vm-max-memory 的数据存入虚拟内存
24vm-page-size 32Redis swap 文件 page 大小
25vm-pages 134217728设置 swap 文件中的 page 数量
26vm-max-threads 4设置访问 swap 文件的线程数
27glueoutputbuf yes设置在向客户端应答时,是否把较小的包合并为一个包发送
28hash-max-zipmap-entries 64, hash-max-zipmap-value 512指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
29activerehashing yes指定是否激活重置哈希
30include /path/to/local.conf指定包含其它的配置文件

可视化工具我这里使用的 DataGrip
20240901182527

三.Redis 数据类型

Redis 主要支持以下几种数据类型:

类型特性
string(字符串)基本的数据存储单元,可以存储字符串、整数或者浮点数。
hash(哈希)一个键值对集合,可以存储多个字段。
list(列表)一个简单的列表,可以存储一系列的字符串元素。
set(集合)一个无序集合,可以存储不重复的字符串元素。
zset(sorted set:有序集合)类似于集合,但是每个元素都有一个分数(score)与之关联。
位图(Bitmaps)基于字符串类型,可以对每个位进行操作。
超日志(HyperLogLogs)用于基数统计,可以估算集合中的唯一元素数量。
地理空间(Geospatial)用于存储地理位置信息。
发布/订阅(Pub/Sub)一种消息通信模式,允许客户端订阅消息通道,并接收发布到该通道的消息。
流(Streams)用于消息队列和日志存储,支持消息的持久化和时间排序。
模块(Modules)Redis 支持动态加载模块,可以扩展 Redis 的功能。

注意:Redis 支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

Redis 是一个字典结构的存储服务器,而实际上一个 Redis 实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

每个数据库对外都是一个从 0 开始的递增数字命名,Redis 默认支持 16 个数据库(可以通过配置文件支持更多,无上限),可以通过配置 databases 来修改这一数字。客户端与 Redis 建立连接后会自动选择 0 号数据库,不过可以随时使用 SELECT 命令更换数据库

然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先 Redis 不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外 Redis 也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如 FLUSHALL 命令可以清空一个 Redis 实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用 0 号数据库存储某个应用生产环境中的数据,使用 1 号数据库存储测试环境中的数据,但不适宜使用 0 号数据库存储 A 应用的数据而使用 1 号数据库 B 应用的数据,不同的应用应该使用不同的 Redis 实例存储数据。由于 Redis 非常轻量级,一个空 Redis 实例占用的内存只有 1M 左右,所以不用担心多个 Redis 实例会额外占用很多内存。

1. String(字符串)

string 是 redis 最基本的数据类型,一个 key 对应一个 value,最大能存储 512MB。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象。

常用命令

命令作用
SET key value设置键的值
GET key获取键的值
INCR key将键的值加 1
DECR key将键的值减 1
APPEND key value将值追加到键的值之后

实例

1
2
3
4
5
set test "玛卡巴卡"
get test
incr test
decr test
append test "万岁!"

20240901182901
利用 set 创建了一个键为 test,值为“玛卡巴卡”,get 获取 test 的值,由于这里 string 值为中文,不能使用 incr 和 decr,append 增加值
20240901183315

2. Hash(哈希)

Redis hash 是一个键值(key=>value)对集合,类似于一个小型的 NoSQL 数据库。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

每个哈希最多可以存储 2^32 - 1 个键值对。

常用命令

命令作用
HSET key field value设置哈希表中字段的值
HGET key field获取哈希表中字段的值
HGETALL key获取哈希表中所有字段和值
HDEL key field删除哈希表中的一个或多个字段

场景:存储、读取、修改用户属性

实例

首先删除前面的 String 类型的 test 或者使用另外的数据库,redis 共有 16 个

1
2
3
4
5
-- 选择2号数据库
select 2

-- 删除test键
del test

运行:

1
2
3
4
5
hmset test field1 "Hello" field2 "World"
hget test field1
hgetall test
hdel test field1
hgetall test

实例中我们使用了 hmset 设置了两个 field=>value 对, hget 获取对应 field 对应的 value,hdel 删除了 field1,hgetall 获取了 test 键的全部值
20240901184459

3. List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

列表最多可以存储 2^32 - 1 个元素。

常用命令

命令作用
LPUSH key value将值插入到列表头部
RPUSH key value将值插入到列表尾部
LPOP key移出并获取列表的第一个元素
RPOP key移出并获取列表的最后一个元素
LRANGE key start stop获取列表在指定范围内的元素

场景:1、最新消息排行等功能(比如朋友圈的时间线) 2、消息队列

实例

同理,这里我们先使用 del 命令删除 test 键

1
2
3
4
5
6
7
8
9
10
11
del test

lpush test redis
lpush test mongodb
lpush test rabbitmq
lrange test 0 10
rpush test java
lrange test 0 10
lpop test
rpop test
lrange test 0 10

20240901185930

4. Set(集合)

Redis 的 Set 是 string 类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

常用命令

命令作用
SADD key value向集合添加一个或多个成员,添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
SREM key value移除集合中的一个或多个成员
SMEMBERS key返回集合中的所有成员
SISMEMBER key value判断值是否是集合的成员

场景:1、共同好友 2、利用唯一性,统计访问网站的所有独立 ip 3、好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐

实例

同理,这里我们先使用 del 命令删除 test 键

1
2
3
4
5
6
7
8
9
10
del test

sadd test redis
sadd test mongodb
sadd test rabbitmq
smembers test
sadd test rabbitmq
smembers test
srem test rabbitmq
sismember test rabbitmq

20240901190303
注意:以上实例中 rabbitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

5. zset(sorted set:有序集合)

Redis zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

zset 的成员是唯一的,但分数(score)却可以重复。

常用命令

命令作用
ZADD key score value向有序集合添加一个或多个成员,或更新已存在成员的分数
ZRANGE key start stop [WITHSCORES]返回指定范围内的成员
ZREM key value移除有序集合中的一个或多个成员
ZSCORE key value返回有序集合中,成员的分数值

场景:1、排行榜 2、带权重的消息队列

实例

同理,这里我们先使用 del 命令删除 test 键

1
2
3
4
5
6
7
8
del test
zadd test 0 redis
zadd test 0 mongdb
zadd test 0 rabbitmq
zadd test 1 rabbitmq
zrange test 0 1000
zrem test redis
zscore test rabbitmq

20240901190659

6. HyperLogLog

  1. 用于基数估计算法的数据结构。
  2. 常用于统计唯一值的近似值。

7. Bitmaps

  1. 位数组,可以对字符串进行位操作。
  2. 常用于实现布隆过滤器等位操作。

8. Geospatial Indexes

处理地理空间数据,支持地理空间索引和半径查询。

9. Streams

  1. 日志数据类型,支持时间序列数据。
  2. 用于消息队列和实时数据处理。