Redis
文章内容主要参考b站 运维实战课程 的redis视频:redis的课程介绍_哔哩哔哩_bilibili
简介
1.Redis是一个缓存数据库,主要是做缓存。什么是缓存?也就是缓冲存储,也可以理解为挡箭牌,对后面的一个保护—般放在mysql/oracle等数据库前面,对数据库进行一个保护。用户请求数据时候,第一次先请求redis,redis里没有,就请求后台mysqal数据库,返回数据时候会存放到redis里一份缓存起来,当下一次请求同样数据时候,就可以直接青求redis拿到数据,防止了对数据库的频繁访问,减轻后台数据库的压力
2.Redis是一种内存型的nosql数据库,一般是用来缓存加速的,并且能够支持数据持久化存储的设置,可以将数据持久化到硬盘里面3.Redis存储数据的方法是以key-value的形式
4.Redis数据类型支持字符串、列表、哈希等多种类型
Redis的源码编译安装
安全前的环境准备:
Centos7 关闭防火墙 关闭selinux 配置好阿里yum仓库
1.安装编译工具yum install -y vim lrzsz gcc gcc-c++ make cmake tar openssl openssl-devel2.解压提前下载好tar.gz源码包tar -zxvf redis-6.2.13.tar.gz -C /usr/local/ //解压mv /usr/local/redis-6.2.13 /usr/local/redis cd /usr/local/redismake && makeinstallredis-server -vcp redis.conf /etc///如果系统都一样,没必要每台都编译安装,在一台上编译安装后,只需将编译好的二进制文件((/usr/local/ bin/redis-*)拷贝到其他服务器即可
配置优化
cp /etc/redis.conf /etc/redis.conf.bak //备份文件sed -i '/^#/d;/^$/d' /etc/redis.conf //删除注释空行vim /etc/redis.conf //修改如下参数bind 0.0.0.0port 6379dir /data/redisrequirepass redispwd //添加pidfile "redis.pid"logfile "redis.log"daemonize yes
1.启动mkdir -p /data/redisredis-server /etc/redis.confnetstat -tunlp | grep 6479cat /data/redis/redis.log //查看日志 内存尽量2G以上2.修改文件vim /etc/security/limits.conf * - nofile 65535 //添加vim /etc/sysctl.confnet.core.somaxconn = 10240vm.overcommit_memory = 1 sysctl -p //使上述配置生效3.配置系统vim /usr/lib/systemd/system/redis.service [Unit]Description=redis-serverAfter=network.target[Service]Type=forkingExecStart=/usr/local/bin/redis-server /etc/redis.confPrivateTmp=true[Install]WantedBy=multi-user.target
基本操作
1.redis-cli使用和认证登录redis-cli -h ip //无密码redis-cli -a password //登录+认证2.redis常用数据类型字符串列表、集合hash、发布和订阅3.redis字符串操作set name xux //增加key并赋值keys * //显示所有的keyget name //获取key的值set name xuxu //重新给key赋值del name //删除key//大小写问题命令不区分大小写key区分大小写set name cccset Name xxx//非交互式操作redisredis-cli -a password set name xuxuxuredis-cli -a password get name//使用shell批量写入数据并获取for i in $(seq -w 10);do redis-cli -a 123456 set name${i} test${i};done4.redis列表和集合的基本操作4.1 redis列表特点:列表是有顺序的 可写入重复的数据如:['s1','s2','s3'...]rpush names s1 //依次在列表右侧逐步添加数据rpush names s2rpush names s3['s3','s2','s1'...]lpushu names2 s1 //左侧逐步添加数据lpushu names2 s2lpushu names2 s3lrange names 0 2 //读取第1到第3个列表值lrange names 0 -2 //读取第1到倒数第2个列表值LLEN names //列出列表的长度LREM names 1 s1 //删除列表names中一个s1LREM names 0 s2 //删除列表names中所有的s2lpop names //左弹出rpop names //右弹出4.2 redis集合特点:无顺序的、不重复的sadd a a1 //创建集合a并添加元素sadd a a2sadd a a3SMEMBERS a //列出集合中的所有元素srem a a1 //删除集合中元素aspop a //集合随机弹出一个元素SISMEMBER a a1 //判断元素是否在集合里 0代表不在,1代表在5.redis哈希和订阅类型基本操作5.1.hash类型数据操作Hash 写入hset haxi name ha //创建一个hash名字haxihset haxi laocation beijinghset haxi age 18hset haxi sex manhash获取HGETALL haxi //获取hash名字里的所有key value对HGET haxi name //获取hash名字里的单个key的值Hash删除HDEL haxi age //删除hash名字的单个keyDEL haxi //删除整个hashhash批量删除hmset haxi name hx666 age 20 location beijing sex boy5.2.redis的发布订阅subscribe fabu //订阅fabu频道public fabu "name shi,age 20,sex boy" //往频道发布数据,订阅可以收到发布的消息
不同数据库切换和运维监控命令
1.数据库切换//查看redis默认库grep databases /etc/redis.conf//redis数据库的切换select 0select 1//不同的数据库是独立的select 0 //默认是0库2.redis运维监控命令//查看keyRANDOMKEY //随机获取一个keyKEYS * //查看所有key,注意阻塞,如果key量特别大的时候,容易卡死阻塞SCAN 0 //建议使用,每次获取11个key,可以循环获取 每次获取都会提示下次获取的编号 直到0是获取完了//监控命令redis-cli -a password --stat //监控redis状态redis-cli -a password monitor //监控数据操作redis-cli -a password info //监控系统可通过info获取数据redis-cli -a password info Server //单个模块的info信息...
redis配置动态更新和写入
1.redis更新配置的两种方式a.重启更新,需要修改配置文件,然后重启b.实时更新,不需要重启重启更新密码vim /etc/redis.confrequirepass 12345678动态更新密码config set requirepassconfig set requirepass 123456 //临时修改并有没有写入配置文件config rewrite //写入配置文件2.查看redis的相关链接数info clients //查看当前的redis连接数config get maxclients //查看redis允许的最大连接数3.大部分配置都能通过config命令进行修改,然后写入配置文件config set maxclients 20000 //默认10000
redis的多用户管理
//老版本没有用户名,只有密码redis6已经又用户名,默认用户名default1.列出所有用户,默认只有default超级用户,并查看default用户相关信息ACL LIST //列出所有用户,默认用户是default ACL getuser default //查看default用户的相关信息,default对所有的key,所有命令均有权限,最高权限,是默认用户。2.创建用户并给用户授权ACL CAT //查看所有权限例如:创建test用户只有一个get命令权限,读权限,并且只能get是name开头的key:name*ACL SETUSER test on >testpwd ~name* +get //~正则ACL SETUSER test on >testpwd ~name* +@read //+@read 只增加test用户所在组的读权限。redis-cli --user test --pass testpwd //登录test用户进行get v1验证 3.常用权限案例:ACL SETUSER test1 on >test1pwd ~* +@all //创建用户赋给所有权限4.删除用户ACL DELUSER test15.写入配置文件config rewrite
redis的慢日志与key的有效期
问:有人反馈redis慢,如何进行排查系统资源情况查看慢日志情况1.redis慢日志//查看慢日志的默认配置CONFIG GET slow* //查看慢日志的配置//查询慢日志SLOWLOG get //默认获取仅10条SLOWLOG get5 //获取5条SLOWLOG len //慢日志量,查看慢日志的条数SLOWLOG reset //情况慢日志2.key的有效期//给redis的key设置有效期,-1表示永久,-2表示redis回收了(key已经自动删除)TTL name //查看key值的有效期expire name 20 //给key设置有效期,单位:秒,设置有效期是20sset name2 test2 EX 20 //在创建key的时候直接给key设置有效期20s
慢日志字段解释
redis禁用危险命令和压测工具
1.redis禁用危险命令FLUSHALL //会清空redis所有数据FLUSHDB //会清除当前DB所有数据KEYS * //数据阻塞//禁用需要修改redis的配置文件,然后重启redisvim /etc/redis.confrename-command FLUSHALL ""rename-command FLUSHDB ""rename-command KEY ""2.redis压测工具redis-benchmark --helpredis-benchmark -a password | tee /tmp/a.log //将测试结果输出到一个log文件 //相当于会将每个命令都测一遍,返回测试结果,默认并发50 10万次请求redis-benchmark -a 123456 -n 10000 //用默认并发数50 1000次请求进行压测
redis的两种持久化方式存储
1.redis持久化存储的两种方式RDB方式 RDB存储是redis实现的一种存储机制(默认开启)AOF方式 AOF存储方式,直接把操作的命令记录下来,保存到一个文件里,类似mysql的binlog日志(默认关闭)2.redis的RDB持久化存储redis默认是开启了RDB快照方式,提供持久化存储的功能//redis的RDB存储方式的配置config get dir //查看存储设置的路径config get dbfilename //查看rdb存储的文件名ls /data/redisdump.rdb //持久化文件//通过修改配置文件关闭rdb持久化vim /etc/redis.conf //注释掉save 添加save "" 重启redissave ""#save 3600 1#save 300 100#save 60 100003.redis的AOF持久化存储AOF存储默认是关闭的AOF存储是把命令直接写入到文件中,文件会不断扩大//开启AOF前先关闭RDB//开启AOF存储方式config get append* //查看AOF状态,默认是关闭的config set appendonly yes //开启AOF存储config rewrite //写入配置文件//写入数据就可以发现 /data/redis/ 有了appendonly.aof文件//AOF文件的重写当AOF文件增大到一定程度,我们可以对他进行重写,重写AOF文件可以减小AOF文件的大小,数据不会减少//重写的方式有两种,手动重写和自动重写BGREWRITEAOF //手动重写config get *aof* //查看自动重写文件 默认自动重写的条件是aof文件大小>67m,aof文件增大了一倍注意:在业务高峰压力大时采用自动触发重写,可能会影响业务,可选择在压力小的时候脚本运行BGREWRITEAOF
redis的RDB工具分析key的大小
1.什么是redis的大key?redis存储数据的时候,当某个key的值比较大〈包括字符串、列表等数据类型),key的数据越大,占用的内存和空间就越多。也就是key对应的value很大。string类型的数据: 长度大于10K,认为是大keylist列表类型的数据:长度大于10240,认为是大key2.扫描和分析大key2.1方法一redis-cli -a password --bigkeys2.2方法二使用rdb工具分析大key3.删除大keyDEL k1
redis的主从复制
1.redis单台服务器的缺点如果持久化,单台数据有丢失风险读写压力都集中在一台上2.redis的主从复制概念redis的主从就是堕胎redis数据一致主服务器可以用来写入和读取,从服务器仅用来读取,可以通过读写分离,降低服务器的压力3.redis的主从搭建主redis的配置vim /etc/redis.confbind 0.0.0.0port 6379dir "/data/redis"requirepass "redispwd"pidfile "redis.pid"logfile "redis.log"daemonize yes从redis的配置vim /etc/redis.confbind 0.0.0.0port 6379dir "/data/redis"requirepass "redispwd"pidfile "redis.pid"logfile "redis.log"daemonize yesslaveof 192.168.70.134 6379 //指定主服务器的redis的ip和端口masterauth "password" //指定主redis的密码//再开一台服务器,把master的文件copy过去[root@master bin]# scp -r /usr/local/bin/redis-* root@192.168.70.133:/usr/local/bin/ //复制bin下面的redis二进制文件[root@slave bin]# redis-cli -v redis-cli 6.2.13[root@slave bin]# mkdir -p /data/redis //创建数据目录[root@master bin]# scp /etc/redis.conf root@192.168.70.133:/etc/ //复制主的配置文件[root@slave bin]# vim /etc/redis.conf //修改配置文件//删除最后一行user 添加如下slaveof 192.168.70.134 6379masterauth "password"[root@slave bin]# redis-server /etc/redis.conf //启动set k1 v1 //主redis创建数据 测试从redis是否同步
redis高可以用
//高可用模式搭建为了防止哨兵的单节点故障,一般哨兵也做成高可用形式,即多个哨兵同时监控redis的状态,当其中一个哨兵故障时候,其他哨兵也能继续监控。为了方便哨兵的选举,一般哨兵也是设置成奇数个。一般3个哨兵就没问题。//准备:192.168.70.134 主 哨兵1192.168.70.133 从1 哨兵2192.168.70.136 从2 哨兵31.在前面主从复制的基础上我们在搭建一台从redis [root@slave bin]# scp -r /usr/local/bin/redis-* root@192.168.70.136:/usr/local/bin/ //直接复制slave1的文件即可[root@slave bin]# scp /etc/redis.conf root@192.168.70.136:/etc/[root@slave2 ~]# mkdir -p /data/redis //创建数据目录//修改主配置文件[root@master ~]# masterauth "123456" //添加 有可能这台机器以后变成从 所以也要添加2.配置3哨兵 3台机器都一样 注意密码设置你自己的密码vim /etc/sentinel.confbind 0.0.0.0daemonize yesport 26379dir "/tmp"logfile "sentinel.log"sentinel monitor testmaster 192.168.70.134 6379 2sentinel auth-pass testmaster password sentinel down-after-milliseconds testmaster 5000sentinel failover-timeout testmaster 180003.启动3哨兵a/usr/local/bin/redis-sentinel /etc/sentinel.conf4.验证哨兵实现的高可用redisa.停止master redis服务systemctl stop redis //kill也行b.查看其他两个从redis,其中一个已经提升为主redis-cli -a password infoc.再次启动redis 发现原主redis已经成为了slave5.验证一下哨兵的高可用性a.在原主192.168.70.134那台机器上,杀死一个哨兵,模拟一个哨兵服务挂掉再验证还能不能实现高可用[root@rabbit01 bin]# ps -ef | grep senroot 1433 1 0 22:30 ? 00:00:01 /usr/local/bin/redis-sentinel 0.0.0.0:36379 [sentinel]root 1487 1210 0 22:40 pts/0 00:00:00 grep --color=auto sen[root@rabbit01 bin]# kill -9 1433b.再关闭新主redis kill -9 1243c.查看是否生成了新的主redisredis-cli -a password info
redis cluster集群搭建和高可用故障切换演示
1.redis主从模式和cluster分片集群区别redis主从模式,是所有redis数据一致,但是key过多了会影响性能cluster分片集群,可以将数据分散到多个redis节点,数据分片存储,能够提高redis的吞吐量2.redis cluster集群特点数据分片多个入口故障自动切换3.redis cluster集群的搭建构建redis集群至少需要三主三从4.redis自带集群搭建a.目录和机器规划:目录:/data/cluster三主:192.168.70.133:7000 192.168.70.134:7001 192.168.70.136:7002三从:192.168.70.133:8000(7002的从) 192.168.70.134:8001(7000的从) 192.168.70.136:8002(7001的从)先把之前的环境清理,结束掉redi 和哨兵胡,再直接删掉/data/redis/*b.修改redis的配置文件: 只有端口和路径不一样//第一台机器mkdir /data/cluster/7000 -pmkdir /data/cluster/8000 -pvim /data/cluster/7000/redis.confvim /data/cluster/8000/redis.conf//第二台机器mkdir /data/cluster/7001 -pmkdir /data/cluster/8001 -pvim /data/cluster/7001/redis.confvim /data/cluster/8001/redis.conf//第三台机器mkdir /data/cluster/7002 -pmkdir /data/cluster/8002 -pvim /data/cluster/7003/redis.confvim /data/cluster/8003/redis.conf//六个配置文件都如下 只有端口和路径需要修改对应的vim /data/cluster/7000/redis.confcluster-enabled yesport 7000dir "/data/cluster/7000"logfile "redis.log"pidfile "redis.pid"daemonize yesbind 0.0.0.0requirepass 123456masterauth 123456tcp-backlog 1024tcp-keepalive 0loglevel noticestop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yessave 900 1save 300 10save 60 10000dbfilename "dump.rdb"slave-server-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes//依次启动redis-server /data/cluster/7000/redis.conf 7001 7002c.创建3主机群,在任何一个节点都行redis-cli -a 123456 --cluster create 192.168.70.133:7000 192.168.70.134:7001 192.168.70.136:7002redis-cli -a 123456 -p 7000 cluster info //查看集群信息redis-cli -a 123456 -p 7000 cluster nodes //查看节点信息//数据写入会自动随机分配到各个节点redis-cli -a 123456 -p 7000 -c //登录 -c 集群环境下127.0.0.1:7000> set k1 v1 //写入数据发现数据被写入 7002节点上了 -> Redirected to slot [12706] located at 192.168.70.136:7002OKd.上述实现了解决高并发问题,下面增加搭建3从集群,实现redis高可用//先启动3个从redis 192.168.70.133:8000 192.168.70.134:8001 192.168.70.136:8002 redis-cli -a 123456 -p 7000 cluster nodes //查看集群的各个节点状态和master-id//依次添加 注意:ip顺序不能颠倒redis-cli -a 123456 --cluster add-node --cluster-slave --cluster-master-id 7000master的id 192.168.70.134:8001 192.168.70.133:7000redis-cli -a 123456 --cluster add-node --cluster-slave --cluster-master-id 7001master的id 192.168.70.136:8002 192.168.70.134:7001redis-cli -a 123456 --cluster add-node --cluster-slave --cluster-master-id 7002master的id 192.168.70.133:8000 192.168.70.136:7002例:redis-cli -a 123456 --cluster add-node --cluster-slave --cluster-master-id 26533684353ab52ea0a02cb6e87299e1f15dfd50 192.168.70.134:8001 192.168.70.133:7000//成功后查看node 可以发现已经添加了一个slaveredis-cli -a 123456 -p 7000 cluster nodesf.验证//停止133:7000主库的redis//再查看nodes redis-cli -a 123456 -p 8000 cluster nodes //会发现8001已经提升为主redis了 并且8001上的数据跟7000数据一致//恢复133:7000 自动作为从角色运行redis-server /data/cluster/7000/redis.conf//手动提升为主库redis-cli -a 123456 -p 7000 -c //先登录CLUSTER FAILOVER //执行该命令info //查询信息 可以发现成为了master
redis cluster集群增加节点和删除节点
//在上述集群基础上做增加节点1.搭建新服务器的redisscp -r /usr/local/bin/redis-* root@192.168.70.132:/usr/local/bin/ //复制mkdir -p /data/cluster/7003mkdir -p /data/cluster/8003scp -r /data/cluster/7000/redis.conf root@192.168.70.132:/data/cluster/8003/vim /data/cluster/8003/redis.conf //修改端口和地址redis-server /data/cluster/7003/redis.conf //启动2.加入集群//在redis集群中加入一个新的主节点(在任意一台集群的节点操作即可)redis-cli -a 123456 --cluster add-node 192.168.70.132:7003 192.168.70.133:7000//加入从节点redis-server /data/cluster/8003/redis.confredis-cli -a 123456 --cluster add-node --cluster-slave --cluster-master-id 9980d04a047fa52918bb50f7a2b7b530c138f8eb 192.168.70.132:8003 192.168.70.132:7003 //加入从节点//加入完成后但是没有分配卡槽,不能存放数据3.给新增的redis分配槽位(在集群的任何一个节点即可)方法:将一个主节点的槽位移动到新主节点一部分redis-cli -a 123456 --cluster reshard 192.168.70.133:7000 //根据提示依次输入1. 2000 (分配2000,也可自定只要在范围之内) 2.接收者id 也就是7003 node的id 3.源id也就是7000 id 4.done 5.yes4.测试redis-cli -a 123456 -p 7003 -c //登录set k4 v4 //创建 //验证高可用kill 7003的进程redis-cli -a 123456 -p 8003 cluster nodes //可以看到8003已经成为masterredis-server /data/cluster/7003/redis.conf //恢复5.删除节点(删除节点操作也可以在任意节点操作)redis-cli -a 123456 --cluster del-node 对应主库的ip:端口 对应从库的id//移除从库 8003节点redis-cli -a 123456 --cluster del-node 192.168.70.132:7003 376c471158d25260e98d7d51764d78cdb7cad935//移除主库 7003节点 (主节点上如果有数据则不能移除,删除之前需要把主节点的数据进行迁移)redis-cli -a 123456 --cluster reshard 192.168.70.133:7000 //把数据还给7000 同样根据提示操作 1. 2000 2.7000 ip 3.7003 ip 4.done 5.yesredis-cli -a 123456 --cluster del-node 指定随便其他的一个主库ip:端口 对应从库的idredis-cli -a 123456 --cluster del-node 192.168.70.133:7000 9980d04a047fa52918bb50f7a2b7b530c138f8eb //删除节点 再查看节点会发现已成功删除