redis技术点

1:redis的单线程模型:
	包含成员:socket连接,IO多路复用程序,队列,文件事件分派器,文件事件处理器。
	描述:IO多路复用程序,监听着所有socket,轮询IO多路复用程序,把socket一直压到队列中,文件事件分派器会根据不同的事件(ae_readable,ae_writable等),找到对应的	事件处理器,交给当前事件处理器处理完成之后,才会从队列中继续回去socket,继续相同的操作。
2:redis是单线程的,但是效率还是很高。
	1.非阻塞的IO多路复用程序
	2.事件处理器是基于内存,快速处理
	3.单线程反而避免了多线程上下文频繁切换的问题
3:redis的优点:
	高性能,高并发。
4:redis的过期策略:
	定期删除:定期抽查key,检查是否过期,过期就会删除,随机,所以只是部分。
	惰性删除:使用的时候,才会检查key是否过期,检查过期,就会删除key,并且返回客户端一个空。	
			 这会导致一个问题,大量的过期key堆积,导致redis内存耗尽,怎么处理?
			 答案:走redis的内存淘汰机制
			 		一般选择allkey-lru:移除最近最少使用的key(最常用)
  面试问题一:
  			设置了过期时间,当时redis内存占用还是很高?
  			答案:redis中的key到了过期时间,redis的定期删除只会定期的随机抽检key,删除过期的key,不会把所有的过期key全部删除了。只会调用的时候,才会删除过期key,保证数据正确。
  面试问题二:
  			redis中的数据消失了?
  			答案:redis中数据堆积,导致redis内存不足,redis按照redis的内存淘汰机制,删除部分key。
5:redis的内存淘汰机制:
		noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。(不用,非常不友好)
		allkeys-lru:在主键空间中,优先移除最近未使用的key。(常用)
		volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
		allkeys-random:在主键空间中,随机移除某个key。
		volatile-random:在设置了过期时间的键空间中,随机移除某个key。
		volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除
6:redis的高并发和高可用:
	一主多从,读写分离;
	master需要使用持久化机制(aof/rdb)
	master宕机,slave会自动接管master node,变成master
7:redis的并发竞争与解决方案:
	多个系统,同时操作同一个key,导致key对应的value出错。
	方案:
		分布式锁,并且需要判断数据的版本。
		1:zookeeper
		2:redis的分布式锁
8:高并发情况下,保证缓存,数据库双写一致性
	简单操作:先删除缓存,再修改数据库,再存入缓存
	复杂操作:把后面的请求放入队列中,串行化操作。
9:缓存穿透:正常情况下,我们去查询数据都是存在。
	那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。
	这种查询不存在数据的现象我们称为缓存穿透。

	解决方法:(1)缓存空值,并需要设置过期时间。后面相同查询key,可以直接返回,不走数据库。
	  		  (2)BloomFilter(布隆过滤器),在缓存之前在加一层 BloomFilter ,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB。
10:缓存击穿:在平常高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。
	解决方法:上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。

	其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
11:缓存雪崩:缓存雪崩的情况是说,当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上面。结果就是DB 称不住,挂掉。
解决方法: 
	事前:使用集群缓存,保证缓存服务的高可用
	事中:ehcache本地缓存 + Hystrix限流&降级,避免MySQL被打死
	事后:开启Redis持久化机制,尽快恢复缓存集群
12:热点数据集中失效:我们在设置缓存的时候,一般会给缓存设置一个失效时间,过了这个时间,缓存就失效了。
对于一些热点的数据来说,当缓存失效以后会存在大量的请求过来,然后打到数据库去,从而可能导致数据库崩溃的情况。

解决办法:
	(1)设置不同的失效时间
		为了避免这些热点的数据集中失效,那么我们在设置缓存过期时间的时候,我们让他们失效的时间错开。
		比如在一个基础的时间上加上或者减去一个范围内的随机值。

	(2)互斥锁
		结合上面的击穿的情况,在第一个请求去查询数据库的时候对他加一个互斥锁,其余的查询请求都会被阻塞住,直到锁被释放,从而保护数据库。
		但是也是由于它会阻塞其他的线程,此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值