Redis特性
Redis是一直基于键值对的NoSQL数据库;
Redis支持5种主要数据结构:string、hash、list、set、zset以及bitmaps、hyperLoglog、GEO等特化的数据结构;
Redis是内存数据库,因此它有足够好的读写性能;
Redis支持持久化,redis支持AOF和RDB两种持久化方式,确保了内存中的数据不会“丢失”;
Redis的sentinel和复制功能保证了Redis的高可用;
Redis支持key维度的数据过期;
Redis支持发布订阅、“事务”、pipeline、Lua脚本等附加功能。
使用场景
Redis 适合做什么
缓存,Redis本身是内存数据库,注定有极高的读写速度和吞吐,加上数据过期功能以及完善的数据淘汰策略使得Redis拥有与生俱来的缓存潜质。
排行榜系统,Redis提供了zset、list等复杂数据结构,以及极佳的性能,可以做出时间、数量等各种维度的排行榜系统。
计数器系统,对于视频(音乐)网站的视频播放量、网页浏览量等高频操作,传统的关系型数据库不能够满足需求,Redis本身知道incr、incrby等命令很好的支持了这计数功能。
社交网络,Redis支持多种复杂数据结构,比如一个用户有自己的粉丝,同时也会关注其他人,这些多可以使用set来存储,如果需要有序,可以使用zset来存储,这些复杂的数据结构传统的关系型数据库并不能很好的支持,同时,由于社交网络网站本身访问量比较大,传统数据在性能上也是不能够满足的。
消息队列,Redis提供了消息队列功能,能够满足一般的消息队列需求。
分布式锁,Redis提供了SET key value [EX seconds] [PX milliseconds] [NX|XX]命令,以及Lua脚本功能,基于此能够很好的实现分布式锁功能。
Redis 不适合做什么
每种产品都有自己的特定的应用领域。Redis也不是万能的。
Redis是内存数据库,相比磁盘类型的数据库成本要高不少,注定了Redis不能用于存储大规模的数据(土豪忽略)。
Redis有足够高的性能,因此对于热数据能够很好满足需求,但如果冷数据存在Redis里不免过于浪费(土豪忽略)。
Redis数据存储在内存中,对于可用性要求极高,且需要永久保存的数据不建议放在Redis中,虽然Redis提供持久化、复制等功能保证数据落盘,但持久化、复制等也存在时间差,这段时间的数据也不是能够完全保证不丢失的。
Redis是单线程的,对于数据比较大的数据的读写操作会阻塞整个数据库,因此Redis不适合存储单个value比较大的数据。
相比其他KV数据库,Redis提供了丰富的数据结构来满足用户的不同需求。同时,可以说Redis在内存使用是锱铢必较。为了最大可能的节约内存,Redis的每一种数据结构都拥有2~3种(截止Redis6.0,后续可能会更多)的底层实现。比如,在list、hash、set、zset等复杂数据结构在数据量较小的情况下都会使用ziplist这种数据结构等,由于ziplist是连续空间,不影响指针等附加消耗,在数据量较小的时候读写速度劣势也并不明显,但是可以节约不少存储,尤其是在实际使用场景种往往小数据占比较大的情况下内存节约更为明显。
这里给大家展示一部分Redis相关的面试题集,一部分解析,更多的Redis面试整理解析可以看整理的《大厂Redis高频面试75题解析文档》
Redis缓存
Redis实现分布式锁
JVM性能调优
- Java内存区域
- 垃圾回收器和内存分配策略
- JVM的执行子系统
- 编写高效优雅Java程序
-
深入了解性能优化
MySQL性能优化
- 事务
- 锁
- SQL优化原则
- JOIN的原理
- 执行计划与执行明细
- 执行流程
- 表结构对性能的影响
-
索引
我的Spring学习笔记
- Spring类
- Spring MVC
- Spring AOP
- Spring IOC
-
事务管理
Spring学习笔记思维脑图
俗话说的好,只要功夫深,铁杵磨成针,平时准备好,面试不用慌。
还有更多的面试刷题库:《1000道互联网高频面试解析》《489道资深工程师面试解答》《JAVA核心面试知识点整理》
《1000道互联网高频面试解析》
本篇PDF文档包含各大互联网公司面试高频题,刷完基本面试没有问题,只是面试造飞机,工作拧螺丝就得看自己啦!