软考、面试Redis知识点总结-1

一、Redis的数据类型

Redis支持多种数据类型,包括String、Hash、List、Set和Sorted Set等。每种数据类型都有不同的特点和适用场景。

(1)String(字符串):

String类型是Redis最基本的数据类型,可以存储任意类型的数据,如文本、数字等。它是二进制安全的,可以进行一些基本的字符串操作,如获取、设置、增加、减少等。String类型的应用场景包括:

– 缓存:可以将经常查询的数据缓存在Redis中,提高读取速度。

– 计数器:可以将计数器的值存储在String中,并使用自增/自减操作来实现计数功能。

– 分布式锁:可以使用String类型来实现分布式锁的功能,在多个应用实例之间进行同步控制。

(2)Hash(哈希):

Hash类型是一种键值对集合,类似于关联数组,可以存储多个字段和对应的值。Hash类型适用于存储对象、结构化数据等。Hash类型的应用场景包括:

– 用户信息存储:可以将用户的各个属性存储在Hash中,如用户ID、姓名、年龄等。

– 商品信息存储:可以将商品的各个属性存储在Hash中,如商品ID、名称、价格等。

– 文章信息存储:可以将文章的各个属性存储在Hash中,如文章ID、标题、内容等。

(3) List(列表):

List类型是一个有序的字符串列表,可以进行插入、删除、获取等操作。List类型适用于存储一组有序的数据。List类型的应用场景包括:

– 消息队列:可以将消息存储在List中,生产者向List尾部插入消息,消费者从List头部获取消息。

– 最新列表:可以将最新的数据存储在List中,如最新发布的文章、最新注册的用户等,用于展示或统计。

– 聊天记录:可以将聊天记录存储在List中,每次聊天都将消息插入List尾部,可以轻松获取聊天的历史记录。

(4) Set(集合):

Set类型是一个无序的字符串集合,可以进行添加、删除、查找等操作。Set类型适用于存储不重复的数据。Set类型的应用场景包括:

– 标签系统:可以将标签存储在Set中,每个对象关联的标签存储在对应的Set中,方便进行标签搜索、交集操作等。

– 点赞系统:可以将用户点赞的对象存储在Set中,判断用户是否点赞、统计点赞数量等操作。

– 用户已关注系统:可以将用户已关注的对象存储在Set中,进行已关注、取消已关注、获取已关注列表等操作。

(5)Sorted Set(ZSet,有序集合):

   Sorted Set类型是一个有序的字符串集合,每个元素都有一个分数,可以根据分数对元素进行排序。Sorted Set类型适用于存储有序的数据和排行榜等场景。Sorted Set类型的应用场景包括:

– 排行榜:可以将用户的分数存储在Sorted Set中,根据分数进行排名和查找,实现排行榜功能。

– 集合交集操作:可以将集合的元素和对应的分数存储在Sorted Set中,进行交集、并集、差集等操作。

– 过期任务:可以将任务的执行时间和任务内容存储在Sorted Set中,定时检查Sorted Set中的任务,执行到期的任务。

二、MemCache和Redis的比较

MemCache和Redis比较的维度:

【1】数据类型:

MemCache:仅支持简单的键值对数据类型。

Redis:支持更多的复杂数据类型,如字符串、列表、哈希、集合和有序集合。

【2】持久性:

MemCache:不支持数据持久化,数据仅存储在内存中,一旦重启或崩溃,所有数据将丢失。

Redis:支持数据持久化,可以将数据保存到磁盘上,重启后可以从磁盘恢复数据。

【3】分布式存储:

MemCache:不支持分布式存储,每个节点都是独立的。

Redis:支持分布式存储,可以将数据分布在多台机器上,通过集群的方式提高存储容量和性能。

【4】多线程支持:

MemCache:支持多线程,但是没有内置的多线程安全机制。

Redis:支持多线程,并且具有内置的多线程安全机制。

【5】内存管理:

MemCache:使用简单的LRU(最近最少使用)算法来管理内存。

Redis:使用复杂的内存管理算法,支持配置不同的淘汰策略,并且可以限制内存使用量。

【6】事务支持:

MemCache:不支持事务,每个操作都是原子的。

Redis:支持事务,可以将多个操作打包在一起作为一个原子操作执行。

【7】数据容灾:

MemCache:不提供数据容灾机制,一旦节点崩溃,数据将丢失。

