数据类型

String, List, Set, Sorted Set, Hash

线程模型

内部采用单线程 NIO + 事件监听处理机制,处理各种操作。

为什么 Redis 单线程模型也能效率这么高?

  1. redis是内存数据库,不需要磁盘操作
  2. 基于NIO机制
  3. 单线程不需要线程切换开销
  4. Hash存储结构,访问快

Redis 有几种持久化方式?

两种

  1. 全量——RDB方式,定期写文件
  2. 增量——AOF方式,记录更新的日志

对比

RDB:时间上更灵活。性能上更高,因为不需要在更新操作的同时持久化。恢复也更快更容易。缺点是可能丢失部分数据。

AOF:数据更完整。缺点是:日志文件比数据文件还大。性能受影响,因为需要同步。不一定可靠。

选择

以AOF(数据更完整)为主,配合RDB(AOF损坏或丢失情况)为辅,两种都是用。

Redis 有几种数据“过期”策略?

三种删除策略

被动删除:读写一个过期的key时,会触发惰性删除策略,把这个key删掉

主动删除:过期key没有被惰性删除策略删除,Redis定期主动淘汰掉过期key。

主动删除:内存超过限制时,主动删除过期key,也就是淘汰机制。

Redis 有哪几种数据“淘汰”策略?

六种淘汰策略

volatile-lru ——从已设置过期时间中选择最近最少使用
volatile-ttl ——从已设置过期时间中选择将要过期
volatile-random ——从已设置过期时间中选择随机
allkeys-lru——从所有数据中选择最近最少使用
allkeys-random——从所有数据中选择随机
no-enviction——不淘汰

MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?

使用volatile-lru或者allkeys-lru策略淘汰一些数据

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

太多key同时过期会引起卡顿,所以应该避免这种同时过期。

一般需要在时间上加一个随机值,使得过期时间分散一些

另外可以调大配置文件中的 hz 参数,可提高 Redis 主动淘汰的频率,让每次过期的 key 更多。

聊聊 Redis 使用场景

数据缓存

会话缓存

时效性数据

计数器

社交列表/好友列表/热门列表/排行榜

分布式队列

分布式锁

Redis 支持的 Java 客户端都有哪些?

jedis

如何使用 Redis 实现分布式锁?

方法一:SET命令——单机节点场景

SET key value EX seconds NX

Redis可以让set value 和 set expire time合并成一个原子操作,保证在redis挂掉的情况下的正确性。

方法二:redlock——分布式集群场景

什么是 Redis 事务?

通过 MULTI 命令开启一个事务,在该语句之后执行的命令都,将被视为事务之内的操作,最后我们可以通过执行 EXEC / DISCARD 命令来提交 / 回滚该事务内的所有操作

如何实现 Redis CAS 操作?

在 Redis 的事务中,WATCH 命令可用于提供CAS(check-and-set)功能

Redis 集群都有哪些方案?

什么是 Redis 主从同步?

Redis 有哪些重要的健康指标?

 

 

 

 

 

 

 

 

 

04-04 12:24