10、Redis核心数据结构实战+服务搭建

目录

一. Redis 安装

1.1. 单机部署

1.1.1. 检查安装 gcc 环境

1.1.2. 下载安装 Redis

1.1.3. 启动 Redis

 1.1.4. 配置Redis

1.1.5. 退出 OR 关闭 redis

 1.2 主从部署( Master-Slave Replication) 

1.2.1. 主从复制的作⽤

1.2.2. 主从复制部署

1.2.3. 主从复制缺点

1.3. 哨兵部署(Sentinel)

1.3.1. 哨兵模式的原理

1.3.2. 哨兵

1.3.3. 客观下线

1.3.4. 哨兵模式部署

1.3.5. 哨兵使⽤建议

1.3.6. 哨兵模式:并不能保证数据零丢失

1. 复制延迟:

2. 故障检测和转移时间:

3. ⽹络分区:

4. 多个从节点同时故障:

1.4. 集群部署(Cluster)

1.4.1. Redis集群的作⽤

1.4.2. Redis集群的数据分⽚

1.4.3. Reids 集群部署

1.4.3.1. redis 环境简述

1.4.3.2. redis 集群配置准备

1.4.3.3. Redis 集群数据读写

1.4.3.4. 模拟故障转移 

 2. 完整的⽂件⽬录与配置⽂件与使⽤过程中的命令

 2.1. ⽂件⽬录

2.2. 配置⽂件

2.2.1. 单机Redis配置⽂件

2.2.2. 主从节点配置

2.2.3. 哨兵模式

2.2.4. 集群

 2.2.5. 命令

三、Redis7核心数据结构

Red is7核心数据结构

3.1Redis7有那些数据结构?

3.1.1 String 结构

3.1.1.1 字符串常用操作

​编辑

3.1.1.2 String常见应用场景

3.1.2 Hash结构

 3.1.2.1 Hash常用操作 

3.1.2.2 Hash常见应用场景

(1)对象缓存

(2)电商购物车

3.1.2.3 Hash结构优缺点

3.1.3 List 结构

3.1.3.1 List常用操作

3.1.3.2 List类型应用场景

3.1.3.3 List类型注意点

3.1.4 Set类型

 3.1.4.1  Set常用操作

3.1.4.2 Set应用场景

(1) 微信抽奖小程序

(2)微信微博点赞, 收藏, 标签

3.1.5 Z Set有序列表类型 

3.1.5.1 ZSet常用操作 

3.1.5.2 Z Set应用场景

3.1.6 Bitmap类型

​编辑3.1.6.1 Bitmap常用操作 

3.1.6.2 Bitmap应用场景

3.1.7 Hyperloglog类型

3.1.7.1  作用介绍:

3.1.7.2 Hyperloglog常用操作

3.1.7.3 Hyperloglog其他操作

3.1.8 Geo类型

3.1.8.1 Geo常用操作

3.1.8.2 Geo应用场景 

3.1.9 stream类型

3.1.9.1  作用介绍

3.1.9.2 stream常用操作

•     常用操作XADD key [NOMKSTREAM] [MAXLEN|MINID [= |~] threshold [LIMIT count]] *|id field value [field value ...]            //往对列的末尾发布一条消息XDEL key id [id ...]    // 删除队列中的一条消息XLEN key    //获取队列的长度XRANGE key start end [COUNT count]    //查询队列中的消息

3.1.9.3 stream常用操作

3.2补充

3.2.1补充:SpringBoot集成Redis

3.2.2补充: RestTemplate快速上手

3.2.3补充: RedisTemplate中文乱码问题


一. Redis 安装

本教程将演示在 linux 环境下安装 Redis7 给⼤家最简单, 最快捷的安装⽅式, 其中包括单机部署 、主从部署 、哨兵部署 、集群  部署的安装以及相应的架构介绍。

1.1. 单机部署

1.1.1. 检查安装 gcc 环境

Redis是由C语⾔编写的, 它的运⾏需C环境, 因此我们需要先安装gcc

-- 关闭防⽕墙
systemctl stop firewalld.service 
-- 状态
firewall-cmd --state
-- 卸载防⽕墙
yum remove firewalld

-- 检查版本
gcc --version
-- 安装  gcc
yum install gcc

1.1.2. 下载安装 Redis

-- 安装应⽤养成良好习惯, ⽂件归类 
mkdir -p /opt/software/redis

-- 进⼊redis⽂件夹, 使⽤wget下载
cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.g z

-- 解压下载的redis包
tar -xzf redis-stable.tar.gz

-- 进⼊redis-stable⽬录, 然后使⽤make install 编译并安 装, 安装完成后  /usr/local/bin 会⽣成相应的服务
cd redis-stable
make install

-- 检查是否成功⽣成  
ll /usr/local/bin

1.1.3. 启动 Redis

到这⾥其实我们可以在使⽤ /opt/software/redis/redis-stable/src

 或者 /usr/local/bin ⽬录下的 redis-server 启动 Redis 服务了。

Redis 源码路径下启动
 ./src/redis-server

使⽤us r/local/bin 路径下启动( 该⽬录下)
 redis-server

 1.1.4. 配置Redis