Redis:提供数据容灾机制,支持主从复制和持久化,可以通过备份节点实现数据的容灾。

综上所述,MemCache适用于简单的键值对缓存需求,而Redis适用于更复杂的数据类型和功能需求。Redis还提供了更高级的功能,如事务支持和数据容灾,适用于需要更高级别的数据处理和可靠性的应用场景。

三、redis集群常见切片方式

Redis切片是指将一个 Redis 集群分成多个片(shards),每个片存储一部分数据,并且可以水平扩展和提高整体系统的吞吐量和容量。下面分别从客户端切片、中间件实现切片、客户端服务端协作切片三个方面来详细谈谈 Redis 切片的方式。

(1)客户端切片:

客户端切片是指客户端根据某种算法,将数据请求分发到不同的 Redis 节点上。常见的切片算法有哈希切片和一致性哈希切片。客户端负责决定将数据存储在哪个节点上,并且在读写操作时定位正确的节点。这种方式的优势是简单易实现,不需要额外的中间件,但也存在一些限制,如增加或减少节点时需要重新计算切片,可能导致数据迁移的开销。

(2)中间件实现切片:

中间件实现切片是指引入一个独立的中间件来处理客户端和 Redis 集群之间的交互。中间件负责接收客户端的请求,根据某种算法选择正确的节点,并将请求转发给相应的 Redis 节点。同时,中间件还负责管理集群的拓扑信息,包括节点的增删和数据迁移等。常见的中间件有Twemproxy、Codis和Redis Cluster Proxy等。这种方式的优势是可以将切片逻辑集中在中间件中,客户端无需关心切片细节,同时中间件可以提供一些额外的功能,如负载均衡和故障转移等。

(3)客户端服务端协作切片:

 客户端服务端协作切片是指客户端和 Redis 服务器共同完成切片操作。Redis Cluster 是官方提供的分布式解决方案,采用这种方式实现切片。Redis Cluster 将整个集群划分为多个槽位(slot),每个槽位对应一个数据片段,集群中的每个节点负责一部分槽位。当客户端发送请求时,首先根据 Key 计算出相应的槽位,然后将请求发送给负责该槽位的节点。这种方式的优势是在 Redis Cluster 中实现了自动的数据迁移和故障转移,不需要额外的中间件,同时提供了较好的性能和可扩展性。

总结来说,Redis 切片可以通过客户端切片、中间件实现切片和客户端服务端协作切片等方式来实现。选择合适的切片方式需要考虑系统的复杂性、可扩展性、性能要求和对容错性的需求。每种方式都有自己的优势和限制,根据具体的应用场景选择适合的切片方式。

四、数据分片方案

Redis数据分片是将数据分散存储在多个节点上的技术,用于实现数据的横向扩展和提高系统的吞吐量。Redis提供了几种常见的数据分片策略,包括范围分片、哈希分片和一致性哈希分片。

(1)范围分片

范围分片是将数据按照某个字段的范围进行划分,每个节点负责存储一定范围内的数据。例如,可以按照用户ID进行分片,节点1负责存储ID范围从1到1000的用户数据,节点2负责存储ID范围从1001到2000的用户数据,以此类推。范围分片的优点是简单直观,适用于数据量较大但分布均匀的场景。然而,范围分片可能会导致数据不均衡的问题,某些节点上的数据量可能会很大,而其他节点上的数据量很小。

(2)哈希分片

哈希分片是将数据通过哈希函数映射到不同的节点上。例如,可以使用用户ID的哈希值对节点数取模,将用户数据分散存储在不同的节点上。哈希分片的优点是可以均匀地将数据分散存储在各个节点上,避免了数据不均衡的问题。然而,哈希分片可能会导致数据迁移的问题,当节点数量发生变化时,部分数据需要迁移至新的节点。

(3)一致性哈希分片

 

一致性哈希分片是在哈希分片的基础上引入虚拟节点,解决了节点数量变化时数据迁移的问题。一致性哈希分片使用一致性哈希算法,将每个节点和虚拟节点映射到一个哈希环上。数据通过哈希函数映射到哈希环上的位置,然后顺时针找到离它最近的节点或虚拟节点,确定存储的位置。一致性哈希分片的优点是节点数量变化时只会影响少量数据的迁移,而不是全部数据。它能够提供较好的数据均衡性和扩展性。

总结来说,Redis数据分片是实现数据横向扩展的重要手段。范围分片、哈希分片和一致性哈希分片是常用的数据分片策略,每种策略都有自己的优点和限制,需要根据具体的应用场景选择适合的分片策略。

