Redis总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3638字,纯文字阅读大概需要6分钟。
内容图文
![Redis总结](/upload/InfoBanner/zyjiaocheng/877/ce1b41a8da864a86a4b6a899f3b29ef5.jpg)
本文不定期更新。
一、Redis 简介
Redis 是一个开源的内存结构存储系统。可作于数据库、缓存和消息中间件。
二、常用数据类型
- String 字符串。
- Hash 散列。
- List 列表。
- Set 集合。
- ZSet 有序集合。
- Stream 流(用于消息队列)。
- pub/sub
三、 持久化方案
- RDB(Redis Database)。每间隔一段时间生成一个快照,快照生成则覆盖,只有一个快照文件。这种是Redis默认的方案。优点是恢复快,缺点是可能损失的数据会大。
- AOF(Append Only File)。系统记录每一个进程插入或修改的日志,文件会一直增加。优点是恢复慢,由于是同步新增日志,所以损失可以忽略不计。
四、为什么快
- 完全基于内存。要么是数据在内存,要么是数据在硬盘,索引在内存。
- 数据结构简单。
- 网络模块单线程,减少了不必要的上下文切换和竞争,不用考虑各种锁的性能消耗。
- 使用多路复用 IO 模型,非阻塞 IO。
五、缓存穿透、击穿、雪崩
缓存穿透
缓存穿透就是穿过缓存进入数据库。正常来说使用缓存的流程是这样的。
- 根据一个 key 从缓存中获取数据。
- 获取到数据就返回。没有获取到数据,则从数据库中获取数据。
- 获取到数据就将数据放入缓存,然后返回,没有则直接返回。
如果知道一个肯定不存在的数据的 key,请求就会访问数据库,如果恶意攻击的话,会导致数据库压力过大。
解决方案:
- 如果一个 key 为空的话,可以将这个 null 值存到缓存中,设置一个过期时间。
- 接口层增加拦截校验。
缓存击穿
缓存击穿是指从一个点击穿缓存,进入数据库。和缓存穿透不一样,缓存穿透是高频率请求,缓存击穿是对热点数据进行高频率访问的时候,该缓存突然过期,导致所有的请求集中在一点进入了数据库。
解决方案:
- 设置热点数据永远不过期。
- 布隆过滤器。
- 接口限流与熔断,降级。
- 加互斥锁。
缓存雪崩
缓存雪崩是指在某个时间段内,缓存集中过期失效。
解决方案:
- 过期时间不要太集中,给范围随机。
- 热点数据永不过期。
六、集群模式
主从复制
分为一个 master 节点和多个 slave 节点,slave 节点从 master 同步数据。可实现读写分离,由 master 写,从 slave 读。
哨兵模式
哨兵模式是基于主从复制模式的,在此基础上多了一个哨兵的角色,哨兵可以监控 master 和 slave 的状态,在 master 出现问题时,能够从 slave 中选取一个节点作为新的 master 来保证系统正常工作。
原理:心跳机制加投票裁决。每个哨兵会定时向其它哨兵、master 和 slave 发送心跳,确保对方还活着,当多数哨兵报告某个 master 已经宕机之后,系统会投票从 slave 中选出新的 master。
Cluster 模式
其实是多个主从复制模式的的集合,每一个主从复制相互连接,当 A 的 master 挂掉之后,连接这个 master 的其它 master 节点将会去连接 A 的 slave 节点,从而保证正常工作。
七、Key 过期删除策略
- 惰性删除
当写入或读取到某个过期的 key 时,发现该 key 过期了,则删除。
- 定期删除
惰性过期无法删掉冷数据(长时间没有被读取,所以无法删除),此时要定期删除已经过期的 key。
- 主动删除
当内存超过设置的 maxMemory 时,则触发主动过期策略。
缓存淘汰算法有以下几种:
- volatile-lru:从已经设置过期时间的数据中选出最近最少使用的数据淘汰。
- volatile-ttl:从已经设置过期时间的数据中选出将要过期的数据淘汰。
- volatile-random:从已经设置过期时间的额数据中随机选出任意数据淘汰。
- allkeys-lru:从所有数据中选出最近最少使用的数据淘汰。
- allkeys-random:从所有数据中随机选出任意数据淘汰。
- no-enviction:禁止驱逐数据。
八、优化方案
- 如果一个对象有很多数据需要缓存,尽量将这个对象存储到一个 hash 中,而不是为每个属性都设置一个 key。
其它问题
- 为什么网络模块采用单线程?
因为 Cpu 不是 Redis 的瓶颈,影响 Redis 性能的是内存和网络带宽,所以没有上下文切换的单线程能很容易实现。
- 哨兵模式需要注意什么?
至少需要三个哨兵,须奇数个。
-
如何用 Redis 实现分布式锁?需要注意什么?
- 加锁的必须使用 setnx(setIfAbsent),即如果 key 不存在,则加锁成功,否则加锁失败。
- 要为 key 设置过期时间,避免由于网络问题或其它原因导致客户端没有成功释放锁导致其它客户端永远无法访问。
- 释放锁需要获取锁,然后判断该锁是不是当前客户端持有的锁,然后删除,三个动作必须是原子操作,所以要用 lua 脚本来写,脚本如下:
if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end
内容总结
以上是互联网集市为您收集整理的Redis总结全部内容,希望文章能够帮你解决Redis总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。