前⾯的启动⽅式⽆法再后台运⾏, 退出之后直接关闭了 Redis  务, 所以我们还需要针对 Redis 做—些设置。

-- 修改当前Redis⽬录下的  Reids.conf ⽂件
 vim redis.conf
bind * -::*                        #87⾏, 修改bind 项, * -::* ⽀持远程连接
daemonize yes                       #309⾏, 开启守护进程, 后台运⾏
logfile /opt/software/redis/redis-stable/redis.lo g     #355⾏, 指定⽇志⽂件⽬录
dir /opt/software/redis             #510⾏, 指定⼯作⽬录
requirepass 1qaz@WSX               #1044⾏, 给默认⽤户设置密码, 主要是使⽤ redis-cli 
                             连接 redis-server 时, 需要通过密码校验 。 ⾃⾏学习, 可以不设置。
protected-mode no                  #111⾏, 允许远程连接  如果不设置密码必须讲此设置关闭。

修改完成后, 使⽤配置⽂件启动 Redis 并使⽤ redis-cli 连接测试, 需要注意由于前⾯我们配置了安全密码, 所以连接后需要先验证密码, 否则会报错。

redis-server redis.conf
redis-cli
auth 1qaz@WSX

 

1.1.5. 退出 OR 关闭 redis

-- 退出
redis quit

-- 关闭redis
redis-cli shutdown

 1.2 主从部署( Master-Slave Replication 

主从复制, 是指将—台Redis服务器的数据, 复制到其他的Redis 服务器 。前者称为主节点(Master) 后者称为从节点(Slave);数 据的复制是单向的, 只能由主节点到从节点 。默认情况下, 每台 Redis服务器都是主节点;且—个主节点可以有多个从节点(或没  有从节点) 但—个从节点只能有—个主节点。

1.2.1. 主从复制的作⽤

a 数据冗余: 主从复制实现了数据的热备份, 是持久化之外的— 种数据冗余⽅式。

b) 故障恢复: 当主节点出现问题时, 可以由从节点提供服务, 现快速的故障恢复; 实际上是—种服务的冗余。

c 负载均衡:在主从复制的基础上, 配合读写分离, 可以由主节点提供写服务, 由从节点提供读服务( 即写Redis数据时应⽤连接主节点, Redis数据时应⽤连接从节点), 分担服务器负载;尤其是在写少读多的场景下, 通过多个从节点分担读负载, 可以⼤   ⼤提⾼Redis服务器的并发量。

d ⾼可⽤基⽯: 除了上述作⽤以外, 主从复制还是哨兵和集群能够实施的基础, 因此说主从复制是Redis⾼可⽤的基础。

1.2.2. 主从复制部署

整体架构图

主节点不需要做任何改变, 从节点都需要修改配置加上主节点信 息, 配置完成后, 可以再主库检查从节点信息.

# 添加主节点信息
 replicaof 192.168.75.129 6379

1.2.3. 主从复制缺点

   复制延时, 信号衰减

        由于所有的写操作都是现在master上操作, 然后同步更新 slave上, 所以从master同步到slave机器上有—定的延迟,当系统很繁忙的时候, 延迟问题会更加严重, slave机器数量的增加也会使这个问题更加严重。

   master挂了如何办?

        默认情况下,不会在slave节点中⾃动重选—个master 次都要⼈⼯⼲预。

  1. 选择从节点:查看从节点的复制状态和偏移量,选择数据最新的从节点

    redis-cli info replication
  2. 执行切换

    redis-cli SLAVEOF NO ONE
  3. 调整其他从节点:让其他从节点复制新的主节点

    redis-cli SLAVEOF <new-master-ip> <new-master-port>
  4. 更新客户端配置:修改客户端连接配置指向新主节点

