这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
redis是什么
访问速度跟不上,秒杀等,跟不上,如果从内存直接读数据会很快,redis。
热数据存入内存,数据分冷热,热数据,经常被访问到的数据。
redis,服务器重启,内存数据丢失,redis持久化到硬盘上,aof,rdb
读rdb文件,和aof对比,之后有没有没执行的命令,就给执行一下,防止内存中的数据丢失。
redis应用案例
案例 1.连续签到,
签到完,天数+1,判断一下连续吗?
redis的数据结构:string
如果没连续签到,redis就过期了。
原有数值+1 ,设置过期时间
数据结构的良好设计:提高性能,压缩存储
string 二进制安全的数据结构
案例 2.消息通知,
文章更新,推送到es,用户就能搜到。
用list作为消息队列。 有个监听器,监听队列里是否有数据。
list数据结构:
案例 3.计数,
hash数据结构 如果一个用户存那么多信息就太多个key了。可以用一个用户id存key hash结构,存一堆关联数据。
hash的数据结构:
拉链,拉链很长会扩容,增加槽位,开辟新的槽位,rehash过程(面试可能会问),拷贝过程平摊到每次访问之中。
案例4 排行榜,
积分变化,排名实时变更。积分变化之后,改变,并重新排序,
数据结构 zset
数据结构:zset 跳跃表,找的比较快,两次找到7,
案例5 限流
案例6.分布式锁
setnx考察点:只有key没设置过才能重复设置,redis执行时单线程,setnx不一定保证单线程
redis注意事项
大key,热key,如果key很大,字节数大于10kb,元素个数大于5000个,读取成本高,容易导致慢查询,主从复制异常,服务阻塞,无法正常响应请求,可能请求redis超时报错。
消除大key的方法,
1.拆成小key,一个string拆成多个string
2.压缩,压缩后写入redis,
3.如果是集合类结构 hash,list,set,可以拆分或者区分冷热,比如只存前十页数据,后续数据走db
热key没有一个明确的标准,qps超过500就有可能被识别为热key。
解决热key的方法:
1.localcache,相当于redis前一层的缓存。
2.拆分:热key复制写入多份,代价是更新多个key,可能会数据不一致
redis代理的热key承载能力,本质上结合了热key发现,localcache两个功能。
慢查询场景
容易导致redis慢查询的操作:
一次传入过多key,单批次不要超过100个key
zset大部分命令都是logn,大小不要超过5k
缓存穿透和雪崩
穿透:热点数据绕过缓存,直接查询数据库
- 查一个一定不存在的key
- 缓存过期,热点数据批量过期
避免方法:
- 缓存空值,都不存在,在缓存存一个空值
- 博隆过滤器,存合法key
雪崩:大量缓存同时过期
- 缓存空值,随机时间,
- 缓存集群