一、概述
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。、
二、作用
缓存:Redis常被用作应用程序的缓存层,以提高数据访问速度。通过将热点数据或频繁访问的数据存储在Redis中,可以减少对数据库的访问次数,从而提升应用的性能。
数据库:Redis也可以用作一个轻量级的数据库,尤其是在需要高速读写和持久化的场景下。例如,Redis常被用于实现会话管理、用户信息存储、排行榜、计数器等功能。
消息代理:Redis提供了发布/订阅模式以及List数据结构,可以实现消息的发布和订阅功能。这使得Redis能够作为一个消息代理,用于实现消息队列、实时通知等功能。
分布式锁:Redis的setnx命令可以实现分布式锁的功能,确保在分布式系统中对共享资源的访问是安全的。
计数器:Redis的原子操作特性使其非常适合实现计数器功能。例如,可以用Redis来记录网站的访问量、API接口的调用次数等。
数据结构和算法实现:Redis支持丰富的数据结构,如字符串、哈希、列表、集合和有序集合,使得开发者可以利用Redis实现各种数据结构和算法,从而简化开发过程。
实时系统:Redis的快速读写性能使其成为实时系统的理想选择。例如,在实时分析、在线游戏、实时推荐等场景中,Redis可以确保数据的实时更新和查询。
限流:Redis可以通过Lua脚本结合其数据结构实现限流功能,防止系统在高并发场景下因流量过大而崩溃。
三、安装配置
安装redis之前需要先安装gcc环境
通过yum安装:
yum -y install gcc-c++
下载地址推荐:redis各个版本下载地址
我这里用虚拟机演示
将下载下来的文件上传到虚拟机,并进行解压
进入到redis-7.4.0
进行编译和安装,采用默认安装,则安装到了usr/local下
redis的启动,需要读取配置文件来启动服务端
对其进行一个拷贝,然后对得到的文件进行一个修改,允许后台运行
requirepass 设置密码 我这里设为root
端口 默认6379
启动redis服务端
启动客户端 -a 表示auth认证
测试 ping===>pong启动成功
四、redis十大数据类型讲解
对key的常用操作
(一)、String
批量添加和获取
获取、设置key中指定范围的值
数值增减
获取长度和内容追加
(二)、List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)它的底层实际是个双端链表,最多可以包含 2^32-1 个元素(4294967295,每个列表超过40亿个元素)
特点:单key 多value,如果键不存在,创建新的列表;如果键已经存在,则新增内容,如果值全部移除,对应的键也会消失
应用场景:微信公众号订阅:订阅了的公众号更新就放入我的订阅号
(三)、hash
kv模式,v是一个键值对
应用场景
(四)、Set
特点:单值,多value,无重复 ,无序
应用场景
(五)、Zset
应用场景:排行榜
(六)、bitmap位图
(七)、HyperLogLog(基数统计)
(八)、GEO地理空间 --Zset的子类
score---换成了经纬度
(九)、Sream流
(十)、bitfields位域
五、持久化
(一)RDB(redis database)
rdb持久性以指定的时间间隔执行数据集的时间点快照,就是把某一时刻的数据和状态以文件的形式写到磁盘上。保证数据的持久化
修改配置文件,开启rdb ,自动触发
持久化文件名 默认
手动触发
优缺点:
RDB 是 Redis 数据的一个非常紧凑的单文件时间点表示。RDB 文件非常适合备份。例如,您可能希望在最近的 24 小时内每小时归档一次 RDB 文件,并在 30 天内每天保存一个 RDB 快照。这使您可以在发生灾难时轻松恢复不同版本的数据集。RDB 非常适合灾难恢复,它是一个可以传输到远程数据中心或AmazonS3(可能已加密)的压缩文件。
RDB 最大限度地提高了 Redis 的性能,因为 Redis 父进程为了持久化而需要做的唯一工作就是派生一个将完成所有其余工作的子进程。父进程永远不会执行磁盘 I/0 或类似操作。与 AOF 相比,RDB 允许使用大数据集更快地重启。在副本RDB 支持重启和故障转移后的部分重新同步
如果您需要在 Redis 停止工作时(例如断电后)将数据丢失的可能性降到最低,那么 RDB 并不好。您可以配置生成 RDB 的不同保存点(例如,在对数据集至少5分钟和 100 次写入之后,您可以有多个保存点)。俄是,您通常会每五分钟或更长时间创建一次 RDB快照,因此,如果 Redis 由于任何原因在没有正确关闭的情况下停止工作,您应该准备好丢失最新分钟的数据。
RDB 需要经常 fork0 以便使用子进程在磁盘上持久化。如果数据集很大,fork0 可能会很耗时,并且如果数据集很大并且 CPU 性能不是很好,可能会导致 Redis 停止为客户端服务几毫秒甚至一秒钟。AOF 也需要 fork0 但频率较低,您可以调整要重写日志的频率,而不需要对持久性进行任何权衡。
检查修复dump.rdb文件:
禁用快照
配置文件讲解
(二)、AOF(appendonly)
根据不同的写回策略,将写命令写进磁盘(同步写回)
优势
劣势
六、redis事务
七、管道
八、发布订阅
九、redis复制(replica)
就是主从复制,master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其他slave数据库
作用:
环境搭建:一主二从
配置文件编写
主:
从机,多两个配置,即配置从机和主机之间的联系,端口一个为6380,一个为6381
复制缺点
十、redis哨兵
哨兵参数配置
配置sentinel.conf文件
首先启动master和slaver, 之后模拟master宕机
启动三位哨兵
master宕机
此时slaver1上位成为master
注意!将原来节点的masterauth配置进去,否则重启oldmaster加入新的节点后会连接不上新的master节点。
十一、集群
(一)、槽位slot
crc16算法
(二)、redis分片
(三)、slot槽位映射算法
1、哈希取余分区
2、一致性哈希算法
优点:容错性、可扩展性
缺点:会导致数据倾斜问题(节点较少时某个节点数据很多,其他节点数据很少)
3、哈希槽算法
哈希槽实质就是一个数组,数组[0,2^14-1]形成hash slot空间。
(四)、搭建集群 (三主三从)
1、编写配置文件
2、启动6个redis实例
查看一下:
3、创建集群
登录一台客户端:通过cluster nodes查看节点信息
此时因为是集群操作,不同节点分配到了不同节点,所以在登录时候加-c路由,就不用去找对应的节点去插入数据,而是类似重定向方式插入
为配置路由
配置后
4、扩容和缩容
再启动两个节点实例,此时这两个实例不属于集群,两个都是master
将6385这个节点作为master加入原集群
查看集群节点情况
为6387节点分配槽位
检查集群节点情况,此时已经分配了槽位
分配从机
查看节点状况
缩容
删除从机
重新将6385的槽位分配给6379
删除6385
再次查看集群节点状态发现已经变为三主三从
至此集群操作完成