Redis 为什么是高性能的?
Redis 为什么采用单线程模型?
Redis 的基础数据结构有哪些?
Redis 支持多种基础数据结构,基础数据结构包括 String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合)、Hash(哈希表),除了基础数据结构外,Redis 还提供了 Bitmap、Stream、HyperLogLog、Geospatial 等高级数据结构。
Redis 的应用场景有哪些?
- 分布式缓存:在分布式系统中,Redis 可以被用作全局缓存,提供共享数据和信息。在实际项目中,为了进一步提升应用性能,应用中可能存在多级缓存,例如本地缓存、分布式缓存等。当进行读操作时,为了减少网络 IO 和带宽,优先访问本地缓存,如果命中缓存则立即返回,如果未命中则从分布式缓存中查找,命中缓存则立即返回,否则将访问数据源并将执行结果填充至多级缓存中。
- 分布式锁: Redis 可以用作分布式锁的实现,通过 SETNX 命令来实现简单的锁机制,避免多个节点同时执行某个关键任务。使用 Redis 实现分布式锁需注意如下事项:
- 互斥:同一时刻保证只有一个线程获取到锁,其他线程阻塞等待获取锁。
- 锁应设置超时时间:在分布式环境下,由于 Redis 故障或网络 IO 等原因导致锁持有方无法及时释放锁资源,其他节点则会长时间排队阻塞等待获取锁资源,可能出现死锁现象,严重影响程序执行效率。为了防止释放锁失败,通常会设置锁的超时时间,一旦锁长时间未被释放,则锁自动过期,释放锁后其他线程竞争锁。
- 锁的可重入性:锁的重入性是指同一个线程是否可以多次获取同一把锁而不被阻塞
- 锁的续期:如果已经设置了锁的过期时间,当到锁过期但是业务逻辑还未执行完成,此时无法保证业务正常执行,在这种情况应需要支持锁的自动续期。
- 分布式队列: Redis 的发布/订阅机制和 List 结构、Stream 结构可以用来构建轻量级的消息队列。生产者将消息发布到 Redis,而消费者则订阅这些消息。这种机制可以用于实现异步任务、事件通知等。Redis 实现分布式队列可能会存在如下问题:
- 无法保证可靠性:Redis 的设计目标是提供高性能、低延迟的分布式系统,无法保证强一致性和可靠性,某些情况下,Redis 会丢失消息,或者在出现故障时无法提供持久化保证。
- 缺少 MQ 的高级特性:相较于专业级 MQ,基于 Redis 实现分布式队列虽然简单,但是不支持 MQ 的高级特性,例如消息重试、消息路由、持久化消息等。
- 分布式会话:Redis 可以用于存储用户会话数据,特别是在分布式系统中。将用户的会话信息存储在 Redis 中,可以实现快速、可扩展、可靠的用户会话管理。
- 排行榜和计分系统:利用有序集合和 Redis 提供的排名功能,可以很方便地构建排行榜和计分系统,例如游戏中的玩家排名。
- 计数器应用:Redis 支持原子性的增减操作,因此可以用来实现计数器应用。例如,可以用 Redis 记录网站的访问次数、文章的点赞数等。
- 实时分析:Redis 支持复杂的数据结构,如 HyperLogLog 和布隆过滤器,可用于实时分析场景,例如统计在线用户数、IP 去重等。
- 地理位置服务:Redis 提供了有序集合(Sorted Set)的支持,可用于存储和查询地理位置信息。这对于构建位置服务应用如地理位置推荐、附近的人等非常有用。
Java知识库