博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb面试经:redis
阅读量:3889 次
发布时间:2019-05-23

本文共 2296 字,大约阅读时间需要 7 分钟。

1、Redis有哪些数据结构?

(1)5种基础的数据结构:字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。

         

(2)Redis 的特殊数据结构HyperLogLog、Geo、Pub/Sub

HyperLogLog

Redis 的基数统计,这个结构可以非常省内存的去统计各种计数,比如注册 IP 数、每日访问 IP 数、页面实时UV)、在线用户数等。但是它也有局限性,就是只能统计数量,而没办法去知道具体的内容是什么。

Geo

Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作。

Pub/Sub

“发布/订阅”在redis中,被设计的非常轻量级和简洁,它做到了消息的“发布”和“订阅”的基本能力;但是尚未提供关于消息的持久化等各种企业级的特性。

Redis Module

Redis 4.0引入了 Module 。

2、使用过Redis分布式锁么,它是什么回事?

      先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。

3、如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?

      这个锁就永远得不到释放。set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

4、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

     使用keys指令可以扫出指定模式的key列表。

5、如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

    这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

6、使用过Redis做异步队列么,你是怎么用的?

      一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。

7、如果对方追问可不可以不用sleep呢?

      list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

8、如果对方追问能不能生产一次消费多次呢

      使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

9、如果对方追问pub/sub有什么缺点?

       在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。

10、如果对方追问redis如何实现延时队列?

       使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。

11、如果有大量的key需要设置同一时间过期,一般需要注意什么?

       如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

12、Redis如何做持久化的?

     有两种RDB和AOF, RDB 是旧的模式,现在基本上都使用 AOF。

    RDB 缺点:无法秒级持久化。

    RDB 优点:

    1、文件紧凑,适合备份,全量复制场景。例如每 6 小时执行 bgsave,保存到文件系统之类的。

    2、Redis 加载 RDB 恢复数据远远快于 AOF。

      

      对方追问bgsave的原理是什么?你给出两个词汇就可以了,fork和cow。fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

13、Pipeline有什么好处,为什么要用pipeline?

      Pipeline指的是管道技术,指的是客户端允许将多个请求依次发给服务器,过程中而不需要等待请求的回复,在最后再一并读取结果即可。管道技术最显著的优势是提高了 redis 服务的性能。一次性向 redis 服务提交,并最终一次性读取所有服务端的响应。用pipeline主要在提升吞吐量方面。每次请求对应一次IO操作等待,pipeline可以所有的请求合并为一次IO,除了时延可以降低之外,还能大幅度提升系统吞吐量。

注意事项

  • pipeline机制可以优化吞吐量,但无法提供原子性/事务保障,而这个可以通过Redis-Multi等命令实现。
  • 部分读写操作存在相关依赖,无法使用pipeline实现,可利用,但需要在可维护性方面做好取舍。

14、Redis的同步机制了解么?

       Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

15、是否使用过Redis集群,集群的原理是什么?

       Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。

       Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

 

 

 

 

转载地址:http://ttphn.baihongyu.com/

你可能感兴趣的文章
数据库SQL语言语法总结7---嵌入式SQL
查看>>
数据库SQL语言语法总结1---表操作
查看>>
Numpy中stack(),hstack(),vstack()函数详解
查看>>
基于3D卷积神经网络的行为识别
查看>>
K.function用法
查看>>
keras -- multi-loss
查看>>
pytorch数据增强的具体细节
查看>>
pytorch专题 --- load模型
查看>>
VSCode编写C++代码从零开始
查看>>
ESC ubuntu16.04 ipv6配置
查看>>
visual studio 创建 C/C++静态库和动态库
查看>>
2021-05-26
查看>>
ubuntu中配置环境变量
查看>>
ubuntu安装weditor
查看>>
Ubuntu安装NVIDIA显卡驱动
查看>>
vue-cli中实现dolist
查看>>
sass的安装
查看>>
Vue-cli中路由配置
查看>>
豆瓣高分JAVA书籍,你都读过吗?
查看>>
java图书管理系统
查看>>