string,list,set,hash,zset(sorted set)
底层数据结构是动态字符串,capacity为字符串所占的内存空间,如果字符串长度小于1M时,每次扩容都是加倍现有空间,即扩容后空间为现在的2倍,如果超过1M,每次扩容1M,最大长度为512M,冗余空间避免频繁的内存分配
底层数据结构为双向链表,数据量较少时使用ziplist存储,数据量较多时将多个ziplist使用链表的方式连接起来
底层数据结构为哈希表
底层数据结构为哈希表,适合用来存储对象
集合中的每个元素都分配了一个score,用来进行排序,成员不可重复,score可重复
底层结构分为两部分:
1.hash,关联每个元素和score,保障元素key的唯一性,可以通过元素key找到相应的score
2.跳跃表,类似树形结构,能够通过score快速找到对应元素
bitmap擅长处理位运算,本身数据结构是String
HyperLogLog擅长基数统计
geo擅长处理经纬度
特性:fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。
redis默认的持久化策略,恢复速度快,擅长处理大数据集的持久化,可能丢失数据,适合对数据不是特别敏感的业务场景
手动save触发,阻塞持久化,持久化过程中redis不处理任何请求,不建议使用
bgsave异步持久化
自动持久化,可在redis.conf中配置如300 秒内至少有 10 个 key 的值变化,则持久化
与AOF一起使用时,恢复数据从AOF中读取
特性:把写操作指令,持续的写到一个类似日志文件里。(类似于从postgresql等数据库导出sql一样,只记录写操作)
异常恢复,aof文件损坏,可以通过redis-check-aof --fix 文件名修复aof文件内容
同步频率设置:
appendfsync always每次写入都做同步追加操作 appendfsync everysec每秒进行同步 appendfsync no不会主动进行同步,由操作系统决定什么时候进行同步
rewrite重写压缩,只关心最终的数据状态
服务器在AOF功能开启的情况下,会维持以下三个变量:
记录当前AOF文件大小的变量aof_current_size。 记录最后一次AOF重写之后,AOF文件大小的变量aof_rewrite_base_size。 增长百分比变量aof_rewrite_perc。
每次当serverCron(服务器周期性操作函数)函数执行时,它会检查以下条件是否全部满足,如果全部满足的话,就触发自动的AOF重写操作:
没有BGSAVE命令(RDB持久化)/AOF持久化在执行; 没有BGREWRITEAOF在进行; 当前AOF文件大小要大于server.aof_rewrite_min_size(默认为64MB),或者在redis.conf配置了auto-aof-rewrite-min-size大小; 当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比(在配置文件设置了auto-aof-rewrite-percentage参数,不设置默认为100%)
如果前面三个条件都满足,并且当前AOF文件大小比最后一次AOF重写时的大小要大于指定的百分比,那么触发自动AOF重写。
info replication:查看redis数据库信息
启动从redis服务后,在从服务redis执行slaveof ip 端口(主服务器ip端口)
从服务器挂掉后,重启会恢复成独立的master,需要重新slaveof,重新成为从服务器后会完整从主服务器拷贝完整数据
主服务器挂掉之后,从服务器不做任何事情,主服务器重启后仍然是主服务器
1.从服务器连接上主服务器之后,从服务器向主服务器发送sync命令(从服务器主动)
2.主服务器接到sync命令后,把主服务器中的数据进行持久化,rdb文件,把rdb文件发给从服务器,从服务器拿到rdb文件读取
3.每次主服务器进行写操作后,和从服务器进行数据同步(主服务器主动)
可以使用slaveof在从服务器下再挂从服务器,主服务器同步数据时只负责自己的从服务器,由从服务器去同步到更下层的从服务器,薪火相传模式下仍然遵循主服务器挂调仍然是主服务器,从服务器挂掉需要重新slaveof
主服务器挂掉后,在从服务器执行命令
slaveof no one
在redis目录下创建centinel.conf文件
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。 sentinel monitor mymaster 192.168.11.128 6379 2
使用redis-sentinel启动哨兵进程
# 启动哨兵进程 ./redis-sentinel ./sentinel.conf
哨兵进程监控到master down掉以后,会选择一个从机作为master
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。 在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
1.空值缓存,如对id为"-1"的值做短期缓存,防止攻击用户反复用同一个id暴力攻击 2.访问ip黑白名单
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
1.调整热点数据过期时间。 2、接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些 服务 不可用时候,进行熔断,失败快速返回机制。 3、布隆过滤器。bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。布隆过滤器的关键就在于hash算法和容器大小。 4.加锁
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 2.调整热点数据过期时间。