redis面经整理

  • 什么是 Redis?简述它的优缺点?

    • 简介:全称:remote dictionary server,本质是一个key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据刷新到硬盘上进行保存
    • 优点:(1)因为是纯内存操作,性能出色。每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB;(2)支持多种数据结构,单个value最大的限制是1GB
    • 缺点:数据库容量受物理内存的限制,不能做海量数据高性能独写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上
  • Redis 支持哪几种数据类型?
    基础类型:String、List、Set、Sorted Set、Hash
    高级类型:BitMap(信息状态统计);HyperLogLog(基数统计,统计不重复数据的数量);GEO(记录地理位置信息)
    参考博客https://www.cnblogs.com/liushoudong/p/12682887.html
    项目中数据结构用redis怎么实现

  • redis消耗的物理资源?
    内存

  • redis有哪几种数据淘汰策略?
    redis内存数据数据集大小升到一定大的时候,就会实行数据淘汰策略(回收策略)

    1. volatile-lru:从设置了过期时间的数据集中,选择最近最少使用的数据释放
    2. allkey-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最少使用的数据释放
    3. volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放
    4. volatile-random:从已设置过期时间的数据集中随机挑选key淘汰掉
    5. allkey-random:从所有的数据集中随机挑数据淘汰
    6. no-eviction:内存达到上限,不淘汰数据,直接返回错误
  • Redis 官方为什么不提供 Windows 版本
    redis官网不提供windows版本,只有linux。windows版本是民间大神修改过的,可以在github上下载低版本。操作系统的轮询机制不一样,linux采用epoll,Windows采用selector,就性能上来说epoll高于selector,所以redis推荐使用linux版本

  • 字符串类型的值能存储最大容量是多少
    512M

  • 为什么 Redis 需要把所有数据放到内存中
    Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值

  • MySQL 里有 2000w 数据, redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据
    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略

  • redis适合什么场景

    1. 缓存:redis提供键过期功能,也提供了键淘汰策略,比较合适在缓存中应用
    2. 排行榜:redis提供的有序集合数据结构能实现各种复杂的排行榜应用
    3. 计数器:大型电商、视频网站的浏览播放量,需要实时有效,每次浏览都需要+1,并发量高的时候每次请求数据库,性能会很差。redis提供了incr命令可以用来实现计数器功能,内存操作,性能非常好。
    4. 最新列表:Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可
  • 说说 Redis 哈希槽的概念
    Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念, Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽

  • redis集群的主从复制模型是怎样的?
    为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有1或多个从节点

  • redis集群会有写操作丢失吗?为什么?
    Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。以下情况可能导致写操作丢失:

    • 过期key被清理
    • 最大内存不足,导致 Redis 自动清理部分 key 以节省空间
    • 主库故障后自动重启,从库自动同步
    • 单独的主备方案,网络不稳定触发哨兵的自动切换主从节点,切换期间会有数据丢失
  • redis集群之间是如何复制的?
    异步复制

  • redis集群最大节点个数?
    16384个

  • redis集群如何选择数据库?
    redis集群目前无法做数据库选择,默认在0数据库

  • redis中管道有什么用?
    对于请求,响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回答。最后在一个步骤中获取该回答。

  • 如何理解redis事务
    开启事务:multi
    命令入队:输入命令
    执行事务:exec
    放弃事务:discard
    事务执行过程中错误分以下三类:

    • 执行时才出现的错误:中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。作者给出的理由:(1)他认为 Redis 事务的执行时,错误通常都是编程错误造成的,这种错误通常只会出现在开发环境中,而很少会在实际的生产环境中出现,所以他认为没有必要为 Redis 开发事务回滚功能;(2)不支持事务回滚是因为这种复杂的功能和 Redis 追求的简单高效的设计主旨不符合。这里不支持事务回滚,指的是不支持运行时错误的事务回滚。
    • 入队时错误,不会终止整个事务:
    > get k
    "v"
    > multi
    OK
    > set k v2
    QUEUED
    > expire k 10s
    QUEUED
    > exec
    1) OK
    2) (error) ERR value is not an integer or out of range
    > get k
    "v2"
    
    • 入队错误,会终止事务
    > get k
    "v2"
    > multi
    OK
    > set k v3
    QUEUED
    > set k
    (error) ERR wrong number of arguments for 'set' command
    > exec
    (error) EXECABORT Transaction discarded because of previous errors.
    > get k
    "v2"
    

