redis面试题
1、Redis中的常用数据类型
Hash ,String ,Set ,List
还有一种Redis中的常用数据类型:
字典、跳跃表、整数集合、链表
字典:是一种用于保存键值对的抽象数据结构
字典中, 一个键(key)可以和一个值(value)进行关联, 并且每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 或者根据键来删除整个键值对等,字典在Redis中的应用广泛,比如Redis的数据库就是使用字典作为底层实现的, 对数据库的增删改查操作就是构建在对字典的操作之上的。
字典底层是hash表
2、Redis的常用命令有哪些?
存放键值:set key value
获取键值:get key
设置过期时间:expire key seconds
设置永不过期:persist key
3,Redis是什么?都有哪些使用场景?
Redis是一个单线程的Nospl型数据库(不仅仅是sql)因为可以不用sql来存储数据。
特征: 可扩展,可伸缩。走内存,大数据量下性能高
场景:
(1)为热点数据加速查询(主要场景),如热点商品,热点新闻。
(2)及时信息查询,如排行榜
(3)时效性信息控制,如验证码
(4)分布式数据共享,如分布式说集群中的session分离消息队列???
4、Redis是单线程还是多线程的?为什么?
Redis是单线程的,因为Redis是基于内存操作的。官方给定一个普通的笔记本轻松处理每秒几万条数据。所以单线程足够使用。采用单线程避免了上下文切换,(上下文切换就是线程时间片到了进入阻塞状态,分到时间片后又从阻塞切换到运行状态)和锁的一些问题。
5、Redis持久化有几种方式?如何配置?
Aof(Append Only File 仅附加文件) 和 rdb
RDB:是采用快照技术,记录当前时间下redis数据的二进制状态,定时dump到磁盘上进行持久化。(RDB是redis默认的)
AOF: 以独立日志的方式记录每次写操作(读写,写set操作)
RDB的优缺点:RDB这种持久化方式可以根据自己业务要求来灵活设置快照规则(save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。),而且dump.rdb文件里面是压缩的二进制文件,占内存小,一旦系统出现灾难,我们可以很快恢复。缺点:系统一但在定时持久化之前出现宕机的现象,此前没有来得及写入磁盘的数据就会丢失。(大数据量下的IO性能低)
AOF: AOF很好的解决了数据的持久的实时性问题。可以日志中查看存储的对Redis进行了哪些操作。存储数据快,恢复慢。
服务器的高可用问题:穿透,击穿,雪崩
6、Redis中什么是缓存穿透?如何解决?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oS0ueNO6-1623884947416)(file:///C:\Users\www27\AppData\Local\Temp\ksohtml2464\wps1.jpg)]
Redis的穿透就是用户想要查询一个数据的时候,发现redis中没有,就去数据库中找,数据库中也没有。当用户多的时候,请求都去了数据库,造成数据库压力大,顶不住了。宕机了。
布隆过滤器相当于一个白名单,查布隆过滤器如果没有就返回一个空值。布隆过滤器底层是一个二进制数组,当key过来是,会使用hash算法,算出二进制。
7、Redis的缓存预热?
服务器启动后,用户访问没有数据,预热就是在服务器启动之前,直接将相关的数据加到redis中,使用脚本加。避免在用户请求的时候,先查询数据库,然后再将数据进行缓存,预热后用户直接查询缓存就行。
8、Redis中的击穿?如何解决?
缓存击穿,是指key非常热点,扛着大并发,大并发集中对这个点进行访问,当key瞬间失效(失效),持续的大并发就会穿透缓存,直接请求数据库。造成数据库压力大,宕机了。
解决,预防监控,及时调整过期时间。
9、Redis中的雪崩?如何解决?
缓存雪崩,是指在某一个时间段,缓存集中过期失效。
比如双十一,零点商品进行抢购,将这些上去放入缓存,过期时间为一小时,一小时后,这些商品就会失效,然后对这批商品的访问又会落到数据库上,造成数据库宕机。
解决:调整过期策略,根据业务数据有效期进行分类错峰(A类70分钟,B类60分钟,C类90分钟)
A类中的小类,采用过期时间使用固定值+随机值的形式,避免集中过期。
超热数据设置成永久有效,后期人工维护就行了。(只能解决40%,具体还得找运维商量)
10、Redis支持的数据类型有哪些?其中一个String类型最多存储多大数据?
Redis常用的数据类型:String,Hash, List(存储有顺序的数据),Set(为了查询方便,底层是一个hashmap 只是feil的位置用来存value,value的位置不存), 其中一个String的value最大可以存储512MB的数据。
Java中String的长度65535,字符串有长度限制,在编译期,要求字符串常量池中的常量不能超过65535,
Integer长度 -128 — 127
11、如何保证Redis缓存数据和数据库数据保持一致?
1. 数据库有数据,缓存没有数据;
2. 数据库有数据,缓存也有数据,数据不相等;
3. 数据库没有数据,缓存有数据。
市面上大多数人使用的策略:
1,读的话:首先尝试从缓存中读取,读取到数据则直接返回;如果读不到数据,就读数据库中的数据,并将数据写到缓存,并返回。
2,写的话:需要更新数据库时,先更新数据库,然后把缓存中对应的数据删除。
12、Redis如何实现分布式锁????
13、redis集群的搭建⽅式?(如哨兵集群模式如何搭建)
集群:将多个主从结构连接在一起。对外呈现单机的服务效果。
集群作用:分散单台服务器的访问压力,实现负载均衡;分散单台服务器的存储压力,实现扩展性;降低单台服务器宕机带来的业务压力。
哨兵:哨兵也是一个redis服务器,通常哨兵是单数的,监控所有redis服务器的运行状态,选择,当master挂掉之后选择一个从节点作为master。
哨兵的搭建:1,首先得有集群,配置一个一拖二的主从结构,2,配置三个哨兵,sentinel.conf 3,启动哨兵,redis-sentinel + 配置文件
3个哨兵之间形成了发布订阅模式
redis的集群解决方案 Redis_Cluster
Redis_Cluster的数据存储设计:将所有的集群存储空间分成16384份,存得时候将key按照一定的算法计算出一个值,然后对16384进行取模操作
Redis_Cluster集群的搭建:
(1)配置服务器(3主3从)
(2)建立服务器间的通信(Meet)
(3)分槽(16384个槽)
(4)搭建主从(master-slave)
14、reids集群备份数据的时候会不会影响对外提供服务,为什么?
不会因为是异步的备份的,RDB的bgsave
15、集群怎么监控?
哨兵
16、怎么把新的redis加⼊到集群中?
Cluster集群的扩容问题,看添加的redis是主节点,还是从节点,
如果是从节点:具体的指令好像是: redis-cli --cluster add-node 新的节点的ip和端口 master的ip和端口号。
如果是主节点,输入添加指令,然后再输入分槽指令。
如果删除主节点,又要进行重新分槽。
Cluster nodes 命令 (查看集群中所有节点)
17、redis集群中插槽有多少个?怎么计算?(哈希槽计算出节点分配)
redis的槽是redis_Cluster集群中的概念,一共有16384个槽,槽就是用来存储数据的。当一个key过来时,使用一种类似于hash的算法算出一个值,然后对16384进行取模。
18、高并发怎么处理,redis 10万级QPS
单机也就几万,实现主从架构,读写分离。 redis_cluster(redis集群)