筑基期
1. 什么是 Redis?它的主要特点是什么?
Redis(Remote Dictionary Server)是一个开源的、基于内存存储的 NoSQL
数据库,支持丰富的数据结构,通常用于缓存和消息队列等场景。
Redis 的主要特点:
高性能:
Redis
是基于内存的数据库,数据存储和访问速度非常快,适合高并发场景。丰富的数据类型:支持五种基础数据类型(字符串、列表、集合、有序集合、哈希)和一些高级数据结构(如
HyperLogLog
、位图等)。持久化:
Redis
支持将数据持久化到磁盘,可以恢复数据,即使在重启时也不会丢失。发布/订阅模型:支持消息的发布和订阅,适合实时消息系统。
分布式支持:可以通过
Redis Cluster
进行水平扩展,支持高可用和分布式环境。
2. Redis 支持哪些数据类型?这些数据类型的应用场景是什么?
字符串(String):
应用场景:缓存简单的键值对、计数器、存储 JSON 或序列化后的数据。
示例命令:
SET key value
,GET key
列表(List):
应用场景:实现队列或栈,消息队列、任务队列等。
示例命令:
LPUSH key value
,RPOP key
集合(Set):
应用场景:存储无序且唯一的元素,如标签集合、去重等。
示例命令:
SADD key value
,SMEMBERS key
有序集合(Sorted Set,ZSet):
应用场景:实现排行榜、按权重排序的场景,如游戏得分排行榜。
示例命令:
ZADD key score value
,ZRANGE key 0 -1 WITHSCORES
哈希(Hash):
应用场景:存储对象或用户信息等复杂结构,每个键对应多个字段。
示例命令:
HSET key field value
,HGET key field
3. 如何在 Redis 中设置和获取键值对?常用的 Redis 命令有哪些?
设置键值对
SET key value
示例
SET username "Alice"
这条命令将键 username
的值设置为 "Alice"
。
获取键的值
GET key
示例
GET username
这条命令将返回键 username
对应的值,即 "Alice"
。
其他常用命令
DEL key:删除键。
EXISTS key:检查键是否存在。
INCR key:对数值键进行自增操作。
EXPIRE key seconds:设置键的过期时间。
4. Redis 是如何持久化数据的?有哪些持久化方式?
Redis
提供了两种主要的持久化方式,确保数据在断电或重启时不会丢失。
RDB(Redis Database Backup):
Redis
会定期生成整个内存快照,并将其保存到磁盘上。优点:占用资源少,适合备份和快速恢复大规模数据。
缺点:可能在
Redis
崩溃前的一段时间内丢失数据。触发 RDB 快照的命令:
SAVE BGSAVE
AOF(Append Only File):
Redis
会将每条写入命令记录到日志文件中,Redis
重启时会根据AOF
日志重放命令恢复数据。优点:数据丢失最小,可以设置每次写入操作后立刻记录日志。
缺点:日志文件较大,写入频繁时性能较低。
AOF 配置:
appendonly yes
如果希望减少数据丢失,建议使用 AOF。
如果需要更好的性能并且可以接受少量数据丢失,使用 RDB。
5. Redis 的内存管理机制是什么?如何处理内存不足的情况?
Redis
是基于内存的数据库,所有数据存储在内存中。当内存不足时,Redis
会根据配置采取相应措施。
内存管理机制
maxmemory:
Redis
可以通过配置maxmemory
参数来限制可使用的最大内存大小。内存淘汰策略:当达到内存上限时,
Redis
提供了多种淘汰策略,可以根据需要进行配置。
常见的内存淘汰策略有:
noeviction:不再接受写入请求,直接返回错误。
allkeys-lru:在所有键中,移除最近最少使用的键(
LRU 算法
)。volatile-lru:只从设置了过期时间的键中,移除最近最少使用的键。
allkeys-random:随机移除任意键。
配置内存淘汰策略:
maxmemory 2gb
maxmemory-policy allkeys-lru
6. 如何在 Redis 中设置键的过期时间?
Redis
支持为键设置过期时间,过期后键会自动被删除。
设置过期时间可以通过 EXPIRE
或 SETEX
命令。
设置过期时间
EXPIRE key seconds
示例:
EXPIRE session_token 3600
该命令为 session_token
键设置了 3600
秒(1
小时)的过期时间,1
小时后该键将被自动删除。
使用 SETEX
设置键值和过期时间:
SETEX key seconds value
示例:
SETEX session_token 3600 "abc123"
这个命令同时设置了键值对 session_token
和过期时间。
查看剩余过期时间:
TTL key
返回剩余的生存时间(秒),若返回 -1
,则表示该键没有设置过期时间。
7. Redis 中的发布/订阅(Pub/Sub)模式是什么?它的应用场景有哪些?
发布/订阅(Pub/Sub) 是 Redis
支持的一种消息传递模式,允许消息的发布者和订阅者在不同的通道中进行通信。
发布者发送消息到一个通道,订阅者可以实时接收到该通道的消息。
示例
订阅频道
SUBSCRIBE my_channel
发布消息
PUBLISH my_channel "Hello, Redis!"
应用场景
实时消息系统:如聊天应用、即时通知等场景中,多个客户端需要实时接收消息。
系统事件广播:系统内部模块之间通过 Redis 进行事件广播,如任务完成通知、状态变更等。