Redis
00 分钟
2022-9-16

使用redis会带来什么问题?

1)缓存与数据库双写不一致 2)缓存雪崩 3)缓存穿透 4)缓存并发竞争

为什么内存操作很快

redis的存储结构?

redis过期策略和内存淘汰策略

Redis的过期策略

我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。
过期策略通常有以下三种:
  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
Redis中同时使用了惰性过期和定期过期两种过期策略。

Redis的内存淘汰策略

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

总结

Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。
 

redis的setnx底层怎么实现的?

redis的数据结构了解哪些?深入说下内部实现

redis主从同步怎么做的

缓存失效的几种场景,以及解决方案

Redis怎么保证数据一致性

rediszset怎么使用的,底层怎么实现的,适用于什么场景

redis底层实现

为什么选型redis

redis设计稳定性

对redis有了解吗?

redis数据持久化方式有哪些?

主从模式下,新加入一台从服务器,数据同步是怎么同步的?

redis如何做到高可用

集群模式下如何保证高可用

有序集合底层怎么实现的?

redis字符串是如何存储的?

redis跳表知道吗?

对redis作为缓存使用熟悉吗?

缓存雪崩、穿透、击穿说下以及如何解决预防

缓存淘汰机制了解吗,lru说下

redis是单线程还是多线程?

redis作为单线程,是怎么支持高并发的?

redis单线程为什么快?

  1. 基于内存
  1. io多路复用
    1. 以Get请求为例,SimpleKV为了处理一个Get请求,需要监听客户端请求(bind/listen),和客户端建立连接(accept),从socket中读取请求(recv),解析客户端发送请求(parse),根据请求类型读取键值数据(get),最后给客户端返回结果,即向socket中写回数据(send)。
      Linux中的IO多路复用机制是指一个线程处理多个IO流,就是我们经常听到的select/epoll机制。简单来说,在Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给Redis线程处理,这就实现了一个Redis线程处理多个IO流的效果。
      多个FD就是刚才所说的多个套接字。Redis网络框架调用epoll机制,让内核监听这些套接字。此时,Redis线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。正因为此,Redis可以同时和多个客户端连接并处理请求,从而提升并发性。
  1. 高效的数据结构:hash、调表

对内存操作更深入的了解过吗?

有没有想过内存操作为什么很快?

redis内存操作很快?有没有IO读写

redis写入通信协议是什么?

redis写入操作IO操作快是因为异步

限制用户评论过去一个小时内只能评论三次,用redis实现?

如何避免redis故障

主要用redis实现哪些功能

redis故障转移策略

redis应用场景还有哪些?

redis如何实现事务

复杂一点的条件,比如说判断一个数字大于多少如何实现事务?

如果要从redis里面删除大量的数据要怎么做?

list里面有大量数据,删除大量数据要注意什么

redis的string是怎么存储的?

redis发布订阅怎么实现的?你自己要怎么实现?

了解redis主从复制机制吗?

分布式锁有哪些实现方式

为什么用redis没有用成熟的kafka这些消息队列

raft算法是那种一致性算法

Redis学习完结篇:经典面试题+重点知识-伙伴云
Redis常见问题
 

评论