1.3. 哨兵部署(Sentinel

Redis的主从复制主要⽤于实现数据的冗余备份和读分担, 并不是为了提供⾼可⽤性 。因此在系统⾼可⽤⽅⾯, 单纯的主从架构⽆  法很好的保证整个系统⾼可⽤

1.3.1. 哨兵模式的原理

Redis哨兵模式是通过在独⽴的哨兵节点上运⾏特定的哨兵进程来实现的 。这些哨兵进程监控主从节点的状态, 并在发现故障时⾃动完成故障发现和转移, 并通知应⽤⽅, 实现⾼可⽤性。

 

1.3.2. 哨兵

在启动时, 每个哨兵节点会执⾏选举过程, 其中—个哨兵节点被选为领导者( leader), 负责协调其他哨兵节点。

   选举过程:

        每个在线的哨兵节点都可以成为领导者, 每个哨兵节点会向其它 哨兵发is-master-down-by-addr命令, 征求判断并要求将⾃⼰设置为领导者;当其它哨兵收到此命令时, 可以同意或者拒绝它成为领导者; 如果哨兵发现⾃⼰在选举的票数⼤于等于num(sentinels)/2+1 时, 将成为领导者, 如果没有超过, 继续选举。

   监控主从节点:

        哨兵节点通过发送命令周期性地检查主从节点的健康状态, 包括主节点是否在线 、从节点是否同步等 。如果哨兵节点发现主节点不可⽤  它会触发—次故障转移。

   故障转移:

        —旦主节点被判定为不可⽤  哨兵节点会执⾏故障转移操作 。它会从当前的从节点中选出—个新的主节点, 并将其他 从节点切换到新的主节点 。这样, 系统可以继续提供服务⽽⽆需⼈⼯介⼊ 

   故障转移过程:

        由Sentinel节点定期监控发现主节点是否出现了故障:

        sentinel会向master发送⼼跳PING来确认master是否存活, master —定时间范围 内不回应PONG 或者是回复了—个错误消息, 那么这个sentinel会主观地(单⽅⾯地)认为这master已经不可⽤了。

   确认主节点:

        ○   过滤掉不健康的(下线或断线), 没有回复过哨兵ping响应的从节点

        ○   选择从节点优先级最⾼的

        ○   选择复制偏移量最⼤, 此指复制最完整的从节点

        ○    当主节点出现故障, 由领导者负责处理主节点的故障转移。

   客户端重定向:

        哨兵节点会通知客户端新的主节点的位置, 使其能够与新的主节点建⽴连接并发送请求 。这确保了客户端可以⽆缝切换到新的主节点, 继续进⾏操作。此外, 哨兵节点还负责监控从节点的状态 。如果从节点出现故障, 哨兵节点可以将其下线, 并在从节点恢复正常后重新将其加⼊集群。

1.3.3. 客观下线

当主观下线的节点是主节点时, 此时该哨兵3节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的 判断, 当超过quorum 选举)个数, 此时哨兵节点则认为该主节点确实有问题, 这样就客观下线了, ⼤部分哨兵节点都同意下线  操作, 也就说是客观下线。

1.3.4. 哨兵模式部署

整体架构图

3 个机器都需要修改 sentinel.conf 配置, 配置完成之后先从主节点开始启动哨兵。

protected-mode no             #6⾏, 关闭保护模式
daemonize yes                 #15⾏, 指定sentinel为后台启动
logfile /opt/software/redis/redis-stable/sentin el.log              #34⾏, 指定⽇志存放路径
dir /opt/software/redis     #73⾏, 指定数据库存放路径
sentinel monitor mymaster 192.168.75.129 6379 2     #93⾏, 修改  指定该哨兵节点监控        #20.0.0.20:6379这个主  节点, 该主节点的名称是mymaster, 最后的2的含义与主节点的 故障判定有关:⾄少需要2个哨兵节点同意, 才能判定主节点故障并进⾏故障转移


 sentinel down-after-milliseconds mymaster 30000   #134⾏, 判定服务器down掉的时间周期, 默认30000毫秒 (30秒)
 sentinel failover-timeout mymaster 180000   #234⾏, 故障节点的最⼤超时时间为180000( 180秒)

 启动后检查哨兵状态:

redis-cli -p 26379 info sentinel

故障模拟

-- 可以杀掉主节点的进程, 也可以直接停掉主节点服务
ps aux | grep redis
redis-cli shutdown

-- 观察哨兵⽇志, 129 主节点下线, 重新选举131为主节点 
tail -f sentinel.log

--重新启动  129 服务  并观察⽇志, 129加⼊主从, 此时主节点为 131服务
redis-server redis.conf tail -f sentinel.log
redis-cli -p 26379 info sentinel
-- 观察哨兵⽇志
tail -f sentinel.log

-- 停⽌哨兵
redis-cli -p 26379 shutdown

 

-- 切换到131服务, 已经为主节点。
redis-cli info replication

 

当触发了哨兵选举之后, 会再后台更改 redis.conf  sentinel.conf 可以检查每台机器的⽂件末尾的数据

cat redis.conf
cat sentinel.conf

1.3.5. 哨兵使⽤建议

   哨兵节点的数量应为多个, 哨兵本身应该集群, 保证⾼可⽤

   哨兵节点数应该是奇数

●   各个哨兵结点的配置应—致

●   如果哨兵节点部署在Docker等容器⾥⾯, 尤其要注意端⼝号的正确映射

1.3.6. 哨兵模式:并不能保证数据零丢失

1. 复制延迟:

○   在主从复制中, 从节点的数据是异步复制⾃主节点的 。这意味着在主节点故障时, 从节点可能还没有完全同步最新的数 据, 从⽽导致数据丢失。

2. 故障检测和转移时间:

○   Sentinel 检测到主节点故障并执⾏故障转移需要—定的时 。在这段时间内, 主节点可能已经接收了—些写操作,  这些操作尚未被复制到从节点。

3. ⽹络分区:

○   在发⽣⽹络分区( ⽹络分裂) 的情况下, —部分节点可能与 主节点失去联系 。如果此时主节点继续处理写操作, 那么在⽹络恢复之前, 这些操作可能不会被复制到从节点。

4. 多个从节点同时故障:

○   如果所有的从节点同时故障或在故障转移之前与主节点失联, 那么在主节点故障时, 将没有可⽤的从节点来提升为主 节点。

