Redis的简介
一、Redis介绍
Redis是典型的NoSQL,非关系型数据库,结构类型是Key-Value结构。数据存在内存里,持久化在硬盘里,平时操作的数据都在内存中,效率特别高,一般作为缓存来使用。
Redis以slot(槽)作为存储单元,没有固定大小,只有固定个数,一共有16384个槽(crc16算法 0-16383),当做Redis集群时,不论几个集群都是16384个槽。
同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。
优点:有命令集,查询效率高速度快。
缺点:没有批量数据操作,不如分页查询。
二、使用Redis作为缓存工具时流程(写代码时思路)
- 应用程序向Redis查询数据
- 判断Key是否存在
- 是否存在
1)存在
a. 把结果查询出来
b. 返回数据给应用程序
2)不存在
a. 向MySQL查询数据
b. 把数据返回给应用程序
c. 把结果缓存到Redis中
三、持久化策略
- RDB(Redis DataBase)默认模式
内存快照存储,rdb快照文件小,覆盖式的存储,效率高,但是当频率不达标,断电会丢失数据。
save 持久化设置
save 900 1 900秒内1次写数据 保存一次
save 300 10 300秒内10次写数据 保存一次
save 60 10000 60秒内10000次写数据 保存一次
两种方案:同步(手动)和异步(默认) ,同步在写入快照时对外操作停止,异步可以操作。异步操作要两倍空间物理内存。 - AOF(AppendOnly File)
AOF默认是关闭的,appendonly no ,用文件来记录命令流程,每一秒钟向文件中追加这一秒的命令,加载后会读取命令,然后逐条执行命令,时间越长恢复的越慢。
AOF的优先级高于RDB。
Redis的安装
一、安装在Linux的两种方式
1、直接在Linux中安装
2、在Linux中使用Docker容器安装 安装文档
二、在Linux中安装Redis
1.安装依赖C语言依赖
yum install -y gcc-c++ automake autoconf libtool make tcl
2.上传并解压
Redis-6.2.6-Linux压缩包
提取码:zh01
把redis安装包上传到 /usr/local/tmp
进入文件夹
mkdir /usr/local/tmp
cd /usr/local/tmp
解压文件
tar -zxf redis-6.2.6.tar.gz
3.编译并安装
进入解压文件夹
cd redis-6.2.6
编译
make
安装,PREFIX表示把软件安装到哪个文件夹中
make install PREFIX=/usr/local/redis
4.开启守护进程
复制配置文件到安装目录
cp /usr/local/tmp/redis-6.2.6/redis.conf /usr/local/redis
进入安装文件夹
cd /usr/local/redis
修改配置文件
vim redis.conf
bind 可访问的客户端,想远程需要注释
protected-mode yes改为no 保护模型
daemonize no改为yes 精灵进程 会有进程描述文件 默认在/var/run/redis_6379.pid
logfile 日志文件自己配置 默认在/dev/null 黑洞目录写进去就消失
databases 16 数据库个数,默认访问0号数据库
save 持久化设置
save 900 1 1秒内900次写数据 保存一次
save 300 10 10秒内300次写数据 保存一次
save 60 10000 10000秒内60次写数据 保存一次
加载配置文件启动
bin/redis-server redis.conf
查看后台启动
ps aux | grep redis
启动客户端
bin/redis-cli
关闭redis
强杀 尽量不用 会丢失数据
优雅关机
bin/redis-cli shutdown
Redis的使用
一、value常用类型:
- String 字符串
- Hash 哈希表
- List 列表
- Set 集合
- Sorted Set 有序集合(zSet)
连接到redis
bin/redis-cli
测试是否可用
输入 ping
回应 pong
输入 echo “test”
回应 “test”
在字符串中如果有空格 必须要有双引号代表边界
二、Redis中文命令文档
命令不区分大小写 但存入的数据区分大小写
String 字符串
存入:set [key] [value]
查看:get [key]
存入不存在的:setnx [key] [value] ,key必须不存在 如果存在忽略本次操作
存入存活有效时长的:setex [key] [存活秒数] [value]
查看含有的key:keys [key] ,或:keys * ,没有返回-2
查看存活剩余时间:ttl [key]
查看有几个key存在:exists [key] [key] ,key可以有很多个 只会返回有几个存在 不会声明哪个存在
为一个存在的key设置存活时间:expire [key] [存活秒数]
手动删除key:del [key] [key] , key可以是一个也可以是多个 返回删除个数 没有返回0
存入多个key-value:mset [key] [value] [key] [value] ,必须成对
查看多个值:mget [key] [key] ,key可以是一个也可以是多个
删除key的有效时长:persist [key] ,返回删除成功的个数
Hash Hash表 结构 map(String,map(key,value))
存入hash表:hset [key] [field] [value] ,field 是第二个map中的key
查看key中field的值:hget [key] [field]
查看key中的field:hkeys [key]
查看key中的value:hvals [key]
查看key中的所有map对:hgetall [key]
存入完整的键值对:hmset [key] [field] [value] [field] [value] ,field和value成对出现
查看多个field对应的value:hmget [key] [field] [field]
删除key中的一个map:hdel [key] [field] ,删除所有的field,key自动删除
List 列表
存入列表数据:rpush [key] [value value] ,key相同会把第二次存入的数据加到末尾
存入列表数据:lpush [key] [value value] ,key相同会把第二次存入的数据加到开头
查看列表数据:lrange [key] [开始下标] [结束下标]
lrange [key] 0 -1 查看列表所有数据
lrange [key] -2 -1 查看从末尾开始的两数据
删除列表中的值:数值代表删除的个数和前后
lrem [key] 1 [value] ,从前删一个 ,lrem [key] 2 [value] ,从前删除两个
lrem [key] -1 [value] ,从后删一个
Set 集合
存入集合:sadd [key] [value value] ,重复数据不添加
查看所有:smembers [key] ,只能查看所有
查看数据条数:scard [key]
删除数据:srem [key] [value]
Sorted Set 有序集合(zSet)
存入数据:zadd [key] [分数] [value] ,按分数排序 分数相同按照字母顺序排列,分数不同按照分数排序,值相同会根据分数重新排序
查看数据:zrange [key] 0 -1
查看长度:zcard [key]
删除元素:zrem [key] [value] ,value可以是多个
Redis集群
一、Redis主从复制(安全性扩展)
每个节点可以有多个复制品,其中一个复制品是主(master),另外的复制品是从(Slave),一主多从。
在redis主从模型是只有主(Master)具备写的能力,从(Slave)只能读。如果主宕机,整个节点就不具备写能力。
1. 使用单个Linux多次启动搭建主从
- 创建集群文件夹
cd /usr/local
mkdir redis-replica
- 复制redis到集群文件夹中
cp -r redis redis-replica/
cd redis-replica/
- 需要删除快照文件,然后复制配置文件后修改配置。
cd redis
rm -rf dump.rdb
cp redis.conf redis-6001.conf
vim redis-6001.conf
- 修改端口号和文件名
port 6001
dbfilename dump-6001.rdb
修改后复制多个,再次修改配置文件
cp redis-6001.conf redis-6002.conf
port 6002
dbfilename dump-6002.rdb
replicaof [主机ip] [主机端口] ,备份需要加上这个配置
cp redis-6001.conf redis-6003.conf
port 6003
dbfilename dump-6003.rdb
replicaof [主机ip] [主机端口] ,备份需要加上这个配置
- 启动多个redis
bin/redis-server redis-6001.conf
bin/redis-server redis-6002.conf
bin/redis-server redis-6003.conf
- 测试主从
bin/redis-cli -p [端口号]
info replication
可以看到当前的主从状态。
这时主机器down(宕机),从机器不会自动切换为主机器,从机器是只读的。
- 为了启动方便可以编写脚本文件
在redis文件夹中关闭所有启动的redis
bin/redis-cli -p 6001 shutdown
查看运行中的redis项
ps aux | grep redis
关闭所有后,编写脚本文件
启动脚本
vim startup.sh
bin/redis-server redis-6001.conf
bin/redis-server redis-6002.conf
bin/redis-server redis-6003.conf
脚本如果没有权限可以授予权限
chmod 755 startup.sh
停止脚本
vim shutpdown.sh
bin/redis-cli -p 6001 shutdown
bin/redis-cli -p 6002 shutdown
bin/redis-cli -p 6003 shutdown
脚本如果没有权限可以授予权限
chmod 755 shutdown.sh
二、哨兵(Sentinel)
Redis的哨兵就是帮助监控整个节点的,当主宕机等情况下,帮助重新选取主。
在主从模型中,主宕机,整个节点不具备写能力的情况下,哨兵可以帮助节点来使其重新选取主,以具备写能力。
Redis中哨兵支持单哨兵和多哨兵,单哨兵是只要这个哨兵发现master宕机了就直接选取另一个master。而多哨兵是根据我们设定,达到一定数量的哨兵认为master宕机后才会进行重新选取主。
单哨兵时,会发生哨兵连接不上redis主,但客户端可以,这时哨兵会把一个redis从升级为主,这时客户端会同时有两个主能写入,在备份的时候就有可能发生数据丢失。
1.部署Redis哨兵
- 基于主从模型创建哨兵
- 创建哨兵目录
mkdir /usr/local/redis-sentinel
- 复制redis到当前文件夹
cp /usr/local/redis ./ -r
- 进入redis,删除除了bin以外的所有配置文件
cd redis/
rm -rf dump.rdb
rm -rf redis.conf
- 复制原始配置文件
cd /usr/local/tmp/[解压后的redis文件名]
cp sentinel.conf /usr/local/redis-sentinel/redis
- 编辑哨兵配置文件
mv sentinel.conf sentinel-6101.conf
vim sentinel-6101.conf
修改端口号,精灵进程,进程描述文件,日志文件,备份节点数量
port 6101
daemonize yes
pidfile /var/run/redis-sentinel-6101.pid
logfile “/var/sentinel-6101.log”
sentinel monitor mymaster [redis IP] [端口号] [备份数量]
哨兵的名字是mymaster,可以改 但是下面会有 也要改统一
- 复制多个配置文件
改端口号,进程描述文件,日志文件
cp sentinel-6101.conf sentinel-6102.conf
vim sentinel-6102.conf
cp sentinel-6101.conf sentinel-6103.conf
vim sentinel-6103.conf
- 启动三个哨兵
cd /usr/local/sentinel
./redis-sentinel sentinel-6101.conf
./redis-sentinel sentinel-6102.conf
./redis-sentinel sentinel-6103.conf
可以自己弄个启动脚本。
vim start-sentinel.sh
复制进脚本
./redis-sentinel sentinel-6101.conf
./redis-sentinel sentinel-6102.conf
./redis-sentinel sentinel-6103.conf
查看启动的哨兵
ps aux | grep redis-sentinel
- 测验哨兵
进入目录
cd /usr/local/redis
bin/redis-cli -p 6001
查看当前状态
info replication
结果是当前为主节点,从节点两个
role:master
connected_slaves:2
关闭主节点
cd /usr/local/redis
bin/redis-cli -p 6001 shutdown
连接6002
bin/redis-cli -p 6002
查看当前6002的状态
info replication
状态为
role:master
connected_slaves:1
然后测试读写
set a b
get a
再次启动主从文件夹的6001
cd /usr/local/redis-replica/redis/
bin/redis-server redis-6001.conf
查看老的主节点状态
bin/redis-cli -p 6001
查看状态
info replication
状态为
role:slave
master_port:6002
查看备份
get b
存入数据
set c c
提示只读
这种情况就是高可用
2.高可用介绍
高可用指的是当有备份情况发生时,主节点离线,不影响任何使用。
如果把备份扩展一下就是集群,在集群情况下,任意节点宕机时,不影响任何服务的提供。
可以查看sentinel的日志文件
cd /var
ls | grep sentinel
more sentinel-6101.log
空格查看下一页
三、集群
1.集群原理
- 集群搭建完成后由集群节点平分(不能平分时,前几个节点多一个槽)16384个槽。
- 客户端可以访问集群中任意节点。所以在写代码时都是需要把集群中所有节点都配置上。
- 当向集群中新增或查询一个键值对时,会对Key进行Crc16算法得出一个小于16384值,判断值在哪个节点上,然后就操作哪个节点。
2.搭建集群
目的:扩容、提升性能。
集群不需要哨兵,自动切换。但是节点需要哨兵,判断单个节点的主从,防止主宕机,这个节点不能用。
搭建集群为了安全性考虑,最少需要6台机器。
- 创建集群文件夹
cd /usr/local
mkdir redis-cluster
- 复制redis到文件夹中,并删除rdb文件
cp redis redis-cluster/ -r
cd redis-cluster/redis
rm -rf dump.rdb
- 修改配置文件,并复制多个。
mv redis.conf redis-7001.conf
vim redis-7001.conf
开启cluster-enabled,修改端口号,修改pidfile和日志文件地址,
cluster-enabled yes
port 7001
pidfile /var/run/redis-7001.pid
logfile “/var/redis-cluster-7001.log”
cluster-config-file nodes-7001.conf 同一个文件夹下启动6次需要配置。
cluster-node-timeout 15000 默认值15秒,确认超时,可以不配置。
复制多个
cp redis-7001.conf redis-7002.conf
cp redis-7001.conf redis-7003.conf
cp redis-7001.conf redis-7004.conf
cp redis-7001.conf redis-7005.conf
cp redis-7001.conf redis-7006.conf
修改其中的端口号,快照文件名,修改pidfile和日志文件地址,
port 7002
dbfilename dump-7001.rdb
pidfile /var/run/redis-7002.pid
logfile "/var/redis-cluster-7002.log
cluster-config-file nodes-7002.conf
其他的配置文件也要修改。
可以使用全文替换
:%s/7001/7003/g
- 启动redis
编写启动脚本
vim startup.sh
把代码复制进脚本
bin/redis-server redis-7001.conf
bin/redis-server redis-7002.conf
bin/redis-server redis-7003.conf
bin/redis-server redis-7004.conf
bin/redis-server redis-7005.conf
bin/redis-server redis-7006.conf
给脚本授权
chmod 755 startup.sh
启动脚本
./startup.sh
查看启动的redis
ps aux | grep redis
- 用命令开启集群
./redis-cli --cluster create [ip:7001] [ip:7002] [ip:7003] [ip:7004] [ip:7005] [ip:7006] --cluster-replicas 1
ip建议设置为静态ip,ip改变集群失效
执行完命令后,询问是否按照当前配置创建集群,输入yes 而不是y。
- 测试集群
bin/redis-cli -p 7001 -c
端口号可以是集群中的任意一个
一定要加 -c 代表连接的是一个集群
set a a
set b b
set c c
get a
get b
get c
- 关闭所有redis
编写关闭脚本
vim shutdown.sh
复制命令到脚本中
bin/redis-cli -p 7001 shutdown
bin/redis-cli -p 7002 shutdown
bin/redis-cli -p 7003 shutdown
bin/redis-cli -p 7004 shutdown
bin/redis-cli -p 7005 shutdown
bin/redis-cli -p 7006 shutdown
授权关闭脚本
chmod 755 shutdown.sh
启动脚本关闭
./shutdown.sh