redis 数据库支持的类型
1.string:键值对
应用场景:String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类
底层数据结构 为动态字符串 sds,分为三种,通过字符串的长度 int ,embstr,raw int 八bit enbstr 大于八小于等于44 raw 》44
二进制安全数据结构,有len free buf数组 扩容方便
2.list:队列
长住缓存信息
底层数据结构双向列表quicklist 在双向列表中 每一个节点包含一个压缩列表,节点中包含 上下指针,分配的压缩列表大小,为 压缩列表 前一个节点的偏移量,列表长度,为节点偏移量 具体数据,首节点偏移量,但是并没有指针只是通过 偏移量找到上一个节点
在处理缓存碎片的时候 可以将中间节点压缩
3.set:无序不能重复集合
在微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
底层数据结构为 整数数组,hashtable 但是只用key intmap中保存了编码,长度, 而且是有序的
4.hash:类似map 底层为dict hashtable
存储部分变更数据,如用户信息等
5.zset:有顺序,不能重复
edis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序
底层数据结构为 压缩列表+跳表 跳表的数据结构就是一个双向指针 但是这样查询会很慢,所以在上层通过幂次算法生成节点 查询的时候能够更快,查询速度logn
6.hyperloglog:统计基数
7.geo:地图镜像
8.pub/sub:消息订阅,消费
redis持久化方式
aof 持久化是以日志的方式记录服务器增删改操作,是通过追加的方式实现的,aof持久化有三种策略 每秒 每次 不记录 这样效率会有点影响,恢复数据的时候慢。
rdb 指定时间内将内存中的数据写入磁盘,优势是在数据备份方面是一个非常不错的选择,相对于aof来说 文件小,恢复数据比较快,也可以直接复制文件到其他服务器中使用,缺点是rdb方式是每隔一段时间备份一次,如果备份之前宕机 就会造成数据丢失,而且如果数据量大的时候会造成服务器超时
缓存雪崩:
redis缓存失效,本来大量请求通过redis缓存数据获取请求,但当缓存大量失效,请求就会发送到数据库中,如果没有熔断措施在,秒杀系统数据库很容易宕机,这样就会造成其他接口也无法访问
解决方法:
对缓存数据的缓存时间进行修改,随机缓存,或者根据具体的产品信息设置永不过期,更新缓存就好
异步刷新缓存,爽缓存
缓存穿透:
是redis与数据库中都没有对应的数据,一般是受到了攻击,有可能会造成数据库的奔溃
解决方法:
对请求的数据做校验,就是尽可能对我们想到的参数做校验,然后通过nginx对ip做限制,访问次数太多就加入黑名单,或者说永不过期。使用布隆过滤器
缓存击穿:
是对热点数据进行高并发访问,在缓存失效的瞬间高并发穿过redis直接访问数据库就容易造成缓存穿透,本体缓存+限流
解决方法:
设置热点数据不过期,加入互斥锁
布隆过滤器
通过布隆过滤器判断当前值是否存在,如果不存在直接返回
redis实现分布式锁
Redis的内存淘汰策略有哪些
noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
allkeys-lru:从所有key中使用LRU算法进行淘汰 volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
allkeys-random:从所有key中随机淘汰数据 volatile-random:从设置了过期时间的key中随机淘汰
volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰
LRU 单向列表实现,最近最少用,新数据插入的时候放在列表头,当有调用的时候把数据放在列表头,删除尾部的数据
LFU 双向列表+map实现
redis的集群方式
1.主从模式
一类主数据库,一类从数据库,新增修改主数据库数据的时候会更新到从数据库,异步发送。一个主库可以有多个从库,当主数据库发生异常的时候,需要手动将从库升级为主库
2.哨兵模式
哨兵模式就是检测主从数据库是否正常运行,发生故障自动将从数据库变为主数据库,
3.集群
redis把可以分布在多个机器上,一个主机对应一个从机,系统发生异常就会选举新的主机