16.redis| 青训营笔记

75 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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

雪崩:大量缓存同时过期

  • 缓存空值,随机时间,
  • 缓存集群