一 .概念
(1) redis是一个高性能的key-value数据库
(2) 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载s数据进行使用。
(3) 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
(4) 支持数据的备份,即master-slave模式的数据备份。
(5) 性能极高 Redis能读的速度是110000次/s,写的速度是81000次/s
(6) 丰富的数据类型 Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
(7) 原子– Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性– Redis还支持 publish/subscribe, 通知, key 过期等等特性。
二 .数据类型
支持5中数据类型:string list set hash(哈希) zset(有序集合)
1. string
最基本类型,最大能存储512mb;
最常规的set get increment decr mget操作,value可以是String也可以是数字。
一般做一些复杂的计数功能的缓存(统计微博粉丝数)
2 .Hash
hash是一个string类型的field和value的映射表,适用于存储对象最大存储2^32-1
常用命令hget hset hgetall
存储用户信息
3.List
列表是简单的字符串列表,按照插入顺序排序最多可存储2^32 - 1;
常用命令lpush rpush lpop rpop lrange rang
可以做简单的消息队列的功能分页效果好 ,关注列表,粉丝列表;消息队列系统
4.Set
类似list列表功能,还可以自动排重;set是一个集合,set中的元素是无序的
常用命令:sadd spop smembers sunion
利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能
5. Sorted set(zset)
集合中的元素能够按score进行排列,每一个元素都会关联一个double类型的分数。
常用命令zadd zrange zrem zcard
可以做排行榜应用
6.区别
三. 应用场景
(1)显示最新的列表 list
(2)排行榜应用,获取topN zsort set
(3)删除与过滤LREM
(4)按照用户投票和时间排序 (lpush+ltrim 获取事件最新指定条数,再计算投票得分,计算结果由ZADD命令按照新的顺序填充生成列表,老数据则被清除)
(5)处理过期项目
(6)计数
(7)特定时间内的特定项目
(8)查找某个值所在的区间
(9)交集 并集 差集
四 .缺陷
(1)Redis穿透
查询缓存不存在,去查询数据库,从数据库中查询有数据添加到缓存,
例: 无数据不添加缓存.当传入的参数是-1时(传入一个一定不存在的参数,每次查询都为空,恶意攻击,会一直去查询,给数据库造成压力,击垮数据库);
解决方法:如果从数据库中查询的值为空,也放入缓存,设置较短的缓存时间;接口做校验,当参数<= 0时拦截
(2)Redis雪崩
在某一指定时间段内,缓存集中过期。致命的雪崩是缓存服务器某个节点宕机或者断网,很多数据的请求
例: 一波爆款商品,缓存过期了,会同时大量访问数据库,就会对数据库产生周期性的峰值,导致数据库故障,直接会导致服务器故障;如果服务器宕机或者断网,会对数据库产生不可预知的压力,会瞬间击垮数据库;
解决方法:根据商品分类,不同商品,缓存周期不同;缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
(3)redis击穿
一个爆款key,大并发集中对这个key进行访问,当key瞬间失效,持续的大并发就会穿破缓存,直接去请求数据库;同时对一条数据请求
解决方法:设置爆款key用不过期
参考链接:https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc
五 .单线程redis为什么速度快
单线程操作,避免上下文切换
纯内存操作模式
采用了非阻塞I/O多路复用机制
六 .redis过期策略+内存淘汰机制
1.过期策略
(1)定期删除
定期删除:redis默认100ms随机检查一次,是否有过期key 如果有则删除 如果只采用定期删除策略,会导致很多key到时间没有删除。
(2)惰性删除
惰性删除:在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效 ,采用内存淘汰机制?
2 .淘汰机制
noeviction:当内存限制达到,谁也不删除,返回错误。
allkeys-lru:尝试回收最少使用的键,使得新添加的数据有空间存放。
volatile-lru:尝试回收最少使用的键,但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkey-random:回收随机的键,使得新添加的数据有空间存放。
volatile-random:回收随机的键,使得新添加的数据有空间存放,但仅限于过期集合的键。
volatile-ttl:回收在过期集合的键,并且优先回收存货时间较短的键,使得新添加的数据有空间存放
七 .redis并发竞争问题
当多个子系统同时set一个key 就会出现并发竞争问题
(1)如果对这个key操作,, 这种情况下,准备一个分布式锁,大家去抢锁,抢到锁就做set操作即可,比较简单。
八.Redis持久化方式
(1) RDB持久化:原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化
(2)AOF持久化:将redis的操作日志以追加的方式写入文件
九.Redis集群
1.主从模式
1.特点
(1)主数据库可以进行读写操作,当读写操作导致数据变化是会自动同步给从数据库;
(2)从数据库一般都是只读的,并且接受主数据库同步过来的数据
(3)一个master可以有多个slave,一个slave只能对应一个master
(4) slave挂了不影响其他的slaver的读和master的读写,重新启动后会将数据从master同步过来
(5)master挂了,不影响slave的读,但是redis不再提供写的服务,master重启后redis将重新提供写的服务
(6)master挂了以后不会在slave中选择一个master
2.工作机制
(1)当slave启动后,主动向master发送一个sync命令
(2)mster接受到sync命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令
(3)将保存的快照文件和缓存的命令发送给slaver
(4)slave接收到快照文件和命令后加载快照文件和缓存的执行命令
3.安全设置
(1)客户端访问master时需要密码
(2)启动slave需要密码
(3)客户端访问slaver不需要密码
4.缺点
master只要唯一一个,当master挂了,redis就不能提供写服务
2.Sentinel模式
1.特点
(1)sentinel模式是建立在主从模式基础之上,如果只有一个redis节点,sentinel没有任何意义
(2)当master挂了以后,sentinel会在slave中选择一个作为master,并修改他们的配置文件
(3)当master重新启动了之后,将作为slave接收新的master同步的数据
(4)sentinel也是一个进程也有可能挂点,所以sentinel会启动多个形成一个sentinel集群
(5)多sentinel配置的时候,sentinel之间也会自动监控
(6)当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中
(7)一个sentinel或sentinel集群可以管理多个主从redis,多个sentinel也可以监控同一个redis
2.工作机制
(1)每个sentinel以每秒钟一次的频率向他所知的master,slave以及其他的sentinel实例发送一个ping命令
(2)如果一个实例距离最后一次有效回复ping命令的时间超过down-after-milliseconds 选项所指定的值。则这个实例会被sentinel标记为主观下线
(3)如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
(4)当有足够数量的sentinel在指定时间内确认master的确进入了主观下线状态,则master会被标记为客观下线状态
(5)在一般情况下,每个sentinel会以每10秒一次的频率向他已知的所有master,slave发送info命令
(6)当master被sentinel标记为客观下线时,sentinel向下线的master的所有slaver发送info命令的频率会从10秒一次改为1秒一次
(7)如果没有足够数量的sentinel统一master已经下线时,master的客观下线状态会被移除
(8)若master重新向sentinel的pong命令返回有效回复。master的主观下线状态会被移除
3.缺点
基本可以满足所有需求,当数据量过大时,就无法满足需求
参考链接://www.greatytc.com/p/06ab9daf921d
3.Cluster模式
解决分布式方面的需求
自动将数据进行分片,每个master上放一部分数据
主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster
参考链接:https://blog.csdn.net/miss1181248983/article/details/90056960