Redis
2021-03-04 11:21:07 27 举报
AI智能生成
Redis基础
作者其他创作
大纲/内容
简介
C语言开发的,基于键值对的,数据存于内存的数据库
特性
速度快
基于键值对
丰富的数据结构
简单稳定
可持久化
主从复制
高可用,分布式
场景
缓存
分布式锁
消息队列
排行榜
社交网络
最新列表
分布式回话
为什么要使用缓存?
高性能
从硬盘读取数据比较慢,高频数据存缓存中
内存速度比磁盘(外存)的速度快多了
高并发
mysql 的单机QPS 大概1W, redis的单机QPS10W+
常见的数据结构
string 字符串
set setex mset
get mget
exists
strlen
del
incr 加一,decr减一
场景
用户的访问次数
用户点赞转发的数量
...
list 链表 双向链表
rpush lpush
lpop rpop
lrange 查看链表的长度
llen 查看链表的长度
场景
lrange 实现分页查询,性能非常高
实现栈
hash 哈希 类似JDK18 数组+链表
适合存储对象
hset hmset hexists hget hgetall,hkeys,hvals
set 无序集合 无重复数据
场景
一个用户的所有关注者
共同关注,共同粉丝,共同喜好,求交集的过程
sadd spop
smembers
scard 查看set的长度
sismember 检查是否在这个集合中
zset 有序集合 带权重参数
zadd
zcard
zscare 查看某个函数的权重
zrange 顺序输出某个范围区间的元素
zrevrange 逆序输出某个范围之间的元素
场景 直播间
根据权重进行排序
直播间在线用户列表
礼物排行榜
弹幕消息
HyperLOgLog,流,地理坐标等
单线程
Reactor模式
IO多路复用来监听来自大量客户端的连接
事件驱动程序
文件事件
读取写入操作,涉及一系列的网络通信
时间事件
不使用多线程的原因
单线程编程容易维护
redis的性能瓶颈不在于CPU,在于内存与网络
多线程存在死锁,线程上下文切换,这些会影响性能
Redis 6.0 后引入多线程
提高网络IO的读写性能,让多线程在网络数据读写这类耗时操作上使用,仍然是单线程执行
在redis.conf中开启,默认是关闭的,开启后需要设置多线程数,负责不生效
缓存数据设置过期时间
原因
内存是有限的
某些业务场景只需要一段时间有效
命令: exp key 60 ;setex key 60 value;
除字符串类型之外
expire 设置过期时间
persist 移除一个键的过期时间
场景
短信验证码 60s有效
token一天有效
判断是否过期
本质:过期字典( hash表)
键: 指向数据库的某个key
值: longl类型的整数(过期的时间)
命令:ttl key
过期数据删除策略
惰性删除
取key的时候才对数据进行过期检查,若过期则删除
优点:对CPU友好
缺点:会造成大量的过期的key没有被删除
定期删除
每隔一段时间抽取一批key执行过期的key操作
优点:对内存更加友好
缺点:执行的时长和频率对CPU时间影响
定时删除
创建一个定时器在键的过期时间来临时,立即执行队键的操作删除
Redis 采用的两者结合的方式
内存淘汰策略
保证redis中的数据都是热点数据
从过期的数据集中
LRU : 最近最少未使用的数据
TTL: 挑选将要过期的数据淘汰
Random: 任意选择数据淘汰
所有数据集
allkeys-LRU
allkeys-Random
aLLkeys-LFU :从已过期的数据中挑选最不经常使用的数据淘汰
禁止驱逐数据(不会使用)
内存不足时,写入数据会报错
Redis持久化机制
保证Redis挂掉之后可以进行恢复
RDB(数据快照)
优点
二进制文件
适用于备份,全量复制,灾难恢复
Redis加载RDB的恢复速度远快于AOF方式
缺点
无法实时的持久化,中途宕机,会丢失一段时间的内的数据
需要fork()创建子进程,属于重量级别的操作,会导致Redis卡顿几秒
AOF(追加文件)
优势
解决了rdb不能实时持久化的问题
每次执行的命令都记录到aof文件中
aof文本形式,修改比较灵活
缺点
AOF文件大于RDB文件
AOF的冷备没有RDB迅速
由于执行效率比较高,所以负载过高时,性能没有RDB好
混合持久化(RDB+AOF)
优点
快速加载的同时避免了丢失过多的数据
缺点
混合了两种数据格式,文件可读性差
redis4.0 以后才支持
事务
muilt,exec,discard,watch
开启事务后,会将命令放入队列
不支持回滚的
缓存穿透
大量请求的key不存在于缓存中,直接请求到数据库上
解决办法
对不合法的参数进行校验
设置缓存效的key,过期时间尽量短一点 1分钟(不推荐,缓存中就会存在大量无效的key)
布隆过滤器
布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。
缓存雪崩
场景:缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求
解决办法
热点数据永不失效
采用集群,避免单机出现问题整个缓存服务都没办法使用
限流,避免同时处理大量的请求
设置不同的缓存失效时间,比如随机设置缓存的失效时间
缓存与数据库的数据一致性
缓存失效时间变短(不推荐,治标不知本)
增加Cache更新重试机制

收藏
0 条评论
下一页
为你推荐
查看更多