浅谈Redis(一)
Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,比如string、hash、list、set及sorted set等。
Redis的特点
- 内存存储:Redis主要使用内存存储数据,使得其读写速度非常快,也支持数据持久化,通过RDB和AOF,以确保数据的安全性。
- 支持主从结构:Redis支持主从复制模式,可以利用从实例进行将数据备份,从而提高系统的可用性和可靠性。
- 丰富的数据类型:Redis提供了字符串、哈希、列表、集合等多种数据类型,可以满足各种应用场景的需求。
- 支持过期策略:Redis允许为数据设置过期时间,到期的数据会自动被删除。
- 高性能:由于其单线程模型和高效的内存使用策略,在处理大量并发读写操作时很出色。
- Redis的应用场景很广泛,包括缓存、消息队列、实时统计、会话管理、社交网络的实时互动等。
Redis线程模型
- Redis内部使用单线程的文件事件处理器,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器进行处理。文件事件处理器结构包括多个socket、IO多路复用程序、文件事件分派器和事件处理器。
- 多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket并将socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件交给对应的事件处理器处理。
Redis单线程为什么快
- 纯内存操作,核心是基于非阻塞的IO多路复用机制。
- 单线程避免了多线程的频繁上下文切换问题,不用考虑多进程或多线程切换消耗的CPU,不需要考虑锁的问题。
Redis持久化方案
- Redis提供了RDB和AOF两种持久化方式,RDB是把内存中的数据以快照的形式写入磁盘,通过fork子进程执行,采用二进制压缩存储;而AOF是以文本日志的形式记录处理的每个写入或删除操作。
- RDB是把Redis的数据保存在单一的快照文件中,适合用来做容灾备份。如果在快照保存之前宕机,这段时间的数据会丢失,保存快照时可能导致服务短暂不可用。
- AOF对日志文件的是通过追加的方式写入,有灵活的同步策略,相同的数据集,AOF文件要比RDB大,运行效率比RDB低。
Redis缓存淘汰策略
无论是本地缓存还是分布式缓存,为了保证高性能,都采用内存保存数据,由于成本和内存限制,当存储的数据超过缓存容量时,需要对缓存的数据进行剔除。
- 一般缓存的剔除策略有淘汰最早数据FIFO、剔除最近最少使用LRU和剔除最近使用频率最低LFU。
- noeviction:当内存限制达到并且客户端尝试执行会让更多内存被使用的命令时返回错误。
- allkeys-lru:尝试回收最少使用的键,让新添加的数据有空间存放。
- volatile-lru:尝试回收在过期集合中最少使用的键。
- allkeys-random:回收随机的键。
- volatile-random:回收在过期集合中随机的键。
- volatile-ttl:回收过期集合中的键,并且优先回收存活时间较短的键。
Redis缓存穿透、击穿和雪崩区别和解决方案
- 缓存穿透是缓存和数据库中都没有的数据,而用户不断发起请求,比如发起id为-1的数据,用户可能是攻击者,攻击会导致数据库压力过大。我们可以在接口层增加校验,比如用户鉴权,id做基础校验等;缓存和数据库都取不到的数据,可以将键值对key-value写为key-null,缓存有效时间可以设置短一点;也可以使用布隆过滤器。
- 缓存击穿是指缓存中没有但数据库中有的数据,一般是缓存时间到期。我们可以为热点数据设置二级缓存并设置不同的失效时间;在第一个请求上加互斥锁;设置热点数据永不过期。
- 缓存雪崩是指缓存中数据大批量过期,而查询数据量巨大,引发数据库压力过大甚至宕机。我们可以为缓存数据设置随机的过期时间,防止同一时间大量数据过期现象发生;如果缓存数据库是分布式部署的,将热点数据均匀分布在不同缓存数据库中;设置热点数据永不过期。