数据类型
String, List, Set, Sorted Set, Hash
线程模型
内部采用单线程 NIO + 事件监听处理机制,处理各种操作。
为什么 Redis 单线程模型也能效率这么高?
- redis是内存数据库,不需要磁盘操作
- 基于NIO机制
- 单线程不需要线程切换开销
- Hash存储结构,访问快
Redis 有几种持久化方式?
两种
- 全量——RDB方式,定期写文件
- 增量——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)功能