Redis-大厂程序员是怎么用的 | 青训营

132 阅读5分钟

1. Redis概述:

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,常被称为数据结构服务器,因为它支持多种复杂的数据结构。Redis主要用于缓存、会话存储、消息队列和计数器等场景,以提供快速、可靠的数据存储和访问。

1.1 使用Redis的原因:

高性能:Redis是内存存储数据库,数据存储在内存中,因此读写操作非常快速。此外,它还支持持久化,将数据定期写入磁盘,保证数据的持久性。

多种数据结构支持:Redis支持丰富的数据结构,如字符串、列表、集合、散列、有序集合等,使其可以满足不同场景下的数据存储需求。

缓存:作为缓存服务器,Redis可以将常用的数据存储在内存中,加速读取操作,从而减轻数据库的负担。

发布订阅:Redis支持发布订阅模式,可以用于实现消息队列和事件通知等功能。

事务支持:Redis支持事务,可以将多个操作组合成一个事务,保证这些操作的原子性。

复制和高可用:Redis支持主从复制,可以创建多个副本,提高系统的可用性和容错性。

1.2 Redis基本工作原理:

Redis基于客户端-服务端模型,客户端通过网络连接到Redis服务端,并发送各种命令来进行数据操作。以下是Redis的基本工作原理:

客户端连接:客户端通过网络连接到Redis服务器,并发送命令请求。

命令解析:Redis服务端解析客户端发送的命令,根据命令类型和参数进行相应的处理。

数据操作:Redis支持多种数据操作,包括读取、写入、修改、删除等。数据可以存储在内存中,也可以通过持久化机制写入磁盘。

响应返回:Redis服务端将操作结果返回给客户端,客户端可以根据响应结果进行相应的处理。

2. Redis应用案例以及数据结构:

2.1 连续签到(String数据结构):

使用String数据结构可以方便地实现连续签到功能。每个用户可以对应一个键,例如user:1:sign_in,键的值可以表示用户已签到的天数。每次用户签到时,将对应键的值加1,实现简单的累计签到功能。

2.2 消息通知(Quicklist和Listpack数据结构):

Redis的List数据结构可以用来实现消息队列,但对于大量消息的情况,使用Quicklist和Listpack这两种数据结构可以提高性能。消息发布者将消息推入列表,消息订阅者可以从列表中获取消息。

2.3 计数(Hash数据结构):

Hash数据结构可以用来实现计数功能。例如,可以将网站每篇文章的阅读次数存储在一个Hash中,键为文章ID,字段为"views",值为阅读次数。每次有用户访问文章时,通过HINCRBY命令将阅读次数增加。

2.4 排行榜(zset数据结构):

有序集合(zset)数据结构适合实现排行榜功能。每个成员代表一个对象,分数代表排名。可以用来存储用户的得分,比如游戏中的玩家得分,然后通过ZREVRANGE命令按照分数从高到低获取排行榜数据。

2.5 限流(1秒内放行的请求为N,超过N禁止访问一段时间):

使用Redis的String数据结构可以实现限流功能。例如,可以设置一个键,以当前时间戳为值,然后使用INCR命令递增值。如果递增后的值超过N,表示请求次数过多,可以采取相应措施,比如禁止访问一段时间。

2.6 分布式锁(使用并发场景,可使用Redis的setnx实现):

在分布式系统中,为了保证数据的一致性,可能需要使用分布式锁。Redis的setnx命令可以实现分布式锁,通过将某个键的值设置为唯一标识符,如果设置成功,则获取了锁,执行操作;如果已经存在该键,则表示其他进程已经获取了锁。

3. Redis使用注意事项

3.1 大key和热key:

大key指的是存储在Redis中占用较大内存的键值对,它会影响Redis的性能。避免存储大数据量的值,尤其是使用String数据结构。热key指的是被频繁访问的键,它可能会导致某些节点负载过高。应该采用合理的缓存策略,对热key进行分片或使用集群模式,以平衡负载。

3.2 慢查询场景:

慢查询可能会影响Redis的性能,尤其是在数据量较大的情况下。可以使用Redis的slowlog功能记录慢查询,并通过分析优化慢查询的命令,如使用合适的索引、优化命令参数等。

3.3 缓存穿透和缓存雪崩(危害和避免方法):

缓存穿透:指的是恶意或频繁访问不存在的数据,导致大量请求直接击穿缓存,请求直接落到数据库上。可以使用布隆过滤器等方法,将不存在的数据缓存起来,从而减轻数据库压力。

缓存雪崩:指的是缓存中的大量数据同时失效,导致大量请求直接落到数据库上,造成数据库压力剧增。可以使用随机过期时间、热点数据预加载等方法,减少缓存同时失效的概率。

避免以上问题,还可以采用以下方法:

  1. 使用合适的缓存策略,根据业务场景设置适当的过期时间。
  2. 使用分布式缓存,分散请求,降低单一节点压力。
  3. 使用多级缓存,如内存缓存、分布式缓存和数据库缓存,提高缓存的命中率。
  4. 使用合适的数据结构,如Hash数据结构存储多个字段,避免大key问题。
  5. 使用持久化机制,保证数据的持久性,避免数据丢失。