Redis是一个高性能的非关系型key-value库, 常用来做分布式锁, 缓存.
Redis的键为String类型, 值的类型可以是:
string, list, hash(内部还有域值两个字段), set, zset
Redis特点
-
读写速度快. 达到读11w/s, 写8.1w/s. 是直接对内存读写, 时间复杂度可视为O(1); 采用单线程避免线程切换的开销; 采用多路复用的NIO; 有自己的VM, 调用系统调用更快
-
支持事务操作, 基本操作都是事务, 且支持将几个操作组合成事务
-
支持事务持久化
-
支持主从复制, 主机自动将数据复制到从机, 可以读写分离
-
容量受到物理内存大小限制
-
不具备自动容错和恢复功能
-
较难支持在线扩容, 需要准备足够内存, 可能利用率低
为什么要使用Redis缓存
缓存的优势
-
高性能
从内存中读缓存更快, 但需要在数据库更新时同步更新缓存
-
高并发
数据库和缓存分别服务, 可以支持更多并发操作
Redis相比map/guava的优势
map/guava是本地缓存, 是java程序内部的, 由JVM负责销毁. 如果创建在实例内部, 则仅该实例可见, 其他实例无法共享
Redis是分布式缓存, 位于程序外部, 可以在多实例间共享
Redis使用场景
计数器
Redis可以直接对String自增自减
会话缓存
可以作为多台应用服务器的统一会话服务器, 存储所有会话信息
分布式锁
Redis 自带的SETNX(set not exist, 若存在则set失败)命令可实现分布式锁,还可以使用官方提供的RedLock(安全, 避免死锁, 可容错)分布式锁实现
Redis持久化
RDB
Redis DataBase缩写快照
Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb.
缺点: 可能丢失数据
AOF
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。