Redis---幕布转存

Redis

琐碎:

  • Redis 支持数据持久化,可将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用

  • 支持的类型,string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set:有序集合)

  • 支持事务,操作都是原子性

  • 可用于缓存消息,按key设置过期时间,过期后自动删除

  • 内存用完,没有淘汰策略写命令会返回错误信息,读命令正常使用

  • Redis是单进程单线程的,利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

  • 一个字符串类型的值最大容量是512M

  • 放到内存的好处 : 达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘,若设置了最大使用内存,达到上限后不能继续插入新值

  • 持久化机制

    • RDB (Redis DataBase)

      • 用数据集快照的方式持久化模式,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复

      • 优点

        • (1) 只有一个文件 dump.rdb,方便持久化。

        • (2) 容灾性好,一个文件可以保存到安全的磁盘。

        • (3) 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操 作,保证了 redis 的高性能)

        • (4) 相对于数据集大时,比 AOF 的启动效率更高。

      • 缺点:

        • 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
    • AOF (Append-only file)

      • 所有的命令记录以redis命令请求协议的格式完全持久化存储,保存为aof文件

      • 优点:

        • (1) 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。

        • (2) 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

        • (3) AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

      • 缺点:

        • (1) AOF 文件比 RDB 文件大,且恢复速度慢。

        • (2) 数据集大的时候,比 rdb 启动效率低。

  • Redis常见性能问题和解决方案

    • Master最好不要用内存快照,save命令调度rdbSave函数会阻塞主线程工作,当快照较大时对性能影响大,会间断性暂停服务

    • 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

    • 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网

    • 尽量避免在压力很大的主库增加从库

    • 主从复制不要用图状结构,用单向链表结构更为稳定,

  • ridis的删除策略

    • 定时删除:在设置键的过期时间的同时,创建一个定时器timer,让定时器在键的过期时间来临时立即执行对键的删除操作

    • 惰性删除:放任键过期不管,每次从键空间中获取键时,都检查取的键是否过期,如果过期,就删除该键,没有过期就返回

    • 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键,–>算法决定

  • Redis的回收策略(淘汰策略)

    • 什么时候触发:

      • 添加了新的数据,Redis检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收
    • 淘汰策略

      • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

      • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

      • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

      • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

      • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

      • no-enviction(驱逐):禁止驱逐数据

    • 定义:

      • volatile 和allkeys规定数据从已设置过期时间的数据集还是从全部数据集淘汰,后面的是三种不同的淘汰策略
    • 使用:

      • 若只有一部分数据访问频率高,则用allkeys-lru

      • 如果数据呈现平等分布,使用allkeys-random

  • Redis同步机制

    • 可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接收完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
  • 查找数据,1亿个key,其中10wkey是以固定的已知前缀开头

    • 使用keys指令可以扫出指定模式的key列表,但由于redis是单线程的,会导致线程阻塞一段时间,可以使用scan指令无阻塞取,但会有一定概率重复,整体花费时间较keys长
  • Redis异步消息队列

    • 一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当lpop 没有消息的时候,要适当 sleep 一会再重试。如果对方追问可不可以不用 sleep 呢?list 还有个指令叫 blpop,在没有消息的时候,它会阻塞住直到消息到来。如果对方追问能不能生产一次消费多次呢?使用 pub/sub 主题订阅者模式,可以实现 1:N 的消息队列。如果对方追问 pub/sub 有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RabbitMQ 等。如果对方追问 redis 如何实现延时队列?我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用 sortedset,拿时间戳作为 score,消息内容作为 key 调用 zadd 来生产消息,消费者用zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。到这里,面试官暗地里已经对你竖起了大拇指。
  • Redis分布式锁

    • 先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行expire 之前进程意外 crash 或者要重启维护了,那会怎么样?这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得 set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和expire 合成一条指令来用的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值