redis数据类型,使用场景,缓存击穿,缓存雪崩,缓存穿透,redis多线程,redis持久化

本文详细介绍了Redis的五种数据类型:字符串、列表、哈希、集合和有序集合及其应用场景。同时,讨论了缓存穿透、缓存击穿和缓存雪崩三种缓存问题及相应的解决方案。Redis 6开始引入多线程,但工作线程仍保持单线程,提高了效率。此外,文章还探讨了Redis的持久化机制选择,主从复制和哨兵模式,以及服务器重启情况。最后,解释了Redis单线程为何能保持高效运行。
摘要由CSDN通过智能技术生成

redis数据类型

五种。字符串类型,list类型,哈希类型,set类型,zset类型。

使用场景

  1. redis支持的字符串类型不是定长分配的字符串,是动态变长字符串。内存分配采用预分配内存冗余的方式,因此改动不大,不需要重新分配内存。可以用来缓存常规key-value,还可以用作计数:微博粉丝数。
  2. redis list列表是简单的字符串列表,按照插入顺序排序。可以用来做订单列表,粉丝列表等。
  3. redis hash使用利用key-value的方式存储数据,可以用来存储对象。例如存储用户对象,通过用户id映射到用户对象。
  4. redis set是string类型的无序集合,集合是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。需要去重的集合列表就可以使用set,需要查询数据是否存在也可以用set。例如个人标签,共同好友。
  5. redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不过set是无序的,而zset可以通过传入的优先级参数来进行自动排序。如果需要有序且不重复的集合列表就可以使用zset。例如按根据时间排序的新闻列表, 阅读排行榜等。

缓存穿透

缓存穿透就是有请求访问数据库和缓存都不存在的key,访问过来的时候,因为缓存没有,请求就会打到数据库,数据库也没有也就没法写入缓存,所以下一次请求过来的时候还是会重复上述的操作。
在这个过程中,缓存起不了作用,访问都直接打到了数据库,就好像请求都直接穿透缓存到达数据库一样。流量大的时候,可能会把数据库打挂。

解决方案:
①接口校验。可以校验数据的合法性,可以校验用户权限,不符合的数据就进行拦截。
②缓存空值。当访问缓存和数据库都没有的key的时候,可以将空值写入缓存,然后设置比较短的过期时间。
③布隆过滤器。使用布隆过滤器存储所有可能被访问的key,不存在的key直接过滤掉,可能存在的key再进一步进入缓存和数据库进行查询。

缓存击穿

缓存击穿是指某个热点key缓存过期的一瞬间,大量的请求打进来。由于缓存过期了,这些请求都会去到数据库,导致数据库的压力瞬间增大,严重甚至可能打垮数据库。

解决方案:
①加互斥锁。在并发的多个请求中,只有第一个请求可以到达数据库进行查询,其他请求只能阻塞等待,等到第一个请求将数据写入缓存之后,再直接走缓存。(可以使用写锁,分布式锁)
②热点数据不过期。直接将热点key设置为永不过期,然后再用定时任务去异步加载数据,刷新缓存。

缓存雪崩

缓存雪崩是指大量的缓存在同一时间失效,后续访问这些数据的请求都会打到数据库,数据库的请求量瞬间增大,压力剧增,引起雪崩,甚至可能导致数据库挂掉。(和缓存击穿相比,就是key的数量变多)

解决方案:
①将过期时间打散。给缓存的过期时间加上一个随机时间,使得key的过期时间分散开来。
②热点数据不过期。和缓存击穿同样的做法,需要考虑数据刷新的时间间隔,以及出现数据异常该如何处理。
③加互斥锁。和缓存击穿一样,在key的维度进行加锁。对于同一个key,只需要第一个请求到达数据库,其他请求等待第一个将数据写入缓存再走缓存。

redis6是多线程吗?说说。

redis从6开始,有了多线程。但是这个多线程不是指工作线程变成多线程,工作线程依旧是单线程的。
在redis6之前,客户端的请求过来,工作线程启动,读取指令,计算,再将结果返回给客户端。进行完一系列操作才能进行处理下一个请求。
现在是客户端请求过来,启动IO子线程读取指令,再将读取到的传到工作线程计算,然后结果再由IO子线程返回。请求多的时候,可以启动多个IO子线程,从时间维度上,工作线程只负责计算,耗时大大下降。

redis持久化机制该如何选择?

redis里面有RDB和AOF两种方案进行选择,两者各有利弊。
RDB以快照的方式做备份,适合大规模的数据恢复,可以节省磁盘空间,恢复速度快。但是存在数据丢失的问题,最后一次快照到宕机的数据会丢失。
AOF以日志的方式记录每个写操作,没当有一个新的写操作就将其写入日志文件中,恢复的时候直接将日志文件重新执行一遍就可以了。这样备份数据更加稳健,丢失数据的概率低。但是相比RDB占用更多的磁盘空间,恢复备份速度慢。
因此最好的解决方案应该是将两者结合起来。需要恢复数据的时候,先使用RDB将数据恢复到最后一次快照的时候,然后再使用AOF找到快照对应的时间,将后面的命令执行以恢复到宕机前的状态。

redis主从复制

一台服务器配置成功另一台服务器的从服务器的时候。
从服务器会向主服务器发送同步数据请求,主服务器收到请求后将RDB文件发送给从服务器,从服务器收到并执行RDB完成同步。
之后每当有新的写操作,主服务器会主动将修改命令传给从服务器,从服务器执行以完成同步。

哨兵模式

通过配置哨兵模式可以实现反客为主的自动版。能够后台检测主服务器是否故障,一旦发生故障,可以通过投票自动将某台从服务器升级为主服务器。挂掉的主服务器重启之后会自动成为新主服务器的从服务器。

服务器重启的情况

另外从服务器一旦重启,它将不再是从服务器,主从的关系就消失了,需要重新配置。
而没有配置哨兵模式的主服务器挂了,重启之后还是主服务器。

redis是单线程的,为什么那么快?

首先redis都是在内存上读取数据,不需要进行磁盘IO。
因为redis是单线程的,执行的过程不需要进行上下文切换,而上下文切换是非常消耗性能的。
redis有IO多路复用,请求到达redis的时候,redis会启动IO子线程,获取请求,读取指令,然后将指令发送到工作线程进行计算,然后再由IO子线程负责将结果返回。一个请求就一个IO子线程,整个流程只有计算需要使用工作线程,因此从时间维度上效率较高。
redis的性能瓶颈应该是机器的内存大小以及网络带宽。内存大小关系到Redis存储的数据量;而网络带宽影响传输速率,因为客户端和redis服务器可能部署在不同的地方,这样即使使用光纤进行往返,耗时也较长,因此一般情况下,都是就近部署!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值