Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存可持久化日志型Key-Value数据库,并提供多种语言的API。

Redis支持的数据类型有String、Hash、List、Set、Sorted Set。除了这5种数据类型之外还有 Bitmap、HyperLogLog、Stream等。

1.Redis作用

设置缓存,加速查询(缓存数据都放在内存中,不用执行缓慢的I/O操作)

redis 缓存共享 redis缓存管理_redis 缓存共享

 

 

2.定期删除

应用程序自行设置超时时间,将超时的过期内容删除,腾出内存空间。

过期内容太多,全面扫描耗费大量时间,影响查询,因此随机删除其中的一部分。

redis 缓存共享 redis缓存管理_缓存_02

 

 

 3.惰性删除

定期删除中,存在一直未被随机算法选中的过期内容。对于此类数据,采用惰性删除(被动式触发):

当查询遇到超时数据时,则将其删除。

redis 缓存共享 redis缓存管理_数据_03

 

 

 4.内存淘汰策略

即使有     定时删除 + 惰性删除, 但若出现过期内容未被查询或设置的超时时间过长, 还是很容易出现内存用尽的情况。

因此在二者的基础上,提出 8 种内存淘汰策略供应用程序选择:

redis 缓存共享 redis缓存管理_数据_04

 

 

 5.缓存穿透、缓存击穿、缓存雪崩

缓存穿透(Cache penetration)指访问一个缓存和数据库中都不存在的key,由于这个key在缓存中不存在,则会到数据库中查询;

数据库中也不存在该key,无法将数据添加到缓存中,所以每次都会访问数据库导致数据库压力增大。

解决方法:

  1. 将空key添加到缓存中。
  2. 使用布隆过滤器过滤空key。
  3. 一般对于这种访问可能由于遭到攻击引起,可以对请求进行身份鉴权、数据合法行校验等。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

缓存击穿(Cache breakdown)指大量请求访问缓存中的一个key时,该key过期了,导致这些请求都去直接访问数据库,短时间大量的请求可能会将数据库击垮。

解决方法:

  1. 添加互斥锁或分布式锁,让一个线程去访问数据库,将数据添加到缓存中后,其他线程直接从缓存中获取。
  2. 热点数据key不过期,定时更新缓存,但如果更新出问题会导致缓存中的数据一直为旧数据。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

缓存雪崩(Cache avalanche)指在系统运行过程中,缓存服务宕机或大量的key值同时过期,导致所有请求都直接访问数据库导致数据库压力增大。

解决方法:

  1. 将key的过期时间打散,避免大量key同时过期。(过期时间均匀分布)
  2. 对缓存服务做高可用处理。
  3. 加互斥锁,同一key值只允许一个线程去访问数据库,其余线程等待写入后直接从缓存中获取。

对于缓存击穿和缓存雪崩常采用:过期时间均匀分布 + 热点数据永不过期