五、Redis的分布式存储方案

Redis集群是一种分布式的Redis解决方案,用于实现高可用性和横向扩展。Redis集群提供了三种模式:主从模式(Master/Slave)、哨兵模式(Sentinel)和集群模式(Cluster)。

(1)主从模式(Master/Slave)

 主从模式是Redis最简单的集群模式,由一个主节点和多个从节点组成。主节点负责处理所有的写操作,而从节点则复制主节点的数据,并且只能处理读操作。主节点和从节点通过异步复制来保持数据的一致性。主从模式的优势是简单易用,在主节点发生故障时可以快速切换到从节点。然而,主从模式存在单点故障问题,如果主节点失效,整个集群将不可用。

(2)哨兵模式(Sentinel)

哨兵模式是在主从模式基础上引入了一组哨兵节点来监控主节点的状态,并在主节点故障时自动切换到备用节点。哨兵节点通过相互通信和心跳检测来监控主节点的健康状态。当主节点失效时,哨兵节点会选举一个新的主节点,并通知其他从节点进行切换。哨兵模式的优势是可以提供高可用性和故障转移,但也存在一些限制,如需要额外的哨兵节点来实现监控和切换,还需要进行手动配置。

(3)集群模式(Cluster)

集群模式是Redis官方推荐的分布式解决方案,由多个节点组成,没有主从的概念。集群模式通过哈希槽(hash slot)将数据划分到不同的节点上。每个节点负责处理一部分槽位的数据,并通过Gossip协议进行数据迁移和故障转移。集群模式具有良好的可扩展性,可以动态添加或删除节点,同时提供故障转移和数据迁移的自动化。集群模式的优势是提供了高可用性和横向扩展,但也存在一些限制,如对于一些不支持哈希槽的命令需要手动处理。

总结来说,Redis集群提供了主从模式、哨兵模式和集群模式三种不同的部署方式。选择合适的集群模式需要考虑对高可用性、横向扩展和数据一致性的需求。每种模式都有自己的优势和限制,根据具体的应用场景选择适合的集群模式。

六、redis淘汰算法

Redis中的淘汰算法用于在内存不足时选择要删除的键。Redis提供了多种淘汰算法,可以根据业务需求和数据特点进行选择。以下是几种常见的淘汰算法:

(1) noeviction(不淘汰)

当内存不足以容纳新写入的数据时,Redis将会返回错误信息。这种情况下,需要手动释放内存或者增加可用内存空间。

(2)volatile-random(随机淘汰)

当内存不足以容纳新写入的数据时,Redis将从设置了过期时间的键中随机选择一个进行淘汰。这种算法适用于对内存空间要求不严格的场景。

(3)volatile-lru(最近最少使用淘汰)

当内存不足以容纳新写入的数据时,Redis将从设置了过期时间的键中选择最近最少使用的键进行淘汰。这种算法可以保留最常被使用的数据。

(4)volatile-ttl(针对过期时间淘汰)

 当内存不足以容纳新写入的数据时,Redis将从设置了过期时间的键中选择剩余过期时间最短的键进行淘汰。这种算法可以优先淘汰即将过期的数据。

(5)allkeys-random(全局随机淘汰)

 当内存不足以容纳新写入的数据时,Redis将从所有的键中随机选择一个进行淘汰。这种算法适用于对内存空间要求不严格的场景。

(6)allkeys-lru(全局最近最少使用淘汰)

当内存不足以容纳新写入的数据时,Redis将从所有的键中选择最近最少使用的键进行淘汰。这种算法可以保留最常被使用的数据。

具体选择哪种淘汰算法取决于应用场景和数据特点。如果对内存空间非常敏感,可以选择volatile-lru或volatile-ttl算法,保留经常使用的数据。如果对内存空间要求不严格,可以选择volatile-random或allkeys-random算法,随机淘汰。需要注意的是,使用基于LRU的算法可能会导致性能下降,因为需要记录和计算最近使用的数据。

七、Redis持久化

RDB持久化和AOF持久化是Redis中常用的两种数据持久化方式,它们都用于将Redis中的数据写入磁盘以实现数据的持久化存储。下面对它们进行详细的解释和比较:

(1)RDB持久化

RDB持久化是将Redis的数据保存到一个二进制文件中。它是通过将当前数据库的数据快照写入磁盘来实现的。RDB持久化是Redis的默认持久化方式。