1.4. 集群部署(Cluster

Redis 集群是 Redis 的—种分布式运⾏模式 它通过分⽚(sharding 来提供数据的⾃动分区和管理, 从⽽实现数据的⾼可⽤性和可扩展性。

在集群模式下, 数据被分割成多个部分(称为槽或slots), 分布在多个 Redis 节点上。

集群中的节点分为主节点和从节点:主节点负责读写请求和集群信息的维护从节点只进⾏主节点数据和状态信息的复制。

1.4.1. Redis集群的作⽤

数据分区:数据分区(或称数据分⽚)是集群最核⼼的功能 。 集群将数据分散到多个节点, —⽅⾯突破了Redis单机内存⼤⼩的限制, 存储容量⼤⼤增加;

另—⽅⾯每个主节点都可以对外提供读服务和写服务, ⼤⼤提⾼了集群的响应能⼒ 。 Redis单机内存⼤⼩受限问题, 在介绍持久化和主从复制时都有提及;

        例如, 如果单机内存太⼤, bgsavebgrewriteaoffork操作可 能导致主进程阻塞, 主从环境下主机切换时可能导致从节点⻓时 间⽆法提供服务, 全量复制阶段主节点的复制缓冲区可能溢出。

⾼可⽤: 集群⽀持主从复制和主节点的⾃动故障转移(与哨兵类); 当任—节点发⽣故时, 集群仍然可以对外提供服务。

1.4.2. Redis集群的数据分⽚

Redis集群引⼊了哈希槽的概念 Redis集群有16384个哈希槽(编0-16383 集群的每个节点负责—部分哈希槽 每个Key通过    CRC16校验后对16384取余来决定放置哪个哈希槽,

通过这个值, 去找到对应的插槽所对应的节点, 然后直接⾃动跳转到这个对应的节点上进⾏存取操作

        ●    以3个节点组成的集群为例: 节点A包含05460号哈希槽B包含546110922号哈希槽 节点C包含1092316383号哈 希槽

        ●   Redis集群的主从复制模型 集群中具有A B C三个节点,   果节点B失败了, 整个集群就会因缺少5461-10922这个范围的 槽⽽不可以⽤ 

为每个节点添加—个从节点A1 B1 C1整个集群便有三个Master 节点和三个slave节点组成, 在节点B失败后, 集群选举B1位为的  主节点继续服务 。当BB1都失败后, 集群将不可⽤

1.4.3. Reids 集群部署

 

1.4.3.1. redis 环境简述

Redis Cluster被配置为三主三从模式 。这意味着每台服务器上的 两个Redis节点中, —个节点作为主库( master), 另—个作为从库(slave 

1.4.3.2. redis 集群配置准备
-- 创建集群配置⽂件夹, 将下⾯的配置复制过去, 另外两个机器重 复这个过程
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster
vim ./cluster/redis_6379.conf
vim ./cluster/redis_6380.conf

-- 配置⽂件准备完成之后, 启动所有redis服务, ⽤cluster配 置⽂件
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf

-- 检查服务
ps aux | grep redis

-- 创建三主三从集群模式, 每—个主节点带—个从节点
redis-cli --cluster create --cluster-replicas 
192.168.75.129:6379 192.168.75.129:6380 
192.168.75.131:6379 192.168.75.131:6380 
192.168.75.132:6379 192.168.75.132:6380

-- 查看集群信息
redis-cli cluster info

-- 查看单个节点信息
redis-cli info replication

-- 查看集群节点身份信息
redis-cli cluster nodes

-- 停⽌redis服务
redis-cli -p 6379 shutdown
redis-cli -p 6380 shutdown

6379配置       

# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes

# 端⼝
port 6379
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6379.log"
# 集群配置⽂件
cluster-config-file nodes-6379.conf
# AOF⽂件名
appendfilename "appendonly6379.aof"
# RBD⽂件名
dbfilename "dump6379.rdb"

6380配置              

# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes

# 端⼝
port 6380
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6380.log"
# 集群配置⽂件
cluster-config-file nodes-6380.conf
# AOF⽂件名
appendfilename "appendonly6380.aof"
# RBD⽂件名
dbfilename "dump6380.rdb"

1.4.3.3. Redis 集群数据读写
-- 连接—个主节点进⾏写数据
redis-cli info replication
-- 直接连接读写可能会出现以下问题, 是因为不同的节点的槽位不 同, 图中就是提示我们去132:6379进⾏写⼊数据

 

-- 不过我们也可以开启路由规则  -c, 进⾏处理
 redis-cli -c
-- 重新写⼊数据, 恢复正常。
set k1 b1

1.4.3.4. 模拟故障转移 
-- 注意机器ip的区分
-- 将129机器的主节点给⼲掉(129的6379服务)
redis-cli -p 6379 shutdown
-- 查看129机器从节点⼯作⽇志(131的6380⽇志)
cat redis6380.log
-- 在切换到132机器上查看当前集群节点信息, 131:6380已经升 为主节点
redis-cli cluster nodes

 

-- 在重新启动129.6379服务
redis-server ./cluster/redis_6379.conf
-- 查看129.6379的节点信息, 主节点变为从节点 
redis-cli -p 6379 info replication
-- 观察131.6380⽇志, 129.6379 重新加⼊集群

 2. 完整的⽂件⽬录与配置⽂件与使⽤过程中的命令

 2.1. ⽂件⽬录

 ⼿⼯创建

/opt/software/redis/   -- Redis应⽤
/opt/software/redis/redis-stable -- Redis应⽤根⽬录
/opt/software/redis/cluster  -- Redis集群应⽤⽂件⽬录(⽇志, 快照等信息)
/opt/software/redis/redis-stable/cluster  -- Redi s集群配置⽂件存放路径

 

2.2. 配置⽂件

2.2.1. 单机Redis配置⽂件

所在⽬录:/opt/software/redis/redis-stable

   6379配置      

bind * -::*
protected-mode no port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /opt/software/redis/redis-stable/redis.log
databases 16
always-show-logo no set-proc-title yes
 proc-title-template "{title} {listen-addr} {serve r-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb   rdb-del-sync-files no
dir /opt/software/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled

repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb  aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0

set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

2.2.2. 主从节点配置

所在⽬录:/opt/software/redis/redis-stable

⼤家可以将不同服务器的端⼝设置不同的值, 以⽅便区分。

129.6379配置-主节点

与单机主节点配置—样

 131.6379配置-从节点                

bind * -::*
protected-mode no port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /opt/software/redis/redis-stable/redis.lo
g
databases 16
always-show-logo no set-proc-title yes
 proc-title-template "{title} {listen-addr} {serve r-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb   rdb-del-sync-files no
dir /opt/software/redis
replicaof 192.168.75.129 6379
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0

repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb  aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

 132.6379配置-从节点

131.6379配置—样 

2.2.3. 哨兵模式

所在⽬录:/opt/software/redis/redis-stable

主从配置⽆需修改, 直接配置 sentinel ⽂件, 3 机器配置相同

 26379      

protected-mode no port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
loglevel notice
logfile /opt/software/redis/redis-stable/sentine
l.log
dir /opt/software/redis
sentinel monitor mymaster 192.168.75.129 6379 2 sentinel down-after-milliseconds mymaster 30000 acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
SENTINEL master-reboot-down-after-period mymaste r 0

2.2.4. 集群

所在⽬录:/opt/software/redis/redis-stable/cluster 3 个机器配置相同

6379    

# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes

# 端⼝
port 6379
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6379.log"
# 集群配置⽂件
cluster-config-file nodes-6379.conf
# AOF⽂件名
appendfilename "appendonly6379.aof"
# RBD⽂件名
dbfilename "dump6379.rdb"

6380

# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes

# 端⼝
port 6380
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6380.log"
# 集群配置⽂件
cluster-config-file nodes-6380.conf
# AOF⽂件名
appendfilename "appendonly6380.aof"
# RBD⽂件名
dbfilename "dump6380.rdb"

 2.2.5. 命令

命令汇总

----------------------------------- Redis基础常见命 令  ------------------------------------
keys *:查看当前库所有的key
exists key:判断某个key是否存在
type key:查看key值是什么类型
del key:删除指定的key数据
unlink key:⾮阻塞删除, 仅仅将keys从keyspace元数据中删 除, 真正的删除会在后续异步中操作
ttl key:查看还有多少秒过期, -1表示永不过期, -2表示已过期
expire key:秒钟, 为给定的key设置过期时间
- move key dbindex[0-15]:将当前数据库的key移动到给定的 数据库db当中
 select dbindex:切换数据库[0-15], 默认值为0 dbsize:查看当前数据库key的数量
flushdb:清空当前库
flusshall:通杀全部库

----------------------------------- 完整的操作命令  ----------------------------------------
-- 关闭防⽕墙
systemctl stop firewalld.service -- 状态
firewall-cmd --state -- 卸载防⽕墙
yum remove firewalld

-------------------------- 单机部署  ---------------
-----------
-- 检查版本
gcc --version

-- 安装  gcc
yum install gcc

-- 安装应⽤养成良好习惯, ⽂件归类 mkdir -p /opt/software/redis

-- 进⼊redis⽂件夹, 使⽤wget下载 cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.g z

-- 解压下载的redis包
tar -xzf redis-stable.tar.gz

-- 进⼊redis-stable⽬录, 然后使⽤make install 编译并安 装, 安装完成后  /usr/local/bin 会⽣成相应的服务
cd redis-stable
make install

-- 检查是否成功⽣成  ll /usr/local/bin

Redis 源码路径下启动 ./src/redis-server

使⽤us r/local/bin 路径下启动( 该⽬录下) redis-server

-- 修改当前Redis⽬录下的  Reids.conf ⽂件 vim redis.conf
- 启动Redis,使⽤密码认证登录 redis-server redis.conf
redis-cli -a 1qaz@WSX

-- 退出redis quit

-- 关闭redis
redis-cli shutdown

-------------------------- 主从部署  ---------------
-----------
-- 主节点查看从节点信息 info Replication

-------------------------- 哨兵部署  ---------------
-----------
-- 可以杀掉主节点的进程, 也可以直接停掉主节点服务 ps aux | grep redis
redis-cli shutdown

-- 观察哨兵⽇志, 129 主节点下线, 重新选举131为主节点 tail -f sentinel.log

--重新启动  129 服务  并观察⽇志, 129加⼊主从, 此时主节点为 131服务
redis-server redis.conf

tail -f sentinel.log
redis-cli -p 26379 info sentinel

-- 观察哨兵⽇志
tail -f sentinel.log

-- 停⽌哨兵
redis-cli -p 26379 shutdown

-- 切换到131服务, 已经为主节点。 redis-cli info replication

-- 查看⽂件内容
cat redis.conf
cat sentinel.conf

-------------------------- 集群部署  ---------------
-----------
-- 创建集群配置⽂件夹, 将下⾯的配置复制过去, 另外两个机器重 复这个过程
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster
vim ./cluster/redis_6379.conf
vim ./cluster/redis_6380.conf

-- 配置⽂件准备完成之后, 启动所有redis服务, ⽤cluster配 置⽂件
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf
-- 检查服务
ps aux | grep redis

-- 创建三主三从集群模式, 每—个主节点带—个从节点
redis-cli --cluster create --cluster-replicas 1 1
92.168.75.129:6379 192.168.75.129:6380 192.168.7
5.131:6379 192.168.75.131:6380 192.168.75.132:637
9 192.168.75.132:6380

-- 查看集群信息
redis-cli cluster info

-- 查看单个节点信息
redis-cli info replication

-- 查看集群节点身份信息
redis-cli cluster nodes

-- 停⽌redis服务
redis-cli -p 6379 shutdown
redis-cli -p 6380 shutdown

-- 连接—个主节点进⾏写数据
redis-cli info replication

-- 注意机器ip的区分
-- 将129机器的主节点给⼲掉(129的6379服务) redis-cli -p 6379 shutdown
-- 查看129机器从节点⼯作⽇志(131的6380⽇志)
cat redis6380.log
-- 在切换到132机器上查看当前集群节点信息, 131:6380已经升 为主节点
redis-cli cluster nodes

-- 在重新启动129.6379服务
redis-server ./cluster/redis_6379.conf -- 查看129.6379的节点信息, 主节点变为从节点  redis-cli -p 6379 info replication
-- 观察131.6380⽇志, 129.6379 重新加⼊集群

三、Redis7核心数据结构

Red is7核心数据结构

3.1Redis7有那些数据结构?

核心板(core)

Bitmap 、Cluster management  、Connection management  、Generic  、Geospatial indices  、Hash  、HyperLogLog List  、Pub/Sub  、Scripting and functions  、Server managment  Set、Sorted set  、Stream  、String  、Transactions

扩展版

Stack

Bloom filter、Cuckoo filter、Count-min sketch、JSON、Search and query、Auto-suggest、

T-digest、Time series、Top-k

3.1.1 String 结构

3.1.1.1 字符串常用操作
•  字符串常用操作
SET  key value                                //存入字符串键值对
MSET  key value [key value ...]       //批量存储字符串键值对
SETNX  key value                          //存入一个不存在的字符串键值对
GET  key                                        //获取一个字符串键值
MGET  key  [key ...]                         //批量获取字符串键值
DEL  key  [key ...]                             //删除一个键
EXPIRE  key seconds                      //设置一个键的过期时间(秒)

•    原子加减
INCR  key                                       //将key中储存的数字值加1
DECR  key                                       //将key中储存的数字值减1
INCRBY  key  increment                                     //将key所储存的值加上increment
DECRBY  key  decrement                 //将key所储存的值减去decrement
3.1.1.2 String常见应用场景
•    单值缓存
SET  key  value              APPEND key value

•    对象缓存
1) set user:1 '{"name":"roy","balance":1888}'
2) MSET  user:1:name  roy user:1:balance  1888
MGET  user:1:name   user:1:balance

•     分布式锁
SETNX  product:10001 true                                //返回1代表获取锁成功
SETNX  product:10001 true                                //返回0代表获取锁失败
。 。 。 执行业务操作
DEL  product:10001                                            //执行完业务释放锁
SET product:10001 true  ex  10  nx    //防止程序意外终止导致死锁

3.1.2 Hash结构

 3.1.2.1 Hash常用操作 
•     Hash常用操作 
HSET  key  field  value                        //存储一个哈希表key的键值
HSETNX  key  field  value    //存储一个不存在的哈希表key的键值 
HMSET  key  field  value [field value ...] //在一个哈希表key中存储多个键值对
HGET  key  field    //获取哈希表key对应的field键值
HMGET  key  field  [field ...]   //批量获取哈希表key中多个field键值

HDEL  key  field  [field ...]   //删除哈希表key中的field键值
HLEN  key  //返回哈希表key中field的数量
HGETALL  key  //返回哈希表key中所有的键值
HINCRBY  key  field  increment  //为哈希表key中field键的值加上增量increment








3.1.2.2 Hash常见应用场景
(1)对象缓存
•    对象缓存
HSET  user:1  name roy balance  1888
HMGET  user:1  name  balance  1888


HSET  user  1:name roy 1:balance  1888
HMGET  user  1:name  1:balance

(2)电商购物车

•     电商购物车
1) 以用户id为key
2) 商品id为field
3) 商品数量为value


