在现代的高并发应用中,Redis作为一个开源的内存数据结构存储系统,已经成为很多企业的核心组件。由于其高效的读写性能和丰富的数据结构,它被广泛应用于缓存、消息队列、实时分析等场景。如果你正在准备Redis的面试,以下是你需要掌握的关键知识点和常见面试问题。编辑
问题
redis的数据类型有哪几种,你们用了哪几种,是怎么用的
常见的数据类型:String、Hash、List、Set、SortedSet。
1.String 字符串类型
是redis中最基本的数据类型,一个key对应一个value。
String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。编辑
实战场景:
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
- session:常见方案spring session + redis实现session共享
2.Hash (哈希)
是一个Mapmap,指值本身又是一种键值对结构,如 value={{field1,value1},......fieldN,valueN}}
实战场景:
1.缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
3.链表
List 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
使用列表的技巧
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
实战场景:
1.timeline:例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
4.Set 集合
集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。
实战场景;
- 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
- 点赞,或点踩,收藏等,可以放到set中实现
5.zset 有序集合
有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。
(有序集合中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)。
实战场景:
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
redis底层数据结构是怎么样的?
String
Hash
List
Set
Zset
redis为什么快?
- 基于内存操作
- 纯C操作,优化过的数据结构:基于几种基础的数据结构,redis做了大量的优化
- 使用单线程,无上下文的切换成本
- 基于非阻塞的IO多路复用机制
redis是怎么实现原子性的
答:使用SET key value [EX seconds] [PX milliseconds] [NX|XX]
- EX seconds
-
- 设置键的过期时间为second秒
- PX milliseconds
-
- 设置键的过期时间为milliseconds秒
- NX
-
- 只有在键不存在时,才对键进行设置操作
- XX
-
- 只有在键已经存在时,才对键进行设置操作
- set操作
-
- 成功:OK
- 失败:nil
这样使用就保证了设置key和设置过期时间仍是原子的
如何使用Redis做异步队列?
- 使用List作为队列,RPUSH生产消息,LPOP消费消息
-
- 缺点:没有等待队列里有值就直接消费
- 解决,应用层使用sleep重试
- BLPOP key timout
-
- 等待队列里有值才消费
- 缺点:只能一次消费
- Sub/Pub,发布订阅模式
-
- 可以有多个消费者
- 缺点:下线后在上线不能收到下线后的消息
- 解决:使用专业的消息队列应用
Redis的应用场景
- 缓存:Redis常用作缓存系统,通过减少数据库的访问频率来提高系统性能。
- 消息队列:通过Redis的List和Pub/Sub功能,可以实现高效的消息队列。
- 实时数据分析:利用Redis的有序集合,可以实现实时排名、实时统计等功能。
- 会话存储:Redis的快速读写和内存存储非常适合存储用户会话数据。
总结
Redis在现代Web开发中扮演着非常重要的角色。掌握Redis的基本命令、配置和优化技巧是面试中非常重要的一部分。无论是在高并发缓存、消息队列,还是在分布式系统中,Redis的高效性能和灵活性都能够帮助解决各种问题。如果你正在面试中遇到关于Redis的问题,确保你能清晰地解释它的基本概念和实际应用场景,并且能够通过实践经验来支持你的回答。