优点:

   – RDB持久化适用于数据量较大、数据变动较少的场景,因为它可以产生一个非常紧凑和高效的数据文件。

   – RDB文件通常比AOF文件更小,因为它是使用二进制格式存储的,而不是文本格式。

   – RDB文件的恢复速度通常比AOF文件更快,因为它只需要将整个数据文件加载到内存中即可。

缺点:

   – RDB持久化是间隔性的,Redis会根据配置的条件定期保存数据。如果Redis意外崩溃,最后一次保存的数据可能会丢失。

   – 在保存数据时,Redis主进程会被阻塞,可能会影响服务的性能。

   – RDB文件恢复时只能恢复到最后一次保存的数据,中间的数据更新可能会丢失。

 应用场景:

   – 数据量大,且对数据的恢复速度要求较高的场景。

   – 不需要实时持久化数据,可以接受一定数据丢失的场景。

(2)AOF持久化

 AOF持久化是将Redis的操作日志以追加写的方式写入一个文件中。它记录了每一条写命令,包括写入的数据和对数据的修改操作。

   优点:

   – AOF持久化可以更精确地恢复数据,因为它记录了每一条写命令。

   – AOF文件是一个文本文件,可以读取和修改,方便进行数据修复和恢复。

   – AOF文件支持自动重写,可以压缩和优化文件大小,减少磁盘占用。

   缺点:

   – AOF文件通常比RDB文件大,因为它记录了每一条写命令。这可能导致占用更多的磁盘空间。

   – AOF文件的恢复速度可能比RDB文件慢,因为需要逐条执行写命令进行数据恢复。

   应用场景:

   – 对数据的恢复精确性要求较高的场景。

   – 数据变动频繁的场景。

在实际应用中,可以根据具体的需求和情况选择RDB持久化或AOF持久化,甚至可以同时使用两种方式进行数据持久化。可以通过配置Redis的持久化参数来选择使用哪种方式,或者根据实际情况进行动态调整。

八、Redis常见问题

(1)缓存雪崩:

问题:缓存雪崩指的是缓存中大量的缓存数据同时失效,导致大量请求直接落到数据库上,给数据库带来巨大压力,甚至导致数据库宕机。

解决方案:

【1】设置不同的过期时间,避免大量缓存同时失效。例如在一个固定的缓存时间的基础上 + 随机  一个时间。

【2】使用锁后者队列,保证不会有大量的线程对数据库进行一次性读写,从未避免失效时大量的请求落在底层存储系统上

【3】使用备份缓存机制,比如设置一个热备份缓存,当主缓存失效时,可以从备份缓存中获取数据。

(2)缓存穿透

 问题:缓存穿透指的是请求的数据在缓存和数据库中都不存在,导致每次请求都直接落到数据库上,增加数据库的负载。

解决方案:

【1】使用布隆过滤器来过滤掉不存在的数据请求,避免对数据库进行无效查询。

【2】在缓存中设置空值的默认值,当缓存查询结果为空时,将空值标志也缓存起来,下次相同请求可以直接返回空值,避免对数据库进行查询。

(3)缓存预热

  问题:缓存预热指的是在系统启动之初,将一些常用的数据预先加载到缓存中,避免冷启动时大量请求直接落到数据库上。

 解决方案:

 【1】在系统启动时,通过数据加载或异步任务将热门数据加载到缓存中。

 【2】设置定时任务,定期更新缓存中的数据,保持数据的新鲜度。

(4)缓存更新

 问题:在数据更新时,需要同步更新缓存,避免脏数据的读取。

 解决方案:

【1】使用缓存更新策略,在数据更新时,及时更新缓存中对应的数据。

【2】使用延时双删策略,即在数据更新时,先删除缓存中的数据,然后异步更新数据,避免并发请求直接落到数据库上。

(5)缓存降级

  问题:在高并发场景下,缓存失效或出现故障时,需要有相应的降级策略,保证系统的稳定性。

  解决方案:

 【1】设置默认值,当缓存失效或故障时,返回默认值而不是直接落到数据库。

 【2】 使用有限期缓存,即在缓存失效时,返回旧的缓存数据,同时异步更新缓存。

以上是Redis中常见的缓存问题及其解决方案。在实际应用中,可以根据具体的业务场景和需求,选择相应的解决方案来保证缓存的稳定性和性能。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容