redis

匿名 (未验证) 提交于 2019-12-03 00:44:02

.Redis是什么?

Redis 是互联网技术领域使用最为广泛的存储中间件,它是「ReDiService」的首字母缩写,也就是「远程字典服务」。

Redis 能做什么?

Redis的业务应用范围非常广泛,让我们以掘金技术社区(juejin.im)的帖子模块为实例,梳理一下,Redis 可以用在哪些地方?

  1. (hash)。
  2. ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。
  3. (hash)。
  4. ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。
  5. (帖子内容空间占用比较大),减少数据库压力 (hash)。
  6. ID,根据内容推荐相关帖子 (list)。
  7. ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
  8. (zset)。
  9. ID 列表,总热榜和分类热榜 (zset)。
  10. (zset,hash)。

Redis面试

Redis有哪些数据结构(5个)

String、列表List、集合Set、有序集合SortedSetHash

Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。

Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。

Redis分布式锁么,它是什么回事?

setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间

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

set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如

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

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

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

Redis做异步队列么,你是怎么用的?

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

sleep呢?

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

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

pub/sub有什么缺点?

rabbitmq等。

redis如何实现延时队列?

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

key需要设置同一时间过期,一般需要注意什么?

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

Redis如何做持久化的?

aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。

aof文件过大

Redis会定期做aof重写,压缩aof文件日志大小。如果面试官不够满意,再拿出杀手锏答案,Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。这个功能甚至很多面试官都不知道,他们肯定会对你刮目相看。

aof日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。

bgsave的原理是什么?

fork和cow。fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

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

IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。

Redis的同步机制了解么?

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

Redis集群,集群的原理是什么?

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!