Redis有什么作用?面试题答案

Redis作为内存数据库,常用于缓存、数据库、计数器、会话存储、实时消息、地理位置应用和分布式锁。其原子性操作支持计数器、分布式锁功能,发布/订阅功能则适合实时消息传递。此外,还能实现分布式Session和简单消息队列,但不推荐作为主要的消息队列解决方案。
摘要由CSDN通过智能技术生成

参考答案

Redis是一种开源的内存数据库,它具有多种作用和用途。以下是Redis的主要作用:

  1. 缓存:Redis最常见的用途是作为缓存存储,将常用的数据存储在内存中,以提高读取速度。由于Redis是基于内存的,因此读取操作非常快速,适用于需要频繁读取的应用程序。

  2. 数据库:Redis可以用作持久化数据库。虽然数据存储在内存中,但Redis支持将数据保存到磁盘上,以便在服务器重启时恢复数据。它提供了一些持久化选项,例如快照和日志追加。

  3. 计数器和统计:由于Redis的原子性和高性能,它非常适合用作计数器和统计信息的存储解决方案。您可以使用Redis的INCR操作来实现原子递增计数器,或者使用HyperLogLog数据结构来进行独特项的基数估计。

  4. 会话存储:Redis可用于存储会话数据。许多Web应用程序使用Redis来管理用户会话,以实现高可用性和可伸缩性。

  5. 实时消息传递:Redis支持发布/订阅(Pub/Sub)功能,使得它成为实现实时消息传递的良好选择。通过发布消息,多个订阅者可以同时接收到消息,用于实时通信和事件处理。

  6. 地理位置应用:Redis提供了用于存储地理位置数据的数据结构,例如地理位置索引(GeoIndex)。这使得Redis成为位置相关应用程序的有用工具,如地理位置服务和附近搜索。

  7. 分布式锁:由于Redis的原子性操作,它可用于实现分布式锁。多个应用程序实例可以使用Redis的锁机制来确保在共享资源上的互斥访问。

  8. 消息队列:使用Redis的列表结构,可以实现简单的消息队列,应用于处理异步任务和削峰填谷。

总的来说,Redis是一个功能强大且灵活的数据存储解决方案,适用于许多不同的应用场景。它的高性能、内存存储和丰富的数据结构使得它成为现代应用程序中不可或缺的一部分。

答案解析

Redis用作缓存

这是Redis最常见到的用法,很多数据反复读取数据库会增加耗时,所以我们可以将这些数据写入到内存数据库中,下次使用的时候直接从内存中读取就可以了。

我们可以利用Redis对经常访问的对象、数据库的查询结果、用户的会话信息、用于统计在线人数等数值的计数器等等诸多场景进行缓存。

我们在使用Redis作为缓存的时候包含两种情况,分别是缓存没有命中和命中的场景:

Redis用作数据库

  这仅为符合Redis特性的一种方案,但是并不代表我们通常在实际项目中会这样使用。

  Redis支持了持久化操作,我们后面会讲解它的不同持久化方式。由于Redis支持持久化,所以理论上我们可以使用Redis取代数据库做一些数据存储。

Redis用作计数器和统计

  这是一个很常见的功能,比如网站需要统计IP和UV。每次新增加一个访问,我们都可以对Redis中的一个值进行+1操作。

  这里还涉及到了一个原子操作的问题,比如 key 为 a,我们读取 a,在内存+1运算得到 a+1 的结果,之后再去写入到Redis中,这个过程并非原子操作。可能我们这边读取了a的值,我们还没等写入回去,就已经被修改了。

  所以我们需要一种原子操作,Redis提供 +1 和 -1 原子操作命令分别是: INCR 和 DECR,使用这两个命令才能保证操作是原子的。

  更多有关原子操作数值的内容可以点击:Redis INCR数值操作命令 (biancheng.net)

Redis用于会话存储

  这是一个分布式Session的概念,面试分布式高并发的相关习题中存在一个高频题目:如何实现分布式Session?

  我们可以从几个方向来思考,比如我们可以通过一定的Hash规则,让一个用户的请求一直在同一台机器上面处理,但是这可能造成单点故障。我们还可以选择Session复制等方案来进行实现,通过广播协议进行彼此告知,但是这其实可能存在一定的滞后性。目前比较常见的就是利用Redis进行统一的Session存储。

  这里因为Redis用作分布式Session十分常见,后面我们会有专门的文章进行介绍。

