基本理论知识。
1.Redis作用定位
关系型数据库不适用于超大规模、高并发的项目,是由于每次请求都需要I/O读取数据,速度必然不会太快(中小型没有高并发需求的项目不太需要考虑这个问题)。为了提高效率满足需求,则将数据放在内存,每次数据调用无需读取外存,速度大大提高。
Redis是非关系型数据库,首次从数据库调用数据,同时Redis将数据缓存在内存,下次再调用相同的数据就可以从内存直接调用。注意,需保证Redis和Mysql的数据一致性。
Redis是单线程原子操作,可类比操作系统中的进程“并发”概念,升级后的Redis微观上仍是原子操作,只不过宏观上显得同步执行而已。
2.数据类型
2.1 String类型
String是字符串类型,是最基本的数据类型。由于其原子性操作特征(原子操作不可再分割,要么完全执行,要么完全不执行,不存在中间状态,因此在执行过程中不会因为任何中断而被割裂),适合用作计数器和存储登录 Session 的共享数据。
应用①:计数器(eg 网页访问计数、商品数量计数等)
INCR→原子自增
DECR→原子自减
应用②:登录 Session 共享
当用户登录后,使用String 类型来存储 Session 数据,确保用户在访问不同应用实例时。能够维持登录状态,实现多个应用实例之间共享用户的登录状态(Session)。
用户登录时,服务器生成一个唯一的 Session ID,并将其作为键,将用户信息序列化为字符串作为值存储到 Redis 中→Session ID 被发送给用户的浏览器,浏览器在后续的请求中会携带这个 Session ID→多个应用实例可以通过检查 Redis 中的 Session ID 来验证用户的登录状态,实现 Session 的共享。
2.2 Hash类型
每个Hash有一个键(Key)、若干字段(Field)及对应的值(Value)。
键(Key):Hash 的唯一标识符。
字段(Field):Hash 内部的键,用于存储具体的数据。
值(Value):与字段相关联的值。
2.3 List类型
List 类型是一个双向链表,可以存储一系列的值,这些值可以是字符串或数字。List 允许重复的值,并且可以进行多种操作,如从两端推入或弹出元素、索引特定元素、获取子列表等。
应用:用户收藏文章列表
每篇文章可以用一个唯一的标识符(比如文章ID)来表示,将每个用户收藏的文章ID存储在一个列表中。
2.4 Set类型
Set类型存储的数据是无序的,且不可重复,提供了丰富的操作,比如添加、删除、判断元素是否存在、获取集合大小、进行集合间的运算(交集、并集、差集)等。
应用:
①去重-需要存储一组唯一的元素时,比如用户标识、邮箱地址等,可以使用Set来自动去重。
②抽奖-将所有参与者的标识符添加到Set中,然后使用spop命令随机选择一个幸运者。
2.5 ZSet类型
因为允许将一个唯一的分数(或称排序权重)与每个元素关联,所以有排序效果。
应用:实时排序(排行榜系统、时间线等)
3. key、value设计
3.1 Value
法1:①是否要排序。是→sort set;否→②
②多个值,数据重复→list、数据不重复→set
③单个值,简单数据→string、对象→hash
法2:①要排序→sort set ②剩下用string
3.2 Key
①唯一性→使用缓存数据的主键为key
②可读性→加可读性前缀(设计要规范)
③灵活性【后续应用再说明】
④时效性→设置时间限制
4. 持久化机制
Redis 提供了两种主要的持久化机制:RDB(Redis Database)和 AOF(Append Only File),以及它们的混合持久化。
4.1快照方式-RDB(Redis Database Backup)
将 Redis 内存中的数据在某个时间点完整地保存为一个二进制快照文件(.rdb 文件),这种方式生成的文件大小相对较小,存储格式紧凑。
优点:
①高效备份:生成的 RDB 文件体积较小,备份更快,占用的存储空间也更少
②快速传输:由于文件小,RDB 文件可以通过网络快速传输到远程备份服务器或云端,适合异地容灾备份的需求
③恢复时间短:加载一个 RDB 文件直接将 Redis 恢复到某个时间点的数据状态,比 AOF 回放所有操作记录的方式恢复速度要快得多,适合需要快速恢复系统的场景。
缺点:
①做不到秒级持久化
②RDB版本不同易引起兼容问题
触发方式:
①手动触发
·SAVE 命令
SAVE 命令会立即在 Redis 主进程中执行同步持久化操作,将当前内存中的数据保存为 .rdb 文件。
该命令会阻塞 Redis 主进程,直到持久化操作完成。在此期间,Redis 将无法处理任何其他请求。
适用于小规模的数据量或在非高并发的情况下手动执行备份。通常不推荐在生产环境中使用。
·BGSAVE 命令
BGSAVE 命令是非阻塞的,它会触发 Redis fork 一个子进程,子进程负责生成 RDB 文件,而主进程继续处理客户端请求。
特点:
异步执行,不会阻塞 Redis 主进程,Redis 可以继续处理其他命令;
适用于生产环境,在高并发下需要手动触发快照生成时使用,确保系统的性能不受影响。
②自动触发
基于 Redis 配置文件(redis.conf)中的 save 参数。该参数定义了在一定的时间范围内如果满足指定的条件(发生了多少次写操作),就会自动触发 RDB 持久化操作。
4.2 AOF(Append Only File)
AOF以独立日志的方式记录每次写命令并将其追加到 AOF 文件中。
优点:
①安全性高,即使突然断电,AOF文件未损坏,数据丢失的机会很小
③AOF太大时,会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,这个过程称为AOF重写。
缺点:
①同数据量下,AOF体积大于RDB,占更大的内存空间
②由于体积大,AOF比RDB慢
4.3 RDB-AOF混合方式
RDB作全量备份(先把当前数据以RDB形式写入文件的开头)+ AOF作增量备份(后续操作命令以AOF的格式存入文件)
5. 内存淘汰机制(内存空间达到上限)
5.1 TTL:提前淘汰设置了过期时间的数据
5.2 LRU:淘汰最近最少访问的数据(看时间)
5.3 LFU:淘汰一定时间内使用次数最少的(频次)
5.4 随机淘汰
6. 过期key处理
6.1惰性删除→过期直接删除
优:对CPU友好
缺:key长期不用会造成内存浪费
6.2定时删除→创建定时器,达到过期时间点删除
缺:额外让出CPU维护定时器
6.3定期删除→隔一段时间检查数据