Redis 学习

248 阅读3分钟

1.Redis数据结构 List, hash ,set ,sorted set , String. 进阶: HyperLogLog, Geo, Pub/Sub

2.Redis 雪崩

一般就是电商首页或者热点数据需要做缓存,一般缓存都是用定时任务去刷新,或着查不到才去更新。定时任务刷新就会有问题,就是如果当前缓存的key同时都失效了,则此时请求就会直接请求数据库来查询,如果请求数非常多就会立刻打崩数据库,此时就算重启数据库也会立马被新的流量打死。这就是缓存雪崩。

解决方法就是(1)将每个key的过期时间加上一个随机值,这样就能保证数据不会在同一时间大面积失效。 (2)如果redis是集群部署,将热点数据均匀分布在不同的redis库中 (3)设置热点数据永不过期,有更新操作就更新缓存。

  1. 缓存穿透/击穿

缓存穿透指用户请求缓存和数据库中都没有的数据,这样的攻击会导致数据库压力太大而崩掉。 所以必须要对参数进行校验。

缓存击穿指的是一个Key非常热点,一直在不停的杠着很大的并发量,大并发量集中的对就这一个点进行访问,在这个key失效的瞬间,很大的并发量直接就会穿破缓存,直接请求数据库。 缓存雪崩是大面积的缓存失效,打崩了数据库,而缓存击穿是击穿了某一个key。

解决方法:缓存穿透:接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力

缓存击穿:配置网关层NGinx,让对单个IP每秒访问次数超过阈值的的ip都拉黑。 是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。

image.png

  1. Redis为什么这么快?

image.png

因为redis是单进程单线程的,所以常用redis集群,并且是主从同步读写分离, redis cluster支撑起N个redis master node , 每个master node 都可以挂载多个 slave node.这样就可以横向扩容更多的master node.

  1. Redis持久化方式 RDB:对redis中的数据进行周期性的持久化 优点:适合做冷备,对redis性能影响小,数据恢复比AOF快。 缺点:从本次备份到下次备份之间的数据可能会丢失。还有就是RDB在生成数据快照的时候,如果这个文件很大则会使系统卡顿。

AOF:AOF机制对每条写入命令作为日志,以append-only的方式写入一个日志文件中,因为是只追加的模式,所以没有任何磁盘寻址的开销。 优点:AOf是一秒一次通过后台的线程fsync操作,最多丢一秒的数据。且写入性能惊人, 缺点:aof文件比rdb文件大,aof开启后redis支持写的QPS比RDB支持写的低。