redis基本数据类型
Redis⽀持五种主要数据结构:字符串(Strings)、列表(Lists)、哈希表(Hashes)、集合(Sets)和有序集合(Sorted Sets)。这些数据结构为开发者提供了灵活的数据操作⽅式,满⾜了不同场景下的数据存储需求。 • 字符串(Strings):最基本的数据类型,可以包含任何数据,如数字、字符串、⼆进制数据等。在Redis中,字符串是⼆进制安全的,这意味着它们可以有任何⻓度,并且不会因为包含空字符⽽被截断。 • 列表(Lists):简单的字符串列表,按照插⼊顺序排序。你可以添加⼀个元素到头部(左边)或者尾部(右边)。 • 哈希表(Hashes):是键值对的集合,是字符串类型的字段和值的映射表。适合存储对象。 • 集合(Sets):是字符串类型的⽆序集合。它是通过哈希表实现的,可以做到添加、删除、查找的时间复杂度都是O(1)。 • 有序集合(Sorted Sets):和Sets相似,但每个字符串元素都会关联⼀个浮点数类型的分数。元素的分数⽤来排序,如果两个成员有相同的分数,那么他们的排名按照字典序计算
Redis的持久化机制
RDB(Redis DataBase) :存的是数据的2进制文件,恢复快。备份间隔最少也要5分钟,也就是最少丢失5分钟数据。
AOF(Append Of File) :存的是指令文件,恢复慢(需要一条一条执行指令),最多丢失一秒的数据。文件体积较大、性能较差
AOF+RDB : RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。
下图是生成的对应的文件。
缓存雪崩
缓存中的大量key同时失效,导致大量的流量请求到达db中,导致db负载压力过大
解决方式:让key不在同一时间失效,分散开来
缓存穿透
大量的请求同时访问一个根本不存在的key,导致大量流量走到db。
解决方式:设置为null或者使用布隆过滤器判断是否存在该key
缓存击穿
大量的请求同时访问一个过期的key,导致大量流量走到db。
解决方法:加分布式锁
当redis作为db的热点数据时先写DB?还是先写redis?
情景一:先写redis或先写db,不适用场景为当我们项目中有大量的写流量的时候
情景二:先删redis或先删db,不适用的场景为当redis中的数据没有过期时间的时候
情景三:延迟双删,不使用的场景为像秒杀系统这种频繁去修改数据和要求数据强一致的场景
情景四:异步同步,根据mysql的binglog发送消息,在消费消息的时候更新redis,不适用的场景为redis没有过过期时间
分布式锁
为甚要用分布式锁?
普通的锁只能锁单台机器,无法解决在多台机器对于共享资源的并发问题。
如何建立一个分布式锁?
setnx,并设置过期时间,看门狗自动续约。
redis架构
集群模式
新增节点:一致性hash
数据分布不均匀:虚拟节点
主从模式
全量复制: