什么是 Redis
redis是一个非关系型数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的读写性能非常出色。
Redis相比memcached有哪些优势?
- redis 可以持久化数据
- redis的速度更快
- redis不仅可以存储简单的字符串类型,还可以存储set、list等数据结构
Redis支持哪几种数据类型?
string、hash、list、set、zset
Redis主要消耗什么物理资源
主要消耗内存
缓存雪崩
他们出现的原理都是访问缓存的时候,key 刚好失效,导致直接访问 DB,压垮后台。
解决办法就是让 key 的过期时间分散开,不要集中失效
缓存穿透
缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
缓存击穿
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
Redis 为什么是单线程的
Redis 设计之初就是纯内存运行,计算速度够快了,若再使用多线程操作的话会因为线程管理问题以及上下文切换耗时,反而会降低性能。Redis 官方测试中一台普通的笔记本电脑没鸟的QPS可达十几万,所以目前来看没有必要使用多线程。
Redis 持久化有几种方式
AOF
RDB
Redis 的过期策略
定时删除:创建一个定时器,让定时器在键过期时来执行删除
对CPU不友好
影响性能
定期删除:每隔一段时间,程序都要对数据库进行一次检查,删除里面的过期键,至于要删除多少过期键,由算法而定。
要么对 CPU 不友好
要么对内存不友好
惰性删除:get Key 的时候才检查是否过期,过期了就删除返回 null
对内存不友好
可能导致内存溢出
淘汰策略、算法
lrf、ttl、random
Redis 为什么这么快
纯内存运行
单线程
数据结构简单
如何生产一次,消费多次
redis支持生产者、消费者。在消费者下线的情况下,生产的消息会丢失
redis的事务
Redis 的乐观锁 Watch 是怎么实现的
字符串类型的值能存储最大容量是多少
512M
Redis key 的过期时间和永久有效分别怎么设置
EXPIRE 和 PERSIST 命令。
Redis 的内存用完了会发生什么
如果达到设置的上限,Redis 的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将 Redis 当缓存来使用配置淘汰机制,当 Redis 达到内存上限时会冲刷掉旧的内容。
Redis 的同步机制了解么?
Redis 可以使用主从同步,从从同步。第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内存 buffer,待完成后将 rdb 文件全量同步到复制节点,复制节点接受完成后将 rdb 镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
Pipeline 有什么好处,为什么要用 pipeline?
可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有因果相关性。使用 redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS峰值的一个重要因素是 pipeline 批次指令的数目。
是否使用过 Redis 集群,集群的原理是什么?
Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务。
(2)Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储。
Redis 集群方案什么情况下会导致整个集群不可用?
有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用。
Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson。
Jedis 与 Redisson 对比有什么优缺点?
Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等 Redis 特性。
说说 Redis 哈希槽的概念?
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
Redis 集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品.
Redis 集群会有写操作丢失吗?为什么?
Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
Redis 集群之间是如何复制的?
异步复制
Redis 集群最大节点个数是多少?
16384 个。
Redis 集群如何选择数据库?
Redis 集群目前无法做数据库选择,默认在 0 数据库。
怎么测试 Redis 的连通性?
答:使用 ping 命令。