精品 Redis常见的几大问题

1.Redis 缓存使用redis的好处

在项目中使用redis,主要是从性能并发的角度考虑,在项目中碰到执行耗时持久,且结果不频繁变动的SQL,比如报表数据等,特别适合将运行结果放入缓存中,当用户请求时可以从缓存

中读取,提高响应速度。

图片.png

还有就是在高并发的场景下,数据库请求过多导致连接异常。这时就需要使用redis做一个缓冲,防止请求过多导致程序宕机。

2. 使用redis有什么缺点

使用Redis缺点主要存在以下几个方面

  1. 缓存和数据库双写一致性问题,需要维持两端数据保持一致。
  2. 缓存服务不稳定雪崩问题及key设置不合理导致击穿问题。
  3. 占用服务器大量内存导致项目成本增高。
  4. redis在使用中会存在并发竞争问题

3.redis为什么这么快

redis虽然是单线程工作的,但是以为其 是 纯内存操作单线程操作避免了来回切换IO采用了非阻塞I/O多路复用机制
图片.png

redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。

4、redis的数据类型及常见使用场景

(1)String 字符串类型,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存或者验证码缓存。

(2)Hash 存放的是结构化的对象,比较方便的就是操作其中的某个字段,比如登录时存储用户实体信息。

(3)list 使用List的数据结构,可以做简单的消息队列的功能,存储列表信息。

(4)set 因为set堆放的是一堆不重复值的集合。可以做全局去重,利用交集、并集、差集等操作,可以计算相同点。

(5)sorted set 在项目开发中,做排行榜应用,取TOP N操作。

5.redis的过期策略以及内存淘汰机制

redis 数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么? 答案其实很简单,redis采用的是定期删除+惰性删除策略。

定期删除,redis默认每个100ms检查,随机抽取进行检查,是否有过期的key,有过期key则删除,这会导致很多key到时间没有删除,所以惰性删除派上用场。在你获取某个key的时候,

redis会检查一下是否过期。

问题: 如果定期删除没删除key。然后你也没有请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。

6.redis和数据库双写一致性问题

一致性问题是分布式系统中常见问题,可划分为最终一致性和强一致性,数据库和缓存双写必然会存在不一致的问题,如果对数据有强一致性要求就不能放缓存,Redis只能保证最终一致性。

7. Redis如何解决缓存穿透和缓存雪崩问题

缓存穿透,存在大量的非法请求缓存中不存在的数据,导致所有的请求都链到数据库上,从而数据库连接异常。

1.业务设计时要做好key的设计,避免出现大量请求不经过缓存的情况。

2.采用异步更新策略,启动一个线程去读数据库不断更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

3.提供一个能迅速判断请求是否有效的拦截机制,读取失败时迅速返回。

缓存雪崩,即缓存同一时间大面积的失效,从而导致数据库连接异常。

1.给缓存的失效时间,加上一个随机值,避免集体失效。

2.双缓存机制,我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。
从缓存A读数据库,有则直接返回,A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程,更新线程同时更新缓存A和缓存B。

8.如何解决redis的并发竞争问题

这个问题大致就是,同时有多个子系统去set一个key。

1.针对这种情况下,准备一个分布式锁,大家去抢锁,抢到锁就做set操作。

2.如果对这个key操作,这种时候我们在数据写入数据库的时候,需要保存一个时间戳。假设时间戳如下

图片.png

暂无数据
关注 私信
文章 专栏 文档 话题

相关推荐

  • Redis 哨兵模式详解
  • Redis的持久化机制
  • Redis从入门到精通(一)介绍安装
  • Redis的特性
  • Redis的数据类型
联系客服