redis知识点

原创
01/26 09:32
阅读数 59
1.redis持久化机制
redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化,当redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的
实现:
单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,在用这个临时文件替换上一次快照文件,然后子进程退出,内存释放。
RDB是redis默认的持久化方式。按照一定的时间周期策略把内存的数据已快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。(快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。)
AOF:redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于mysql的binlog。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当这两种方式同事开启时,数据恢复redis会优先选择AOF恢复。
2.缓存雪崩
缓存雪崩我们可以简单理解为:由于原有缓存失效,新的缓存未到期间。
(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现了大面积的缓存过期),所有原本应该访问缓存请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
解决方法:
大多数系统设计者考虑用加锁(最多的解决方案)或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单的方案就是讲缓存失效的时间分散开。
3.缓存穿透
缓存穿透是指用户查询数据,在数据库中没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这样也是经常提的缓存命中率的问题。
解决方法:
最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
另外也有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长也不超过五分钟。通过这个直接设置的默认值存放到缓存,这样第二次到缓存中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
4.缓存穿透与缓存击穿的区别
缓存击穿:是指一个key非常热点,在不停的扛着大并发,大并发集中对这一点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据。
解决方案:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。
5.缓存预热
缓存预热这个应该是一个比较常见的概念,相信很多小伙伴都应该可以很容易理解,缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后将数据缓存的问题,用户直接查询事先被预热的缓存数据!
解决思路:
1.直接写个缓存刷新页面,上线时手工操作下;
2.数据量不大,可以在项目启动的时候自动进行加载;
3.定时刷新缓存;
6.缓存更新
除了缓存服务器自带的缓存失效策略之外(redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行子自定义的缓存淘汰,常见的策略有两种:
1.定时取清理过期的缓存;
2.当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。
两者各有优势,第一种缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂,具体用那种方案,大家可以根据自己的应用场景来权衡。
7.缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。
降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(比如加入购物车、结算)。

8.RDB和AOF区别:https://www.cnblogs.com/zxs117/p/11242026.html

展开阅读全文
打赏
0
0 收藏
分享
加载中
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部