•    购物车操作
1)    添加商品-> hset cart:1001 10088 1
2)    增加数量-> hincrby cart:1001 10088 1
3)    商品总数-> hlen cart:1001
4)    删除商品-> hdel cart:1001 10088
5)    获取购物车所有商品-> hgetall cart:1001

3.1.2.3 Hash结构优缺点

•    优点
1) 同类数据归类整合储存, 方便数据管理
2) 相比string操作消耗内存与cpu更小
3) 相比string储存更节省空间

•     缺点
1)    过期功能不能使用在field上, 只能用在key上
2)    Redis集群架构下不适合大规模使用

3.1.3 List 结构

3.1.3.1 List常用操作
LPUSH  key  value [value ...]	//将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]	//将一个或多个值value插入到key列表的表尾(最右边)
LPOP key	//移除并返回key列表的头元素
RPOP key	//移除并返回key列表的尾元素
LRANGE  key  start  stop	//返回列表key中指定区间内的元素, 区间以偏移量start和stop指定
BLPOP  key  [key ...]  timeout	//从key列表表头弹出一个元素, 若列表中没有元素, 阻塞等待
timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout	//从key列表表尾弹出一个元素, 若列表中没有元素, 阻塞等待
timeout秒,如果timeout=0,一直阻塞等待
3.1.3.2 List类型应用场景

