redis学习笔记

一、nosql

1、简介

nosql:not only sql,泛指非关系型数据库。是对关系型数据库的一个补充,为啥叫补充?数据该存在磁盘还是得存,不能全丢内存。
特征:
1⃣可扩容、可伸缩;
2⃣大数据量下高性能;
3⃣灵活的数据模型;
4⃣高可用;

2、常见的nosql数据库

redis/hbase/memcache/mongoDB

二、redis简介

redis:是用C语言开发的一个开源的高性能键值对数据库。
特征:
①数据间没有必然的关联关系;
②内部采用单线程机制进行工作;
③高性能;
④多数据类型支持(string,list,hash,set,sorted_set)
⑤持久化支持,可存硬盘上,进行灾备数据恢复

哨兵:一个独立的分布式系统,用于对主从结构中的每台服务器进行监控,对用slave故障后进行下线,master故障后通过投票机制选取新的master,并下线故障master,最后将所有slave重新连接到新的master上。即监控、通知、自动故障转移。哨兵也是一个redis服务器,只是不提供对外服务。
哨兵模式优点:提供自动化运维的能力。
哨兵模式缺点:水平拓展困难。

三、redission分布式锁实现原理

在这里插入图片描述

四、redis持久化

通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。
持久化的两种方式:
①RDB:redis默认的方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件,即Snapshot快照存储,对应产生的数据文件为dump.rdb。
②AOF:类似mysql的binlog,每次收到的写命令都通过Write函数追加到文件最后。
当两种方式都开启的时候,redis数据恢复会优先选择AOF进行恢复。

五、缓存雪崩、穿透、击穿

1、缓存雪崩

描述:服务器出现故障导致缓存丢失,或者缓存同一时间大面积的失效(比如超时时间设置1个小时,预热的时候同时将1亿数据刷到缓存中,1小时后,大面积的key就会同时失效),从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
解决方案:
①高可用。通过哨兵或者集群架构提升缓存层的高可用,一台机器出现问题能迅速进行故障迁移;
②限流降级。缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
③数据预热分散超时时间。防止短时间内大量key失效。

2、缓存穿透

描述:请求查询的key在redis没有,这时就会去查数据库,但是数据库也没有,所以也不会刷到缓存里。如果这样的请求多了,就会造成数据库大量的空查询,且把请求全压到数据库上,造成数据库压力。
解决方案:
第一种:简单粗暴,如果数据库中没有记录,则把这个key刷到redis中,value可以记成空字符串或者字符串的”null“,这样下次请求进来就会拿到redis的值,不会打到数据库中。缺点:浪费大量的redis空间。
第二种:专业的做法,通过布隆过滤器实现。服务启动的时候,将全量数据刷到本地缓存的布隆过滤器中,先过一遍布隆过滤器,如果返回”可能存在“的话,再redis和mysql。
引申-> 布隆过滤器:一种散列概率型哈希数据结构。如果返回key不存在,则一定不存在;如果返回key存在,则这个key可能存在在数据库里。概率值可以通过参数调整,默认为97%,guava工具包有提供相关实现。优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率,且因为容易发生哈希碰撞所以删除困难,guava也没有实现删除的方法。

3、缓存击穿

描述:指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案:
第一种:简单粗暴,把超时时间设得很长或者永不过期。
第二种:如果缓存失效,拿到的结果为空,这个时候是去查数据库,但是在查数据库前加一个分布式锁,不让大量的请求直接打到数据库去。

六、过期和淘汰机制

1、redis过期策略

定期删除+惰性删除
定期删除:redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
惰性删除:获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期,如果过期了此时就会删除。
①Q:为啥不使用定时删除?
A:用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key。
②Q:采用定期删除+惰性删除,存储空间就没问题了吗?
A:不是的。如果定期删除没删除key,然后你也没及时去请求key使惰性删除生效,这样redis的内存会越来越高。redis的解决方案:内存淘汰机制。

2、redis内存淘汰机制

在redis.conf中配置maxmemory-policy策略。redis提供以下6种策略:
volatile-lru:从已设置过期时间的key中删除最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的key中删除将要过期的数据淘汰
volatile-random:从已设置过期时间的key中任意选择数据淘汰
allkeys-lru:从所有key中挑选最近最少使用的数据淘汰
allkeys-random:从所有key中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,若内存满了,新写入操作会报错

七、redis为什么这么快

(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制
PS: redis 为什么是单线程的
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。并且多线程会频繁造成CPU上下文切换导致CPU性能降低。Redis利用队列技术将并发访问变为串行访问。

八、redis线程模型

在这里插入图片描述
多个socket(多个套接字)进行请求发起,IO多路复用持续监听消息,并将请求加入队列中,文件事件分派器从队列里取出请求,单线程依次将请求分派给处理器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值