Redis用于实时消息传递

Redis本身支持Pub/Sub(发布、订阅)。但是我们通常需要采用发布订阅的时候通常不会选择Redis作为技术选型。仅作为面试必要考点了解即可。

Redis 客户端可以订阅任意数量的频道。Redis的发布订阅机制和大多数MQ类似,我们可以通过定义一个频道接收该频道上面发送的消息。在订阅的时候支持通配符,每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。

Redis的订阅消息:

redis 127.0.0.1:6379> PSUBSCRIBE pattern [pattern ...]

Redis发送消息:

redis 127.0.0.1:6379> PUBLISH mychannel "hello, i m here"
(integer) 1

Redis用于地理位置应用

Redis能够用于地理位置应用是因为它支持了GeoHash类型,GeoHash是一个允许有一定误差的地理坐标,它的原理就是将地图画成很多个小格子,只记录坐标在哪个小格子里面,每一个小格子对应一个Hash数值,以此快速的进行Geo查询和操作。详细的GeoHash相关知识我在之前的一篇文章中有写到,感兴趣的小伙伴可以阅读参考下:

Elasticsearch储存地理位置原理—GeoHash实现介绍_es geohash_程序员麻薯的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/qq_20051535/article/details/119582547

Redis做分布式锁

当多个进程或线程需要在分布式系统中对共享资源进行访问控制时,分布式锁是一种常用的技术。Redis(Remote Dictionary Server)是一种基于内存的高性能键值存储数据库,它也可以用来实现分布式锁。Redis分布式锁通过利用Redis的原子性操作和特性来确保在多个节点或进程之间对共享资源的安全访问。

Redis分布式锁的常见实现方式有两种:基于SETNX和基于Redlock算法。

  1. 基于SETNX(SET if Not eXists): 这是一种简单的分布式锁实现方式。具体步骤如下:

    • 每个请求尝试在Redis中设置一个特定的键,如果键不存在,则设置成功,获得锁。
    • 设置键时,可以指定一个过期时间,以防止锁未被显式释放时发生死锁。
    • 执行完操作后,进程可以通过删除键来释放锁,从而允许其他进程获得锁。

    但是这种方法存在一些问题,比如当持有锁的进程因为某种原因崩溃,锁可能会永远不会被释放,从而导致其他进程无法获取锁。解决这个问题需要一些额外的机制。

  2. 基于Redlock算法: Redlock是一种用于实现分布式锁的算法,由Redis的作者提出。这个算法尝试解决基于SETNX的方法中的问题,提供更强的锁安全性。

    Redlock算法的主要思想是在多个Redis实例上创建锁,这些实例可以是不同的节点或者不同的Redis集群。要获取锁,一个进程需要在多个实例上分别执行SET操作,如果在多数实例上都成功设置了锁,则认为获得了锁。

    这种方法引入了多个Redis实例的依赖,从而提高了可靠性,但也增加了实现和维护的复杂性。

如果你不太理解这些内容不需要担心,Redis作为分布式锁是一个非常常见的面试题,我们后面会详细的为大家进行介绍。使用Redis实现分布式锁时需要考虑网络延迟、锁的过期时间、锁的释放等因素,以确保锁的可用性和安全性。此外,Redis分布式锁并不能完全避免死锁等问题,开发人员在使用时需要谨慎设计和处理。

Redis用作消息队列

Redis在实际生产环境中基本没有人会作为消息队列来使用。本项也依旧是仅作为面试考点进行学习即可!

Redis的List对象具备从指定一侧进行数据插入或者删除,那这样我们就可以通过这个功能来实现一个简单的队列。

 但是我们在进行队列操作的过程中可能存在消息丢失的风险。比如我们RPOP出了元素,但是还没来得及处理,服务就挂了,那么就会造成消息的丢失。这种场景的出现是因为不支持ACK导致的。如果要求我们必须使用Redis进行队列操作的话,可以试试使用另外一个List进行处理,取出消息直接放到另外一个List中,如果处理完成我们再从另外一个List中进行弹出。但由于Redis本身不支持ACK,我们很难做到完美ACK的实现。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员麻薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值