一、Redis特性
1.速度快
正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能
- Redis 的所有数据都是存放在内存中的
- Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 “距离” 操作系统更近,执⾏速度相对会更快
- Redis 使⽤了单线程,预防了多线程可能产⽣的竞争问题。
2.基于键值对的数据结构服务器
Redis 的全程是 REmote Dictionary Server,它主要提供了 5 种数据结
构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /zet),同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 ”数据结构“
3.持久化(Persistence)
Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中
4.主从复制(Replication)
Redis 提供了复制功能,实现了多个相同数据的 Redis 副本(Replica)
5.⾼可⽤(High Availability)和分布式(Distributed)
Redis 提供了⾼可⽤实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故障⾃动转移。也提供了 Redis 集群(Redis Cluster),是真正的分布式实现,提供了⾼可⽤、读写和容量的扩展性。
二、Redis使用场景
1.缓存(Cache)
缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能够有效地降低后端数据源的压⼒。Redis 提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和内存溢出后的淘汰策略。
2.排行榜系统
排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照各种复杂维度计算出的排⾏榜,Redis 提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很⽅便地构建各种排⾏榜系统。
3.计数器应用
计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的实时性,每⼀次播放和浏览都要做加 1 的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑战。Redis 天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。
4.社交网络
赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis 提供的数据结构可以相对⽐较容易地实现这些功能。
5.消息队列系统
消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队⽐还不够⾜够强⼤,但是对于⼀般的消息队列功能基本可以满⾜
三、缓存场景场景问题
1.缓存穿透
结局方案一: 缓存空数据
缓存空数据,查询返回的数据为空,扔把这个空结果进行缓存
reids-- {key:“张三”,value:null}
优点: 简单
缺点: 消耗内存
可能发生不一致的问题–》(刚开始为null,后面有了数据但是缓存没有更新)
解决方案二: 布隆过滤器
位图
所谓位图,就是用每一位来存放某种状态,适用于海量数据,整数,数据无重复的场景。通常是用来判断某个数据存不存在的。
布隆过滤器概念
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间
2.缓存击穿
给某一个key设置了过期时间,当key过期时,恰好这个时间点对这个key有大量的并发请求过来,这些请求可能会瞬间将DB压垮
解决方案:
一:添加互斥锁:保证数据的强一致,但是性能较差
二:逻辑过期:保证服务器的高可用,性能比较高,但是不能保证数据的绝对一致
结局方案一:互斥锁
特点: 强一致 性能差
解决方案二:逻辑过期
此时线程1和线程3返回的都是过期数据,这就是保证了服务器的高可用的弊端的,不能保证数据一致性
3.缓存雪崩
在同一时间段内大量的缓存key失效或者redis服务宕机,导致大量的数据请求到到数据库,带来巨大压力
解决方案