参考博客https://blog.csdn.net/weixin_45568391/article/details/108489175

  • redis事务相关的命令有哪几个?
    multi、exec、discard、watch

    • multi,标记一个事务块的开始,返回 ok
    • exec,执行所有事务块内,事务块内所有命令执行的先后顺序的返回值,操作被,返回空值 nil
    • discard,取消事务,放弃执行事务块内的所有命令,返回 ok
    • watch,监视 key 在事务执行之前是否被其他指令改动,若已修改则事务内的指令取消执行,返回 ok
    • unwatch,取消 watch 命令对 key 的监视,返回 ok
  • redis如何做内存优化

    1. 设置内存上限:使用maxmemory参数限制最大可用内存,当超出内存上限maxmemory时使用LRU等删除策略释放空间以及防止所用内存超过服务器物理内存
    2. 键值对优化:降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度。在完整描述业务情况下,键值越短越好。值对象缩减比较复杂,应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小
  • Redis回收进程如何工作的
    一个客户端运行了新的命令,添加了新的数据。Redis检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。如此循环。

  • Redis 支持的 Java 客户端都有哪些
    Jedis,Redisson,Lettuce等
    jedis: 特点:使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作。Jedis客户端实例不是线程安全的,需要通过连接池来使用Jedis
    Redisson:分布式锁,分布式集合,可通过Redis支持延迟队列
    Lettuce: 用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器,Lettuce的API是线程安全的
    补充:在项目中使用redis,是在springboot中通过maven引入,使用RedisTemplate: 先创建一个RedisTemplate对象,然后通过setKeySerializer设置编码方式,再调用opsForValue的get,set方法来进行数据的写入和获取

  • 什么是缓存穿透?如何避免?
    缓存穿透:一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去后端数据库查找。一些恶意的请求会故意查询不存在的 key,请求量很大,就会对后端系统造成很大的压力
    避免方式
    (1)对于查询为空的情况进行缓存(正常缓存都是查询不为空的数据),缓存时间设置短一点,或者等到该key对应的数据insert后再清理缓存。
    (2)对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤

  • 什么是缓存击穿?如何避免?
    缓存击穿:对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key 有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮
    避免方式:
    (1)使用互斥锁,当访问该失效缓存时,使用setnx给该key设置锁,当设置成功后,请求数据库更新缓存,并删除锁

  • 什么是缓存雪崩?何如避免?
    缓存雪崩 :置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到 DB, DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多 key,击穿是某一个key 缓存
    避免方式
    (1)在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待
    (2)做二级缓存, A1 为原始缓存, A2 为拷贝缓存, A1 失效时,可以访问 A2, A1 缓存失效时间设置为短期, A2 设置为长期

  • redis 有哪三种集群模式
    主从复制,哨兵模式和集群

  • redis 主从复制如何实现的
    原理

    • 从服务器连接主服务器,发送SYNC命令;
    • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
    • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
    • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
    • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
    • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;(从服务器初始化完成)
    • 主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令(从服务器初始化完成后的操作)

优点
(1)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
(2)为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
缺点
主机的宕机都会导致写数据失败,数据丢失

  • 哨兵模式如何实现的
    当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。哨兵模式应运而生。
    功能
    (1)监控主服务器和从服务器是否正常运行。
    (2)主服务器出现故障时自动将从服务器转换为主服务器。
    优点
    主从可以自动切换,系统更健壮,可用性更高。
    缺点
    主从服务器存储的数据是一致的,数据利用率低。在集群容量达到上限时在线扩容会变得很复杂

  • Redis-Cluster集群实现
    redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存。cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容
    特点
    (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
    (2)节点的fail是通过集群中超过半数的节点检测失效时才生效。
    (3)客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
    工作方式
    每一个redis节点上,包含:插槽(slot,0-16384个)和cluster(集群管理的插件)。存取key时,redis根据crc16算法得到一个结果,然后把结果对 16384 取模,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
    为了保证高可用,redis-cluster集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点A1都宕机了,那么该集群就无法再提供服务了
    参考博客https://www.cnblogs.com/51life/p/10233340.htmlhttps://blog.csdn.net/weixin_43666051/article/details/103215071

  • redis持久化
    RDB(redis DataBase): 在不同的时间点将 redis 的数据生成的快照同步到磁盘等介质上):内存到硬盘的快照,定期更新:
    save工作原理:使用redis的主线程进程同步存储,阻塞当前redis服务。直到RDB过程完成,线上服务器不可用。
    bgsave原理:通过fork()创建子进程,在后台进程存储。只有fork阶段会阻塞当前redis服务器,不必到整个RDB过程结束,一般时间很短
    在这里插入图片描述
    优点:RDB是紧凑的二进制文件,存储效率高。适合数据备份或全量存储的场景。恢复速度快。
    缺点:无法做到实时持久化,停机的时候可能会导致大量数据丢失。bgsave指令每次执行都会创建子进程,牺牲掉一些性能。redis不同版本的RDB文件格式版本不一致

AOF(append only file)持久化:保存Redis服务器所执行的写命令来记录数据库状态,命令被追加到 AOF 文件的末尾。AOF只会保存服务器所执行的写(set,del,add 等)的命令,对于其他对结果集并没有造成影响的命令是不会写入aof文件的
AOF重写:例如set某个key两次,其结果肯定为最后一次。Redis引入了AOF重写机制用于压缩aof文件大小。
AOF原理:redis底层采用子进程的方式来将数据同步到aof文件当中,当子进程正在同步时,主进程接收到的所有命令将会暂时存放在缓冲区中,来保证子进程在工作时,主进程接收到的指令不能被保存到aof文件
优点:AOF基于日志形式的理念设计,同步效率高.并且具有重写机制.
缺点:体积大,恢复速度慢

  • redis为何是单线程的?(单线程仅指Redis负责存取这块的线程只有一个,而非Redis中只有一个进程
    因为Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。再说了,单线程切换开销小,容易实现既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
    参考博客:https://zhuanlan.zhihu.com/p/81195864

  • redis为什么是key,value的,为什么不是支持SQL的?
    k-v键值对设计简单,可以满足快速读写功能,这和redis最求快速查询进而设计成内存型数据库的目标是一致的。
    不支持sql是因为官方没做,没必要做,如果做了也不是不可以,但是sql一旦做起来,那就需要支持事务了,是一个完整的数据库,额外需要做很多很多额外的生态和工具。
    而这,就远超一个kv内存存储的范畴了。

  • 10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户
    bitmap数据结构
    时间为key, 用户id为偏移量
    redis 登录_10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户…_weixin_39876650的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值