•    常用数据结构
Stack(栈) = LPUSH + LPOP
Queue(队列)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP
•    常见应用场景
视频列表 、签到列表 排队机
简化版的MQ


3.1.3.3 List类型注意点

1) 一个list的容量是2的32次方减1个元素, 大概40多亿。 但是在应用时, 要注意大key的问题。
2) list的底层是一个双向链表, 对双端的操作性能很高。 但是通过索引下表直接操作某一 个中间节点的性能就会比较低。

3.1.4 Set类型

 3.1.4.1  Set常用操作
 •    Set常用操作
SADD  key  member  [member ...]	//往集合key中存入元素, 元素存在则忽略,若key不存在则新建
SREM  key  member  [member ...]	//从集合key中删除元素
SMEMBERS  key	//获取集合key中所有元素
SCARD  key	//获取集合key的元素个数
SISMEMBER  key  member	//判断member元素是否存在于集合key中
SRANDMEMBER  key  [count]	//从集合key中选出count个元素, 元素不从key中删除
SPOP  key  [count]	//从集合key中选出count个元素, 元素从key中删除
Set运算操作
SINTER  key  [key ...]	//交集运算
SINTERSTORE destination  key  [key ..]	//将交集结果存入新集合destination中
SUNION  key  [key ..]	//并集运算
SUNIONSTORE destination  key  [key ...]	//将并集结果存入新集合destination中
SDIFF  key  [key ...]	//差集运算
SDIFFSTORE destination  key  [key ...]	//将差集结果存入新集合destination中
3.1.4.2 Set应用场景

