Redis简单面试问题汇总

nosql数据库简介
nosql以简单的kv模式存储,因此大大增加了数据库的扩展能力

  • 不遵循sql标准
  • 不支持acid
  • 远超于sql的性能

适用场景:

  • 对数据高并发的读写
  • 海量数据的读写
  • 对数据的高可扩展性
    例如:秒杀(高并发的场景)

不适用:

  • 需要事务支持
  • 给予sql的结构化查询存储,处理复杂的关系,需要及时查询
    常用五大数据类型

常见的nosql有:memcache redis mongodb
redis的一些特征:

  1. redis是一个开源的kv存储系统
  2. 和memcahce一样,支持存储的value类型相对比较多,包括string,list,set,zset,hash
  3. 这些数据类型都支持push pop add remove以及交集并集差集等操作,而且这些操作都是原子性的。
  4. 在此基础上,Redis支持各种不同方式的排序 数据都缓存在内存中 周期性的把更新的谁写入磁盘或者把修改的操作写入了追加的记录文件中
  5. 实现主存

项目中一般用redis做什么:缓存,手机验证码,视频点赞
一些相关的八股:

问题答案
为什么要用redis快 100000 qps(每秒查询次数)
为什么快1.因为是在内存中操作,操作也简单 2.数据结构简单 3.采用单线程 4.采用io多路复用原则,非阻塞io
单线程为什么可以处理高并发因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 加锁麻烦,单线程多进程集群方案,cpu消耗,切换上下文
什么是FD(文件描述符)一个文件描述符,一个 打开的文件 通过文件描述符进行引用,是打开文件的元数据到文件本身的映射
select/epoll/kqueue/evport这些函数是干什么的?怎么选择1.根据不同的环境选择不同的函数 2.有epoll/kq/evport用他们,如果没有就用select,时间复杂度较差 3.基于react设计模式监听io事件
Redis有哪些常用的数据类型string(二进制安全,最基本的 数据类型,之后的四种都是基于string进行存储的)hash list set zset
Redis有哪些常用的命令ping - pong set(写) get(读) incr(加一,自增,如果不是整数,就返回错误)decr(自减,与incr相对应)hmset(创建hash表)hget(查hash表)hset(写/修改hash)lpush(list中添加数)lpop(list中删除数)lrange(顺序输出)sadd(set添加东西) smembers(查看set中的所有value) zadd (zadd zset 1 member)zrangebyscore hyperloglog geo
如何从海量key中查询某一个特定前缀的keykeys命令可以查 但是keys有一个缺点就是在运行的时候服务器会吃出现一定的卡顿,所以如果此时redis服务器在运行的时候,会影响其他服务的运行,所以可以使用scan cursor match count,可以解决这个问题,是迭代的形式,可以使用java,设计一个set,然后返回一个游标和结果集,然后只要把cursor迭代一下就可以了,然后直到cursor还是原来的值
如何使用Redis实现分布式锁分布式锁需要解决的问题是互斥,安全,死锁,容错,第一种解决方法:使用setnx和expire组合,两个操作都是原子性的,缺点但是组合在一起,可能会违背了原子性的操作,所以有可能会让其他的线程永远得不到资源,-》第二种方法,直接用set,set key value ex 10 / px 10000 nx|xx (需要注意:大量key同时过期,可能会出现卡顿,所以在过期时间设置一个随机值)
如何使用redis实现消息队列第一种方法:rpush lpop,缺点:没有等待队列里有值就直接消费*-》第二种方法*:可以在应用层调用sleep机制去调用lpop,缺陷:不想在应用层麻烦用sleep,-》第三种方法: 使用blpop:阻塞直到消息到来,超时返回nil,缺陷:只能让一个消费者去收到消息-》**第四种方法:**publish/subscript,类似于观察者模式,缺陷:消息的发布是无状态的,无法保证可达,就需要kafka/rabbitmq来解决了
redis如何做持久化rdb,aof
缓存和数据库一致性问题可以看一下这篇文章一致性问题1. 设置一个时间,去定时的将数据库中的数据刷入缓存中,但是会有缺点,缓存利用率低,并且数据不一致 2. 采用更新数据库+更新缓存的方法,在「并发」场景下无法保证缓存和数据一致性,且存在「缓存资源浪费」和「机器性能浪费」的情况发生 3. 在更新数据库 + 删除缓存的方案中,「先删除缓存,再更新数据库」在「并发」场景下依旧有数据不一致问题,解决方案是「延迟双删」,但这个延迟时间很难评估,所以推荐用「先更新数据库,再删除缓存」的方案 4. 在「先更新数据库,再删除缓存」方案下,为了保证两步都成功执行,需配合「消息队列」或「订阅变更日志」的方案来做,本质是通过「重试」的方式保证数据一致性 5. 在「先更新数据库,再删除缓存」方案下,「读写分离 + 主从库延迟」也会导致缓存和数据库不一致,缓解此问题的方案是「延迟双删」,凭借经验发送「延迟消息」到队列中,延迟删除缓存,同时也要控制主从库延迟,尽可能降低不一致发生的概率
redis产生的问题1缓存击穿缓存击穿:请求的 key 对应的是 热点数据 ,该数据 存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期)如何解决:1.设置热点数据永远不会过期;2. 针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。3. 请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。
redis产生的问题2缓存穿透大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。如何解决:1. 缓存无效key,将无效的key存放起来,在短时间内不会再对此key进行处理,但是如果很多的无效key不能从根本上解决;2. 使用bloom过滤器,但是会有一定的概率判断错误
redis产生的问题3缓存雪崩缓存雪崩是指段时间内大面积的缓存失效,导致很多请求打在数据库上,有可能会造成宕机。解决办法:1. 使用redis集群,导致一个节点的实效不会影响集群, 2. 限流,避免大量的请求同时来 3. 设置随机过期时间 4. 设置二级缓存
redis有哪些用途缓存、分布式锁、消息队列、限流、复杂业务场景(通过 bitmap 统计活跃用户、通过 sorted set 维护排行榜)
redis有哪些数据类型5种常见的数据类型(string hash list map set),3种特殊的数据类型(hyperloglog bitmap geo)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值