知识体系结构:
数据类型、基本操作
持久化AOF/RDB
事务的控制
复制
**NoSQL:**not only sql 泛指非关系性数据库,克服了关系性数据库在【海量数据】和【高并发】情况下的缺点
非关系性数据的特点:
非关系型数据库的分类:
什么是Redis?
Redis:Remote Dictionary Server 远程字典服务器
Redis是开源的、C语言写的非关系性数据库,键值(key-value)型数据库
Redis的特点
数据存储在内存中,为保证数据安全,能不定期持久化数据到硬盘
Redis支持的五种数据类型:
字符串【String】、哈希【hash】、列表【list】、集合【set】、有序集合【sorted set】
Hash存储对象的命令:HMSet key field value,其中key为对象名,field为对象的字段名,value为对象的字段值
Set存储对象的命令:SADD key member1 ,其中key为集合名,member1为String类型的元素。
set是无序集合,元素不能重复
ZSet存储对象的命令:ZADD key score member1,其中key为集合名,score为用于排序分数,member1为String类型的元素。
(1)zset是有序集合,元素重复,但分数(score)却可以重复
(2)添加的key与集合中已经存在,但分值不同,则更新这个分值
(3)ZSet类型中分数值非常重要
Redis的list数据类型是双向链表实现的,set和zset底层是哈希包
存取速度快,支持高并发、集群、分布式、主从同步
支持多种语言的客户端
支持存储过期----存储过期:存储数据设置一个有效期,时间到了就没了,如vip、微信红包、短信验证码
支持订阅和发布
Redis的应用场景
Redis和MemcacheDB的异同:
MemcacheDB逐渐被Redis取代
相同点:都是key-value类型的nosql,数据存储在内存中,存取速度快,支持并发和集群,都支持存储过期
不同点:(1)Redis支持的value数据类型比memcached多
(2)Redis支持持久化数据到硬盘,数据更安全,MemcacheDB只能存内存
下载:Redis官网只支持linux版本,windows版本由微软进行维护,需要导GitHub上下载:
https://github.com/MicrosoftArchive/redis/releases
Redis的安装:编译后的版本免安装,解压到指定位置即可
启动redis
Windows版的Redis有2个配置文件,一个是:redis.windows.conf,另一个是redis.windows-service.conf
以服务的方式启动Redis
注册服务:redis-server --service-install 配置文件名【redis.windows-service.conf一般用于注册服务】
停止服务:redis-server --service-stop
卸载服务:redis-server --service-uninstall 【卸载服务之前必须停止服务】
开启服务:redis-server --service-start
直接以dos命令的方式
Redis服务端的启动:Redis服务端目录下cmd进行dos窗口:redis-server.exe redis.windows.conf
Redis自带客户端的启动:
(1)服务端在本地时,双击redis-cli.exe,默认取连接本地6379端口----这种方式只能连接本地Redis服务器(2)服务端不在本地时【端口默认为6379】,Redis客户端目录的dos窗口下:
Redis-cli.exe -h ip地址 -p 6379----------这种方式既能连接本地,也能连接非本地redis服务器
注意:在本地时,启动Redis的服务端和客户端要分别打开2个dos窗口进行命令操作
界面化的客户端工具:redis desktop manager
设置临时密码,重启就会失效:config set requirepass 密码
登录:auth 密码
取消密码:config set requirepass “”—必须登录才能取消
设置永久密码:
(1)在配置文件redis.windows.conf中搜索requirepass,找到后在【#requirepass】设置密码
(2)重启redis,服务端启动时需要加载该文件
(3)客户端密码登录:auth 密码
Redis的16个数据库
Redis默认有16个数据库,索引为0-15,在redis.windows.conf配置文件中可以修改。默认使用 0 号数据库
查看Redis数据库中所有的key:keys *
Redis模糊查询命令:keys k?, 其中?只占一位,也可以用:keys h???
删除某个键值对:del age
查看类型:type age
设置某个某个键值对的过期时间:expire sex 30【expire 键 时间】
设置值的时候设置过期时间:setex key 过期时间 value
查看某个某个键值对还有多少秒过期:ttl sex 【查看键为sex的值还有多久过期,-1为永不过期】
当过期后查询get sex,显示为nil【没有该值】
自增:incr age----age对应的value自增1(如果键不存在,则设置初始化age对应的value为0,再加1)
自减:decr age-----age对应的value自减1(如果键不存在,则设置初始化age对应的value为0,再减1)
增加多少:incrBy age 10 age对应的value值加10
减少多少:decrBy age 5 age对应的value值加5
设置值:set name zs----字符串值 value 关联到 key
(1)如果key已有value,则覆盖它。
(2)如果已存在的键值对存在有效期,则有效期对覆盖后的新值不起作用
获取值: get name----假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。
追加值:append name ls-----结果:zsls
批量设置value值:mset name ls age 18 sex true【mset key1 value1 key2 value2】
批量获取value值:mget age name【mget key1 key2】
getrange key start stop:获取指定区间的数据
setrange key start value :设置从指定起点开始的内容,覆盖原有内容,未覆盖的保留
不存在相同的key键才存储值:setnx key value【if not exist】
批量也可以:msetnx key1 value1 key2 value2
List列表中:0表示第一个元素,1表示第2个元素,-1表示倒数第1个元素,-2表示倒数第2个元素
lpush key value1 value2:各个 value 值按从左到右的顺序依次插入到表头----返回值:列表长度
rpush key value1 value2:各个 value 值按从左到右的顺序依次插入到表尾----返回值:列表长度
如果 key 不存在,一个空列表会先创建再执行 lpush/rpush操作
lrange key start stop:返回列表 key 中指定区间内的元素【闭区间】
lrange key 0 -1:查询列表的所有元素
lpop key:移除并返回列表 key 的第一个元素【key为列表名】
rpop key: 移除并返回列表 key 的最后一个元素
lrem key cout value:根据参数 count 的值,移除列表key中与参数 value 相等的元素。
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
lindex key index:返回列表 key 中,下标为 index 的元素
ltrim key start stop:让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
单个
HSET key field value:将哈希表 key 中的域 field 的值设为 value
HGET key field:返回哈希表 key 中给定域 field 的值
批量
HMSET key field value [field value ...]:同时将多个 field-value (域-值)对设置到哈希表 key 中
HMGET key field [field ...]:返回哈希表 key 中,一个或多个给定域的值
HKEYS key 返回哈希表 key 中的所有键
HVALS key 返回哈希表 key 中所有域的值
HGETALL key 返回哈希表 key 中,所有的域和值
hdel obj field value 删除对象里某个字段
hlen key 获取对象中的字段个数
hexists obj field 判断对象中是否存在某个字段,存在返回1,不存在返回-1
**Redis淘汰策略:**当redis缓存的数据到达配置的最大内存后,会按照配置淘汰策略进行淘汰,可以在redis.windows.conf配置文件中的【 MAXMEMORY POLICY】处进行配置
LRU算法:Least Recently Used 最近最少使用的算法
Redis的配置文件redis.windows.conf中:
# save ""
save 900 1 -------------900秒内至少有1个更改
save 300 10 -------------300秒内至少有10个更改
save 60 10000-------------60秒内至少有10000个更改
dbfilename dump.rdb-----设置保存数据的RDB文件名称,默认的文件名为:dump.rdb
dir ./----------------设置RDB文件的存放目录,默认本地数据库目录下
执行save和bgsave命令后,不必等时间间隔到了再执行
Save 命令执行一个同步保存操作,将缓存中所有数据的快照以RDB文件的形式保存到硬盘
bgsave命令执行后,Redis会fork出一个新子进程,原来的 Redis 进程继续处理客户端请求,而子进程则负责将数据保存到磁盘
SAVE 保存是阻塞主进程,客户端无法连接redis,等SAVE完成后,主进程才开始工作,客户端可以连接。
BGSAVE 是fork一个save的子进程,在执行save过程中,不影响主进程,客户端可以正常链接redis,等子进程fork执行save完成后,通知主进程,子进程关闭。
BGSAVE方式比较适合线上的维护操作
appendonly no #开关AOF模式-----------yes开启 no则关闭
appendfilename "appendonly.aof"--------设置保存数据的AOF文件名称,默认文件名为appendonly.aof
注意:
AOF策略和RDB策略可以同时配置,当同时存在dump.rdb和appendonly.aof两个文件时,redis启动时优先加载appendonly.aof 文件来恢复数据
修饰时都要从redis-check-aof.exe命令和edis-check-rdb.exe命令所在目录进入dos窗口执行
aof修复命令:redis-check-aof --fix appendonlly.aof
扫描aof文件找出第一个出错的命令,并且删除出错命令之后的所有命令,只保留那些为出错的命令,在大多情况下,被删除的都是aof文件末尾的不完整的命令
rdb修复命令:redis-check-rdb --fix dump.rdb
目前没有办法修复出错的快照文件,因为快照文件本身时进行过了压缩,快照中的错误可能会导致剩余不问无法读取,解决办法是将重要的快照保留多个备份,在后期的数据恢复是通过计算快照文件的SHA1散列值和SHA256散列值来对内容进行验证
redis.windows.conf配置文件中进行配置
# appendfsync always
appendfsync everysec
# appendfsync no
AOF的重写机制
AOF写入日志采用的文件追加的方式,因此文件会越来越大。为了避免这种情况,当AOF文件的大小超过设定的阀值,就会重写一个aof文件
**重写原理:**Redis就会将内存中每条记录以set命令的方式重写一个新的aof文件,与之前的aof文件无关
注意:aof文件的重写会导致阻塞
**触发重写的条件:**Redis会记录上次重写时aof文件的大小,默认当aof文件大小是上次重写后大小的一倍且文件大于64M,触发一次重写。
auto-aof-rewrite-percentage 100----100%即上次重写文件大小的一倍
auto-aof-rewrite-min-size 64mb----重写时文件最小为64M
**AOF和RDB的对比:**aof占用空间比RDB大,aof恢复速度比RDB慢,AOF比RDB丢失数据少
建议只在从服务器上使用RDB策略
**RDB快照文件和AOF日志文件的创建时间:**dump.rdb文件是在满足rdb持久化的条件或直接指向save命令时才创建,appendonly.aof文件是配置文件中开启了aof持久化功能启动redis时创建
**Redis重启时持久化数据的加载顺序:**redis重启时读取配置文件,如果开启了aof持久化功能,则优先加载aof日志文件恢复数据;如果没有则使用rdb快照恢复数据
Redis事务的三阶段:开启、入队、执行
muti:开启事务
exec:执行事务
入队:将多个命令入队到事务中,接收到命令后事务并不会立即执行,而是放到等待执行队列当中
discard:放弃事务 watch key:监控key unwatch:放弃监控
Redis事务不是同生共死,执行过程报错,其余未报错的继续执行
进程间的通信机制:消息发布者发布消息,sub消息订阅者订阅消息后接收消息
Redis常见的主从复制架构:一主多从、级联
Redis主从复制分为两步:全量复制和增量复制
全量复制:Redis全量复制一般发生在slave发初始化阶段,将master上的所有数据都复制一份到slave
只要是重新连接master,就会执行一次全量复制
总结:全量复制实际是将建立同步关系之前的数据一次性完全复制到slave,增量复制实际是将建立同步关系之后master执行的每条写命令同步到slave
修改前:
# slaveof 从服务器绑定主服务器
# masterauth 从服务器绑定主服务器的密码
修改后:
slaveof 127.0.0.1 9000
masterauth root
在任何一个redis的客户端执行命令:info,可以查看该服务器的所有相关信息
在master客户端执行此命令:info replication ,可以查看跟主服务器绑定的从服务器数量和状态
Redis默认作为slave作为从服务器时不能进行写操作
配置文件中的默认配置:
slave-read-only yes
总结:
级联复制:级联复制模式下,部分slave的数据同步不连接主节点,而是连接从节点
只需将redis的配置文件redis.windows.conf中配好端口号和绑定的主服务器即可,这里的主服务器有可能本身也是从服务器
slaveof 127.0.0.1 9002
masterauth root
Redis的哨兵系统主要有以下三个功能:监控、提醒、自动故障转移
哨兵的自动故障转移原理:当主服务器master宕机,那么哨兵会通过选举(算法)机制,从Salve中选出一个作为新Master,并删除监听列表中出现故障的Master服务器。之前宕机的master重新启动,自动切换成slave,不会自动恢复成master。
复制三份redis的安装目录,分别命名为redis1、redis2、redis3,将redis.windows.conf配置文件中端口号分别修改为9000,9001,9002
启动三个redis服务器,通过redis2、redis3的客户端,分别执行命令:slaveof 127.0.0.1 9000【slaveof 主服务器IP 端口号】,将redis1做为主服务器,redis2、redis3作为从服务器
如果配置文件中配置:slaveof 主服务器IP 端口号,则不需要执行命令
配置哨兵:在redis1、redis2、redis3的安装目录下,分别创建一个哨兵的配置文件:sentinel.conf【名称随便取】,配置内容如下:
# 配置哨兵服务的端口号
port 9600
# 配置哨兵监视的主服务器和表决的最少票数
sentinel monitor mymaster 127.0.0.1 9000 2
# 3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
sentinel.conf中的重要配置:sentinel monitor 主服务器的名称 主服务器的IP地址 端口号 表决票数
failover:故障切换,指系统中其中一项设备或服务失效而无法运作时,另一项设备或服务即可自动接手原失效系统所执行的工作
启动哨兵:从redis-server.exe 所在的目录进入dos命令窗口,执行:
redis-server.exe sentinel.conf --sentinel
启动哨兵后发现:每个哨兵会监视主服务器、从服务器和其他哨兵的运行情况
关掉主服务器redis1,从服务器会变为主服务器,这个过程中会删除配置文件中的原配置:salveof 新master的IP地址 端口号,另一个从服务器也会更新配置文件中绑定主机IP地址
一段时间后再启动原主服务器redis1,redis1自动由 master状态变为salve状态,配置文件的末尾会自动添加一行配置:salveof 新master的IP地址 端口号
安装目录下的logs文件夹下的redis.log日志文件可以查看redis的相关操作
**缓存雪崩:**同一时刻,大量的key的集中过期,造成数据库瞬时压力大,甚至引起宕机
原因:设置了相同的缓存过期时间,重启后过期时间完全相同
解决办法:
缓存雪崩和缓存击穿:缓存击穿并发查询同一条数据,缓存雪崩是不同的缓存都过期了,缓存中查询不到而都从查数据库
**缓存预热:**系统上线后,将相关的缓存数据直接加载到缓存系统
**解决办法:**定期更新缓存