Redis基础知识学习笔记(二)
Redis基础知识学习笔记(二)
Jie一.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 压缩包方式下载,如图:
一般解压缩到除 C 盘之外的盘即可,重命名为 redis
在 redis 的安装目录下打开 cmd 窗口,运行:
1>资源管理器目录进入
2>目录进入命令:
1 | cd 切换目录命令示例: |
1 | redis-server.exe redis.windows.conf |
默认端口为 6379,出现图上的图标说明 redis 服务启动成功。命令里面的 redis.windows.conf 可以省略,省略后,使用 redis-server.exe 命令会使用默认的配置。出现这个即表示 redis 服务器启动成功了,切记不要关闭
以同样的方式在 redis 的安装目录下打开 cmd,挨个运行:
1 | 使用redis-cli.exe命令来打开Redis客户端连接本地redis |
也可在客户端连接服务器之后使用 ping 命令查看是否连接成功,返回 PONG 则成功
3.配置环境变量
为了方便,建议把 Redis 路径配置到系统变量 Path 值中,这样就省得再输路径了。
我们把 redis 的安装路径复制到系统环境变量的 path 中即可,之后按 ctrl+R 进入 cmd 窗口即可直接运行 redis 命令
2.Linux 下安装
由于 CentOs 停止维护,我们以 Ubuntu 示例,本质流程都一个样
1> 安装 redis
1 | sudo apt update |
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 | redis 127.0.0.1:6379> ping |
二.Redis 配置
本机使用 Redis 服务器的话可以挂 vscode 上使用
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)。
1. 查看配置
可以通过 CONFIG 命令查看或设置配置项。(记得打开 redis 服务器)
语法:
1 | # 查询指定名为<CONFIG_SETTING_NAME>的配置项 |
2. 编辑配置
你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。
语法:
1 | # 修改指定名为<CONFIG_SETTING_NAME>的值改为<NEW_CONFIG_VALUE> |
3. 参数说明
redis.conf 配置项说明如下:
序号 | 配置项 | 说明 |
---|---|---|
1 | daemonize no | Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no ) |
2 | pidfile /var/run/redis.pid | 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定(windows 不支持哦) |
3 | port 6379 | 指定 Redis 监听端口,默认端口为 6379 |
4 | bind 127.0.0.1 | 绑定的主机地址 |
5 | timeout 300 | 当客户端闲置多长秒后关闭连接,如果指定为 0 ,表示关闭该功能 |
6 | loglevel notice | 指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice |
7 | logfile stdout | 日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给 /dev/null |
8 | databases 16 | 设置数据库的数量,默认数据库为 0,可以使用 SELECT 命令在连接上指定数据库 id |
9 | save<seconds> <changes> | 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 |
10 | rdbcompression yes | 指定存储至本地数据库时是否压缩数据,默认为 yes |
11 | dbfilename dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
12 | dir ./ | 指定本地数据库存放目录 |
13 | slaveof<masterip> <masterport> | 设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口 |
14 | masterauth<master-password> | 当 master 服务设置了密码保护时,slave 服务连接 master 的密码 |
15 | requirepass foobared | 设置 Redis 连接密码 |
16 | maxclients 128 | 设置同一时间最大客户端连接数,默认无限制 |
17 | maxmemory<bytes> | 指定 Redis 最大内存限制 |
18 | appendonly no | 指定是否在每次更新操作后进行日志记录 |
19 | appendfilename appendonly.aof | 指定更新日志文件名 |
20 | appendfsync everysec | 指定更新日志条件 |
21 | vm-enabled no | 指定是否启用虚拟内存机制 |
22 | vm-swap-file /tmp/redis.swap | 虚拟内存文件路径 |
23 | vm-max-memory 0 | 将所有大于 vm-max-memory 的数据存入虚拟内存 |
24 | vm-page-size 32 | Redis swap 文件 page 大小 |
25 | vm-pages 134217728 | 设置 swap 文件中的 page 数量 |
26 | vm-max-threads 4 | 设置访问 swap 文件的线程数 |
27 | glueoutputbuf yes | 设置在向客户端应答时,是否把较小的包合并为一个包发送 |
28 | hash-max-zipmap-entries 64, hash-max-zipmap-value 512 | 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法 |
29 | activerehashing yes | 指定是否激活重置哈希 |
30 | include /path/to/local.conf | 指定包含其它的配置文件 |
可视化工具我这里使用的 DataGrip
三.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 | set test "玛卡巴卡" |
利用 set 创建了一个键为 test,值为“玛卡巴卡”,get 获取 test 的值,由于这里 string 值为中文,不能使用 incr 和 decr,append 增加值
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号数据库 |
运行:
1 | hmset test field1 "Hello" field2 "World" |
实例中我们使用了 hmset 设置了两个 field=>value 对, hget 获取对应 field 对应的 value,hdel 删除了 field1,hgetall 获取了 test 键的全部值
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 | del test |
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 | del test |
注意:以上实例中 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 | del test |
6. HyperLogLog
- 用于基数估计算法的数据结构。
- 常用于统计唯一值的近似值。
7. Bitmaps
- 位数组,可以对字符串进行位操作。
- 常用于实现布隆过滤器等位操作。
8. Geospatial Indexes
处理地理空间数据,支持地理空间索引和半径查询。
9. Streams
- 日志数据类型,支持时间序列数据。
- 用于消息队列和实时数据处理。