(1) 微信抽奖小程序


1) 点击参与抽奖加入集合 
    SADD key {userlD}
2) 查看参与抽奖所有用户 
    SMEMBERS key
3) 抽取count名中奖者 
    SRANDMEMBER key [count] / SPOP key [count]


(2)微信微博点赞, 收藏, 标签


1) 点赞
    SADD  like:{消息ID}  {用户ID}
2) 取消点赞
    SREM like:{消息ID}  {用户ID}
3) 检查用户是否点过赞
    SISMEMBER  like:{消息ID}  {用户ID}
4) 获取点赞的用户列表
   SMEMBERS like:{消息ID}
5) 获取点赞用户数
   SCARD like:{消息ID} 

(3)集合操作
SINTER set1 set2 set3  { c }    共同关注的人
SUNION set1 set2 set3  { a,b,c,d,e }   朋友圈的人 
SDIFF set1 set2 set3  { a }  推荐好友 

3.1.5 Z Set有序列表类型 

3.1.5.1 ZSet常用操作 

•    ZSet常用操作
ZADD key score member [[score member]…]     //往有序集合key中加入带分值元素
ZREM key member [member …]                        //从有序集合key中删除元素
ZSCORE key member                                         //返回有序集合key中元素member的分值
ZINCRBY key increment member                       //为有序集合key中元素member的分值加上increment
ZCARD key                                                       //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]             //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]       //倒序获取有序集合key从start下标到stop下标的元素
•    Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...]   //并集计算
ZINTERSTORE destkey numkeys key [key …]    //交集计算

3.1.5.2 Z Set应用场景

•    Zset集合操作实现排行榜
1) 点击新闻
ZINCRBY  hotNews:20190819  1  守护香港
2) 展示当日排行前十
ZREVRANGE  hotNews:20190819  0 9 WITHSCORES
3) 七日搜索榜单计算
ZUNIONSTORE  hotNews:20190813-20190819  7
hotNews:20190813  hotNews:20190814... hotNews:20190819 
4) 展示七日排行前十
ZREVRANGE hotNews:20190813-20190819  0  9  WITHSCORES 

3.1.6 Bitmap类型


3.1.6.1 Bitmap常用操作 
•     Bitmap常用操作

SETBIT key offset value                   //将一个二进制数组的offset位置设置成value。value只能是0或者1。
GETBIT key offset                            //返回一个二进制数组的offset位置的值。
BITCOUNT key [start end [BYTE|BIT]] //返回二进制数组中1的个数
BITPOS key bit [start [end [BYTE|BIT]]] //返回bitmap中第一个值为bit的offset位置。
BITOP AND|OR|XOR|NOT destkey key [key ...] //对两个bitmap做二进制的与或非计算。
3.1.6.2 Bitmap应用场景
•     每 日签到
SETBIT dailycheck:1  100 1    1号用户第100天完成了签到

