Redis——面试+思想+应用

本文全面介绍了Redis,它是开源的高性能键值存储内存数据库,读写性能高且支持持久化和主从复制。阐述了其多种使用场景,如缓存、会话存储等。还介绍了不同集群方案,分析了各数据结构特点及操作。最后提及Redis模糊搜索方法及面试常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

提示:理论+方法+小总结

Redis基本介绍:

Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储的内存数据库。这里要区分开MySQL:
它支持多种基础数据结构
1、字符串(Strings)
2、哈希(Hashes)
3、列表(Lists)
4、集合(Sets
5、有序集合(Sorted Sets)
以及更高级的数据结构如
1、位图(Bitmaps)
2、超日志(Hyperloglogs)
4、地理空间索引(Geo indexes)

性能:

作为内存数据库,Redis的读写性能极高,能够支持每秒万级甚至百万级的读写操作,非常适合需要快速读写操作的场景

持久性和复制:

虽然Redis是基于内存的,但它支持数据的持久化。可以通过RDB(快照)或AOF(append-only file)方式将内存中的数据定期或实时保存到磁盘上,确保数据安全。此外,Redis支持主从复制功能,提高数据的可用性和冗余。

补充——重点:

抛开Redis在java项目开发中:不论是elasticsearch还是Rocketmq等等诸多中间件和框架只要是涉及到会存储的那么都是如下的思想:
1、定时
2、定量
这两种在和:同步、异步进行组合:
最终结果为:
定时-同步刷盘
定时-异步刷盘
定量-同步刷盘
定量-异步刷盘
从性能角度来讲:定量-异步刷盘性能最高,从数据安全性角度来讲:定时-同步刷盘安全性最高性能最低。

Redis额外支持的操作:

Redis不但支持基本的键值操作,还提供复杂的数据结构操作,如事务、管道(pipeline)、Lua脚本、发布/订阅模式等

使用场景:

Redis由于其高性能的特性,通常被用于以下场景:

1、缓存系统:减少数据库负载,提供快速响应;
2、会话存储:如Web应用中的用户会话管理;
3、消息队列:因其支持发布订阅模式(pub/sub);
4、实时分析:如计算在线用户数、排行榜等;
5、地理空间数据:支持地理空间索引和范围查询。

与Java的集成:

在Java应用中,可以通过使用Jedis、Redisson、redisTemplate、Lettuce等客户端库来和Redis进行交互。这些库提供API来执行Redis命令,处理连接池,以及实现复杂的功能如分布式锁等。
但是通常建议使用Redisson,这里提供的功能更多,如看门狗机制

Redis集群

Redis拥有多种集群解决方案,以提供高可用性和水平扩展功能。以下是几种常见的Redis集群配置和它们的特点:

Redis Sentinel

描述:主从复制的模式增加了Redis Sentinel系统以实现高可用性。Sentinel负责监控所有Redis节点,并在主节点故障时自动进行故障转移(Process Failover)。

优点:

1、故障发现和自动故障转移。
2、可以继续使用单个Redis实例,无需修改客户端代码。

缺点:

不提供自动分片,因此不能直接用于数据水平扩展;由于使用异步复制,仍有数据丢失的风险。

适用场景:

要求高可用但数据量不是特别巨大的场景。

Redis Cluster

描述:一个分布式数据库系统,通过自动将数据分片到多个Redis实例中来提供水平扩展和高可用性。

优点:

1、自动分片,可水平扩展;
2、支持主从复制,并提供故障转移功能;
3、无单点故障(No single point of failure,NSPF)。

缺点:

1、客户端需要支持Redis Cluster协议;
2、分片机制可能会限制某些复杂操作,例如,有些事务和键操作要求数据位于同一节点上。

适用场景:

大规模数据集和高吞吐量要求场景。

除了以上两种官方支持的解决方案外,还有一些社区或云服务提供商实现的Redis高可用和分布式解决方案:

Codis

描述:基于代理的Redis分片解决方案,通过增加一个代理层来实现Redis的水平扩展。

优点:

1、对客户端透明,不需要特别的客户端支持;
2、提供图形界面管理工具;
3、动态扩缩容。

缺点:

1、新增了代理层,增加了系统复杂性;
2、不是Redis官方支持的,社区维护可能不如官方活跃。

适用场景:

操作简单,需要容易管理的环境下的中小型Redis集群。

Redis Enterprise

描述:Redis官方推出的企业版本,提供自动分片、持久化、备份、高可用等功能。

优点:

1、官方支持,稳定性和性能有保障;
2、集成了许多高级功能,例如自动重平衡、热升级;
3、提供图形界面的管理平台。

缺点:

1、商业化产品,需要付费;
2、对开源社区选型有一定限制。

适用场景:

对性能和稳定性有非常高要求的企业级应用。
选择不同的Redis集群方案时,需要权衡数据规模、易用性、成本、客户端支持等因素。对于大部分应用来说,Redis官方提供的Sentinel和Cluster方案已经能够很好地满足需求。在一些特定的、对集群管理有更复杂要求的场景下,则可以考虑使用如Codis或Redis Enterprise等其他解决方案。

补充

我之前没有单独列出"主从复制"作为一种集群配置,但实际上它是Redis提供高可用性的基础,并且在Redis Sentinel和Redis Cluster中都扮演重要的角色。我们可以将主从复制单独说明:

主从复制(Replication)

主从复制是Redis支持的一种数据复制方式,它允许一个或多个副本(从服务器),实时地复制主服务器的数据。它的配置简单,主要用于数据的冗余备份、读写分离和提高数据安全性。

优点:

1、数据冗余:提供数据的多个副本,可以用于灾难恢复。
2、读写分离:读操作可以分布到多个从节点,减轻主节点压力。
3、数据备份:可在从节点上进行持久化操作,避免影响主节点性能。
4、可扩展性:通过增加从节点来水平扩展读取能力。

缺点:

1、写操作不可扩展:所有写操作仍然需要通过主节点,主节点成为瓶颈。
2、不自动故障转移:如果主节点宕机,需要人工介入或额外的工具(如Sentinel)进行故障转移。
3、数据存在延迟:从节点的数据同步可能存在延迟,不能保证强一致性。

适用场景:

1、数据备份和灾难恢复。
2、当应用对读取性能要求高,而对写入性能和强一致性要求不高时,可以搭配多从节点以分散读压力。
3、作为复杂高可用解决方案(如Sentinel和Cluster)的一部分。
4、主从复制通常是高可用和负载均衡配置的基础。
比如,在Redis Sentinel中,Sentinel负责监控主从服务器并自动执行故障转移操作。在Redis Cluster中,各个分片(shard)内部也会使用主从复制来确保数据的高可用性。

因此,即使没有单独列出主从复制作为一个集群配置选项,它实际上是构成其他高可用集群解决方案的关键组件。

数据结构

数据结构分析——操作

提示:先操作后思想+面试

Redis提供了多种数据结构,每种结构都适合不同的使用场景。下面是Redis支持的常用数据结构及其典型使用场景:

字符串(String)

场景:缓存用户信息、会话(Session)信息、计数器、分布式锁的值。
描述:可以包含任何数据,例如文本、数字或者序列化的对象。

操作
# 增
SET user:1 "John Doe"

# 删
DEL user:1

# 改
SET user:1 "Jane Doe"

# 查
GET user:1

底层数据结构

字符串在Redis中是最基本的数据类型,实际上是动态字符串sds(simple dynamic string)。
Redis的字符串是二进制安全的,可以包含任意数据,比如jpeg图片或序列化的对象。
特点:动态字符串意味着字符串长度可以在运行时修改,不像C语言的字符串以空字符终止,支持高效的长度计算和字符串追加操作。

哈希(Hash)

场景:存储对象数据,如用户的属性,避免频繁的加载和存储整个对象。
描述:键值对集合,适合存储对象。

操作
 # 增
HSET user:2 name "Alice" age "30" city "Wonderland"

# 删
# 删除特定字段
HDEL user:2 city
# 删除整个哈希
DEL user:2

# 改
HSET user:2 age "31"

# 查
HGET user:2 name
HGETALL user:2

底层数据结构

哈希在小数据集下使用ziplist(压缩列表),在数据量变大时转而使用hashtable。ziplist是Redis为内存优化设计的数据结构,压缩空间但对于元素的增删改查可能相对较慢。
特点:当哈希内的字段数量增长,或单个字段值超过某个阈值时,底层数据结构从ziplist升级到hashtable。

列表(List)

场景:实现队列(FIFO)或栈(LIFO)结构,比如消息队列。
描述:有序集合,按插入顺序排序。

操作
 # 增
LPUSH friends:1 "Bob"
RPUSH friends:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值