【Java面试】Redis

编程入门 行业动态 更新时间:2024-10-09 00:51:22

【<a href=https://www.elefans.com/category/jswz/34/1770091.html style=Java面试】Redis"/>

【Java面试】Redis

文章目录

    • 一、概述
      • 1、什么是Redis?
      • 2、Redis有哪些优缺点?
      • 3、为什么要用 Redis缓存?
      • 4、为什么要用 Redis 而不用 map/guava 做缓存?
      • 5、Redis为什么这么快?
    • 二、数据类型
      • 1、Redis有哪些数据类型
      • 2、Redis的应用场景
    • 三、持久化
      • 1、什么是Redis持久化?
      • 2、Redis 的持久化机制是什么?各自的优缺点?
      • 3、如何选择合适的持久化方式?
      • 4、Redis持久化数据和缓存怎么做扩容?
    • 四、删除策略
      • 1、Redis的过期策略
      • 2、Redis的内存淘汰策略 (重点)
      • 3、Redis key的过期时间和永久有效分别怎么设置?
    • 五、内存相关
      • 1、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
      • 2、Redis主要消耗什么物理资源?
      • 3、Redis的内存用完了会发生什么?
      • 4、Redis如何做内存优化?
    • 六、线程模型
      • 1、Redis线程模型
    • 七、事务
      • 1、什么是事务?
      • 2、Redis事务的概念
      • 3、Redis事务的三个阶段
      • 4、Redis事务相关命令
      • 5、事务管理(ACID)概述
      • 6、Redis事务支持隔离性吗?
      • 7、Redis事务保证原子性吗,支持回滚吗?
      • 8、Redis事务其他实现
    • 八、集群方案
      • 1、哨兵模式
      • 2、官方Redis Cluster 方案(服务端路由查询)
      • 3、基于客户端分配
      • 4、基于代理服务器分片
      • 5、Redis 主从架构
      • 6、Redis集群的主从复制模型是怎样的?
      • 7、生产环境中的 redis 是怎么部署的?
      • 8、说说Redis哈希槽的概念?
      • 9、Redis集群会有写操作丢失吗?为什么?
      • 10、Redis集群之间是如何复制的?
      • 11、Redis集群最大节点个数是多少?
      • 12、Redis集群如何选择数据库?
    • 九、分区
      • 1、Redis是单线程的,如何提高多核CPU的利用率?
      • 2、为什么要做Redis分区?
      • 3、你知道有哪些Redis分区实现方案?
      • 4、Redis分区有什么缺点?
    • 十、分布式问题
      • 1、Redis实现分布式锁
      • 2、如何解决 Redis 的并发竞争 Key 问题?
      • 3、分布式Redis是前期做还是后期规模上来了再做好?为什么?
      • 4、什么是 RedLock?
    • 十一、缓存异常
      • 1、缓存雪崩
      • 2、缓存穿透
      • 3、缓存击穿
      • 4、缓存预热
      • 5、缓存降级
      • 6、热点数据和冷数据
      • 7、缓存热点key
    • 十二、常用工具
      • 1、Redis支持的Java客户端都有哪些?官方推荐用哪个?
      • 2、Redis和Redisson有什么关系?
      • 3、Jedis与Redisson对比有什么优缺点?
    • 十三、其他问题
      • 1、Redis与Memcached的区别
      • 2、如何保证缓存与数据库双写时的数据一致性?
      • 3、Redis常见性能问题和解决方案?
      • 4、Redis官方为什么不提供Windows版本?
      • 5、一个字符串类型的值能存储最大容量是多少?
      • 6、Redis如何做大量数据插入?
      • 7、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
      • 8、使用Redis做过异步队列吗,是如何实现的?
      • 9、Redis如何实现延时队列?
      • 10、Redis回收进程如何工作的?
      • 11、Redis回收使用的是什么算法?

一、概述

1、什么是Redis?

Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。

Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。

与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。


2、Redis有哪些优缺点?

优点:

  • 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点:

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  • Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

3、为什么要用 Redis缓存?

主要从“高性能”和“高并发”这两点来看待这个问题。

高性能:

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

高并发:

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。


4、为什么要用 Redis 而不用 map/guava 做缓存?

缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。

使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。


5、Redis为什么这么快?

(1)完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);

(2)数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;

(3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

(4)使用多路 I/O 复用模型,非阻塞 IO;

(5)使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;


二、数据类型

1、Redis有哪些数据类型

Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求。

数据类型可以存储的值操作应用场景
String字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作做简单的键值对缓存
List列表从两端压入或者弹出元素,对单个或者多个元素进行修剪,只保留一个范围内的元素存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的数据
Set无序集合添加、获取、移除单个元素,检查一个元素是否存在于集合中,计算交集、并集、差集,从集合里面随机获取元素交集、并集、差集的操作
Zset有序集合添加、获取、删除元素,根据分值范围或者成员来获取元素,计算一个键的排名去重但可以排序,如获取排名前几名的用户
Hash包含键值对的无序散列表添加、获取、移除单个键值对,获取所有键值对,检查某个键是否存在结构化的数据,比如一个对象

另外官网中显示Redis还有几种数据类型:Geo(地理空间),HyperLogLog(基数统计),Bitmap(位图)。


2、Redis的应用场景

  • 计数器
    可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数

更多推荐

【Java面试】Redis

本文发布于:2024-03-09 18:52:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1725797.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Java   Redis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!