1.redis的数据类型有哪些
string(字符串):redis最基础的数据类型,可以存储字符串,整数或者浮点数
Hash(哈希):键值对集合,可存储多个字段,特别适合用于存储对象
List (列表):简单的字符串列表,按照插入的顺序排序,可添加元素到列表头部或尾部。
Set(集合):无序且不重复的字符串集合,通过哈希表实现,添加,删除,查找的复杂度都 是 O(1)
redis数据类型的优缺点:
优点:多样化的数据类型 高性能,数据持久化 ,高可用性
确定:内存限制,数据丢失风险 ,复杂度
2.redis为什么那么快??
1.使用内存存储:数据直接存储在内存中,避免了磁盘I/O带来的演出,能够快速读写
2.高效的数据结构
3.单线程模型:避免了多线程竞争和上下文切换开销,能专注高效的处理请求
4.非阻塞I/O:使用非阻塞的网络I/O操作,减少等待时间
5.事件驱动机制:通过事件驱动机制,高效的处理各种网络事件和命令处理
6.代码优化:redis的代码经过高度优化,执行效率高
3.redis的存储方式有哪些 如何开启
RDB(Redis DataBase):
这是一种快照的形式的持久化方式,开启RDB持久化,可在配置文件(redis.conf)中设置
save 900 1 # 在 900 秒内如果有 1 个键被修改则触发保存
save 300 10 # 在 300 秒内如果有 10 个键被修改则触发保存
save 60 10000 # 在 60 秒内如果有 10000 个键被修改则触发保存
AOF(Append Only File):
以日志形式记录每个写操作。开启 AOF 持久化,在配置文件中设置:
appendonly yes
#并且可以通过设置 appendfsync 选项来控制同步策略,如 always(每次写操作都同步)、everysec(每秒同步一次)等。
4.redis存储方式RDB和AOF的区别
RDB:
- 优点:
- 生成的文件紧凑,体积相对较小,适合备份和数据恢复。
- 恢复数据速度快。
- 缺点:
- 可能会丢失一段时间的数据,因为只有在达到触发条件时才会进行快照。
- 数据量大时,创建快照可能会导致一定时间的服务停顿。
AOF:
- 优点:
- 数据安全性更高,通过日志可以尽可能完整地记录所有操作,丢失数据的风险较小。
- 可以灵活设置同步策略。
- 缺点:
- 文件体积通常比 RDB 大。
- 恢复数据相对较慢,因为要重放所有的写操作。
- 对性能有一定影响,尤其是在同步策略设置为实时同步时。
5.redis存放方式rdb的同步策略
全量同步:一般发生在 Slave 初始化阶段,这时 Slave 需要将 Master 上的所有数据都复制 一份
增量同步:Redis 增量复制是指 Slave 初始化后开始正常工作时主服务器发生的写操作同步 到从服务器的过程
在 Redis 主从同步中,主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。 当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先 会尝试进行增量同步,如不成功,要求从机进行全量同步。
6.redis存放方式aof的同步策略
- always(每修改同步):每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。
- everysec(每秒同步):每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
- no(不同步):完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。
7.redis的内存淘汰策略
redis提供了多种内存淘汰策略,用于在内存不足时删除数据,以确保新数据能够存入。
- noeviction:不淘汰数据,当内存不足以容纳新写入数据时,新写入操作会报错 ( 这是 Redis 的默认淘汰策略。)
- allkeys-lru:使用 LRU(Least Recently Used,最少使用)算法,在所有键中,删除最近最少使用的键。
- allkeys-random:从所有键中随机删除某个键。
- volatile-lru:使用 LRU 算法,在设置了过期时间的键中,删除最近最少使用的键。
- volatile-random:在设置了过期时间的键中,随机删除某个键。
- volatile-ttl:在设置了过期时间的键中,删除剩余存活时间最短的键。
- volatile-lfu:使用 LFU(Least Frequently Used,最不经常使用)算法,在设置了过期时间的键中,删除使用频率最低的键。
- allkeys-lfu:使用 LFU 算法,在所有键中,删除使用频率最低的键
要设置 Redis 的内存淘汰策略,可以通过修改 Redis 的配置文件(redis.conf)或使用 Redis 命 令行来进行配置 :
config set maxmemory-policy 策略名
内存使用达到限制时,Redis 会根据配置的淘汰策略进行数据删除。
8.redis在项目中的使用
验证码 token 热点数据的缓存 防止表单重复提交 resission分布式锁
计数器 :可以实现如文章点赞数、访问量等计数功能
排行榜:构建各种排行榜,如用户积分排行榜等
9.热点数据缓存的时候怎么保证mysql和redis的数据一致性
- 先更新数据库,再删除 Redis 缓存:这是比较常见的做法。在更新数据库成功后,立即删除 Redis 中对应的缓存数据,当下次读取时会重新从数据库加载并更新到 Redis。要注意处理删除缓存失败的情况,可以进行重试。
- 订阅数据库 binlog 来更新 Redis:通过监听数据库的二进制日志,一旦有数据变更,根据 binlog 信息来同步更新 Redis,这样可以保证较高的实时性和一致性。
- 分布式事务:可以使用分布式事务机制,确保数据库更新和 Redis 缓存操作在一个事务中完成,但这种方式相对复杂且可能对性能有一定影响。
- 设置合理的过期时间:即使出现不一致的情况,通过合理设置 Redis 缓存数据的过期时间,也能在一定程度上减少不一致的影响,后续会自动刷新为最新数据。
- 定期全量同步或增量同步:定期将数据库的数据全量或按照一定规则增量同步到 Redis,以纠正可能出现的不一致。
- 消息队列:将数据库更新操作发送到消息队列,由专门的处理程序根据消息来同步 Redis 缓存,确保操作的顺序性和一致性。
10:redis的缓存击穿 穿透 雪崩现象 每种现象如何解决的
- 缓存击穿:
- 现象:缓存中没有但数据库中有数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
- 解决方案:
- 设置热点数据永远不过期;
- 设置热点数据的存活时间较长,且分布均匀的岔开过期时间;
- 接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时,可进行熔断,失败快速返回机制;
- 使用互斥锁(mutex key),在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如redis的setnx)去set一个mutex key,当操作返回成功时,再进行load db的操作并更新缓存,否则就重试整个get缓存的方法。
- 缓存穿透:
- 现象:当请求的数据不存在于缓存和数据库中时发生。
- 解决方案:
- 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
- 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用),这样可以防止攻击用户反复用同一个id暴力攻击;
- 布隆过滤器。
- 缓存雪崩:
- 现象:当大量缓存key同时过期时发生,导致缓存失效率剧增。
- 解决方案:
- 设置不同过期时间,为不同key设置不同的过期时间,避免大量key同时过期;
- 分流限流,通过限流措施,控制并发请求量,避免大量请求同时访问缓存;
- 缓存预热,在服务器启动时或定期预加载热门数据到缓存中;
- 灾难恢复方案,建立故障转移机制,在缓存不可用时自动切换到备用缓存或数据库。