当前位置: 首页 > article >正文

Redis缓存:春招面试的关键知识点

在上一篇文章中,我们深入探讨了MySQL数据库的核心知识,包括索引、事务和锁机制,这些对于保证数据的高效存储和一致性至关重要。而在当今的互联网应用中,为了提升系统性能和响应速度,缓存技术不可或缺。Redis作为一款高性能的内存数据库,常被用作缓存层,在各类项目中广泛应用。对于春招面试,掌握Redis的相关知识能为你增添不少竞争力,下面我们就来深入了解。

一、Redis数据结构

Redis支持多种数据结构,每种数据结构都有其独特的应用场景。

  • 字符串(String):最基本的数据结构,可以存储字符串、整数或二进制数据。常用于缓存简单的键值对,如用户信息、配置参数等。例如,可以将用户的登录信息以user:123(123为用户ID)为键,用户详细信息的JSON字符串为值存储在Redis中。获取用户信息时,通过键直接读取,极大提高了查询效率。
# 设置键值对
SET user:123 '{"name":"张三","age":25,"email":"zhangsan@example.com"}'

# 获取值
GET user:123
  • 哈希(Hash):用于存储字段和值的映射表,适合存储对象的属性。比如,将用户的详细信息以字段和值的形式存储在哈希结构中,每个字段对应一个属性。这样在更新用户的某个属性时,无需更新整个对象,只需修改对应的字段即可。
# 设置哈希字段
HSET user:123 name 张三
HSET user:123 age 25

# 获取哈希所有字段和值
HGETALL user:123
  • 列表(List):是一个双向链表,可以进行元素的插入和删除操作。常用于实现消息队列、排行榜等功能。以消息队列为例,生产者通过RPUSH命令将消息插入到列表中,消费者通过LPOP命令从列表中取出消息进行处理,实现了消息的异步传递。
# 生产者插入消息
RPUSH message_queue "消息1"
RPUSH message_queue "消息2"

# 消费者取出消息
LPOP message_queue
  • 集合(Set):是一个无序且不重复的元素集合,支持交集、并集、差集等操作。适用于需要去重和集合运算的场景,如统计网站的独立访客、共同关注的好友等。例如,统计多个用户共同关注的好友,可通过SINTER命令对多个用户的关注集合进行交集运算。
# 添加元素到集合
SADD user:123:follow 李四
SADD user:123:follow 王五
SADD user:456:follow 李四
SADD user:456:follow 赵六

# 求两个用户关注集合的交集
SINTER user:123:follow user:456:follow
  • 有序集合(Sorted Set):每个元素都关联一个分数,根据分数进行排序。常用于实现排行榜功能,如游戏排行榜、商品销量排行榜等。通过ZADD命令添加元素和分数,ZRANGE命令根据分数范围获取元素。
# 添加元素和分数到有序集合
ZADD game_rank 100 玩家A
ZADD game_rank 200 玩家B

# 获取排行榜前几名
ZRANGE game_rank 0 1 WITHSCORES

二、Redis应用场景

缓存

这是Redis最常见的应用场景,将热点数据缓存到Redis中,减少数据库的访问压力。例如,在电商系统中,将热门商品的信息、用户的购物车数据等缓存到Redis中。当用户请求这些数据时,首先从Redis中获取,如果没有命中再从数据库查询,然后将查询结果缓存到Redis中,提高后续请求的响应速度。

分布式锁

在分布式系统中,多个节点可能同时访问共享资源,为了保证数据的一致性,需要使用分布式锁。Redis的SETNX(Set if Not eXists)命令可以实现简单的分布式锁。当一个节点执行SETNX命令成功时,代表获取到了锁,可以执行共享资源的操作;操作完成后,通过DEL命令释放锁。

# 获取锁
SETNX lock_key value

# 释放锁
DEL lock_key

消息队列

利用Redis的列表数据结构可以实现简单的消息队列。如前文所述,生产者将消息插入列表,消费者从列表中取出消息,实现了消息的异步处理。与专业的消息队列相比,Redis实现的消息队列功能相对简单,但在一些对消息可靠性和功能要求不高的场景下,能满足基本需求。

三、Redis缓存淘汰策略

当Redis内存不足时,需要采用缓存淘汰策略来删除一些数据,以保证新数据的写入。Redis提供了多种缓存淘汰策略:

  • noeviction:不淘汰任何数据,当内存不足时,执行写操作会报错。适用于需要确保数据不丢失的场景,但可能导致写操作频繁失败。
  • volatile-lru:在设置了过期时间的键中,使用LRU(Least Recently Used,最近最少使用)算法淘汰最近最少使用的键。常用于缓存一些时效性较强的数据,如验证码、临时会话信息等。
  • allkeys-lru:在所有键中,使用LRU算法淘汰最近最少使用的键。适用于缓存热点数据,保证经常访问的数据不会被淘汰。
  • volatile-random:在设置了过期时间的键中,随机淘汰一些键。这种策略相对简单,但可能会淘汰掉一些仍在使用的键。
  • allkeys-random:在所有键中,随机淘汰一些键。同样可能会淘汰正在使用的键,一般较少使用。
  • volatile-ttl:在设置了过期时间的键中,优先淘汰剩余时间(TTL,Time To Live)最短的键。适用于缓存一些有明确过期时间的数据,如限时活动信息。

四、面试题

面试题1:Redis有哪些数据结构?分别适用于什么场景?

答案

  • 字符串(String):存储简单的键值对,如用户信息、配置参数。
  • 哈希(Hash):存储对象属性,方便部分更新。
  • 列表(List):实现消息队列、排行榜等。
  • 集合(Set):用于去重和集合运算,如统计独立访客、共同关注的好友。
  • 有序集合(Sorted Set):实现排行榜功能,根据分数排序。

面试题2:Redis的缓存淘汰策略有哪些?

答案

  • noeviction:不淘汰数据,内存不足时写操作报错。
  • volatile-lru:在设置过期时间的键中,用LRU算法淘汰最近最少使用的键。
  • allkeys-lru:在所有键中,用LRU算法淘汰最近最少使用的键。
  • volatile-random:在设置过期时间的键中,随机淘汰键。
  • allkeys-random:在所有键中,随机淘汰键。
  • volatile-ttl:在设置过期时间的键中,优先淘汰剩余时间最短的键。

掌握Redis的这些关键知识,能让你在春招面试中更好地应对与缓存相关的问题。下一篇,我们将探索消息队列的相关知识,继续为你的春招面试备考助力。


http://www.kler.cn/a/518781.html

相关文章:

  • Neural networks 神经网络
  • 数据结构:二叉树—面试题(二)
  • 链式存储结构
  • 微信小程序date picker的一些说明
  • 9【如何面对他人学习和生活中的刁难】
  • 高等数学学习笔记 ☞ 微分方程
  • Electron版本列表
  • 【自然语言处理(NLP)】循环神经网络RNN
  • 【unity游戏开发之InputSystem——06】PlayerInputManager组件实现本地多屏的游戏(基于unity6开发介绍)
  • 【Flask】在Flask应用中使用Flask-Limiter进行简单CC攻击防御
  • 钉钉群机器人设置——python版本
  • Android AOP:aspectjx
  • 二叉树的最小深度力扣--111
  • 嵌入式MCU面试笔记2
  • HBase的原理
  • c#使用Confluent.Kafka实现生产者发送消息至kafka(远程连接kafka发送消息超时的解决 Local:Message timed out)
  • 9.像素概念
  • 利用机器学习创建基于位置的推荐程序
  • 自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • 【Linux】命令为桥,存在为岸,穿越虚拟世界的哲学之道
  • adc和dma的使用原理和过程
  • L9305驱动组件接口TESSY测试
  • OpenFGA
  • 小识JVM堆内存管理的优化机制TLAB
  • 基于模糊PID的孵化箱温度控制系统(论文+源码)
  • vue3 vue2区别