BITCOUNT dailycheck:1   统计1号用户的签到次数

BITPOS dailycheck:1  统计1号用户第一天签到的时间

•    优点
快速、 高效、 节省空间

3.1.7 Hyperloglog类型


3.1.7.1  作用介绍:


        用于统计一个集合中不重复的元素个数。
        典型应用场景例如根据用户访问记录统计网站的UV。


3.1.7.2 Hyperloglog常用操作
PFADD visitlog 192.168.65.111 192.168.65.112 192.168.65.111   //添加用户访问记录
PFCOUNT visitlog                          //统计不同的独立访客

3.1.7.3 Hyperloglog其他操作

 
PFMERGE destkey [sourcekey [sourcekey ...]]   //将多个hyperloglong数据整合成一条记录。

3.1.8 Geo类型

3.1.8.1 Geo常用操作
 常用操作

GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]    //添加一个或多个地点
GEOPOS key [member [member ...]]                                    //返回地址的经纬度
GEODIST key member1 member2 [M|KM|FT|MI]  //计算两个地点之间的距离
GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key|STOREDIST key]         //查询某个经纬度地址附近的地点
GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius
M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]                                             //查询某个地点附近的地点
3.1.8.2 Geo应用场景 

•     获取经纬度
https://api.map.baidu.com/lbsapi/getpoint/index.html
•    添加商家地址
GEOADD changsha 113.017489 28.200454 火车站
112.96903 28.201195 橘子洲 113.017031 28.199706 赛格广 场 113.017004 28.197677 国储
•     查询距离
GEODIST changsha 火车站 橘子洲 M
•    查找火车站附近的景点
GEORADIUSBYMEMBER changsha 火车站 2 KM withdist withcoord count 4 withhash

3.1.9 stream类型


3.1.9.1  作用介绍


•    作用介绍:
Redis版的MQ -- 阻塞队列 + pub/sub
了解即可, 企业应用比较少。


3.1.9.2 stream常用操作

•     常用操作
XADD key [NOMKSTREAM] [MAXLEN|MINID [= |~] threshold [LIMIT count]] *|id field value [field value ...]
            //往对列的末尾发布一条消息
XDEL key id [id ...]    // 删除队列中的一条消息
XLEN key    //获取队列的长度
XRANGE key start end [COUNT count]    //查询队列中的消息

3.1.9.3 stream常用操作
stream应用示例

•    创建队列, 并添加消息 *表示让系统自动生成ID
XADD mystream * name loulan name roy name admin
•     查看对列消息- 对列开始 + 对列结尾
XRANGE mystream - +
•    创建消费者组  0 从队列头部开始消费。 $ 从队列尾部开始消费
XGROUP CREATE mystream groupA 0
•     消费消息 > 表示从第一条未被消费过的消息消费。 也可以指定ID
XREADGROUP GROUP groupA consumer1 count 2 STREAMS mystream >
•    查看消费者组的消费进度
XPENDING mystream groupA


3.2补充

3.2.1补充:SpringBoot集成Redis


Maven依赖:
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifact Id>spring-boot-starter-data-red is</artifact Id>

</dependency>

核心配置:

spring:
data:
red is:
host: 192.168.65.214
port: 6379
password: 123qweasd
......

3.2.2补充: RestTemplate快速上手


记住一个对象:
@Resource
private Red isTemplate<String,Object> red isTemplate;

按组操作
red isTemplate.opsForValue().xxx  //string类型
red isTemplate.opsForSet().xxx  //set类型
red isTemplate.opsForHash().xxx  //hash类型
red isTemplate.opsForList().xxx  //list类型
red isTemplate.opsForZset().xxx  //Zset类型
red isTemplate.opsForGeo().xxx  //Geo类型
red isTemplate.opsForHyperLogLog().xxx  //hyperLogLog类型
red isTemplate.opsForStream().xxx  //stream类型

red isTemplate.opsForValue().set Bit() //bit类型 为什么bit没有一个单独的操作类型?

3.2.3补充: RedisTemplate中文乱码问题

@Bean
public Red isTemplate<String,Object> red isTemplate(RedisConnectionFactory redisConnectionFactory){ Red isTemplate<String, Object> red isTemplate = new Red isTemplate<>();
red isTemplate.setConnectionFactory(redisConnectionFactory);
//        GenericJackson2JsonRed isSerializer jsonSerializer = new GenericJackson2JsonRed isSerializer();
StringRed isSerializer stringRed isSerializer = new StringRed isSerializer();
GenericToStringSerializer<String> genericToStringSerializer = new GenericToStringSerializer<>(String.class);
//指定key和value的序列化方式
red isTemplate.set KeySerializer(stringRed isSerializer);
red isTemplate.setValueSerializer(genericToStringSerializer);
red isTemplate.setHashKeySerializer(stringRed isSerializer);
red isTemplate.setHashValueSerializer(stringRed isSerializer);

red isTemplate.afterPropertiesSet();
return red isTemplate; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值