您的位置:首页 > 理论基础 > 数据结构算法

Redis之常见数据结构、持久化以及并发业务场景的理解

2020-07-14 04:25 344 查看

简述Redis数据结构
Redis总共有五种常见数据结构,三种特殊数据结构(这里不解释)

                                      
常用数据结构:
    STRING:
    它是由整数值和SDS(简单动态字符串)实现的对象
    应用场景:
        1.可以用作缓存
        2.可以用作计数器
        3.可以用作共享用户session

     HASH:它是由压缩列表和字典实现的哈希对象
     应用场景:
        1.可以用作关系型数据库存储,用于存储用户相关信息
        
     LIST:它是由压缩列表和双端链表来实现的列表对象
     应用场景:
         1.可以用作消息队列,实现阻塞队列,通过命令左进右出
         2.可以用作数据分页,比如博客上用户的文章列表

     SET:它是由整数集合和字典来实现的集合对象
     应用场景:
          1.标签
          2.共同好友
          3.独立ip

     ZSET:它是由压缩列表、字典、跳跃表来实现的有序集合对象
     应用场景:
         1.排行榜,可以按照某一字段进行排序
         2.计算权重,设置权重值,让线程按照权重规则进行执行


简述Redis的持久化机制RDB和AOF

两者都是redis的持久化机制

RDB是快照级别的持久化,通过save命令和bgsave命令以二进制流文件的形式进行持久化。执行save命令时Redis服务器进程会发生阻塞,在RDB文件生成完毕之前,Redis服务器是不能执行其他命令请求操作的,而执行bgsave命令时,Redis服务器则会Fork一个子进程来执行RDB文件的生成工作,就相当于后台运行一般,此时Redis服务器是非阻塞状态的,它可以执行其他命令请求的操作,需要注意的时Redis中是不允许主进程和子进程同时执行save或bgsave命令的,为了防止主进程和子进程产生竞争关系。


AOF是日志级别的持久化,它将操作数据库的命令追加到aof文件的末尾,如果发生宕机,则会通过加载aof文件中的命令并重新执行来达到数据库状态恢复的目的,它提供了三种间隔存储方式,一种是一次命令的操作写入一次,第二种是每隔一秒写入一次,第三种是将写入间隔处理交给系统管理,AOF中默认用的是每隔一秒写入一次。

redis的配置文件中默认开启RDB,关闭AOF,在Redis的配置文件中默认的save命令执行的方式有三种

                save     900      1---------------900S内,对数据库至少进行了1次修改
                save     300     10--------------300S内,对数据库至少进行了10次修改
                save      60    10000------------60S内,对数据库至少进行了10000次修改

 


Redis高并发中可能产生的业务场景之击穿、穿透、雪崩以及解决方案

击穿:

如果某一热点key(比如微博热搜)每秒内有10000次请求,访问非常频繁,处于高并发的状态,假设这个key的有效是时间突然失效,那么这一瞬间,每秒10000次的请求就会直接打在数据库上,很显然数据库是承受不了这样的高频访问的,这样就会将数据库打死

解决:

将热点数据设置成永久不过期,或者实现互斥锁,加锁——>等待缓存机器将第一次访问的数据进行缓存——>释放锁,如此之后的同数据高并发访问就可以直接去缓存中取出数据进行返回。

穿透:

假设每一秒内有10000个请求,其中有8000个请求是由攻击者发来的,在缓存和数据库中都找不到这样的id(可以假设此id为负数),在这种情况下也会将数据库打死

解决:

只要将第一次在缓存和数据库中都找不到的key,设置对应的value为null并写入缓存中,如此,即使之后还有7999个请求,也能将null直接返回,而不是每次都需要来数据库中进行查找

雪崩:

如果每一秒内有10000个请求,而缓存机器每秒最大可以扛住8000个请求,这样显然是不会出现问题,但是如果缓存机器突然宕机,那么这8000个请求就会直接追加,打在数据库上,数据库必然扛不住,理论上它会先报警,然后挂掉,实际中直接挂掉可能性会比较大

解决:

事前:redis 高可用,读写分离、主从复制+哨兵模式,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据

Redis事务
开启事务
multi
执行命令队列中的命令
exec
关闭事务
discard
监视加锁 watch key
取消监视 unwatch

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: