• 面试-Redis常见场景


    1.从海量的数据里查询某一固定前缀的key
    (1)keys pattern指令:
    在这里插入图片描述
    摸清数据规模(很重要)
    (2)cursor:游标
    Scan cursor [MATCH pattern] [COUNT count]
    可以无阻塞的提取出指定模式的key列表
    基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。
    以0作为游标开始一次新的迭代,直到命令返回游标为0完成一次遍历
    不保证每次执行都需要返回某个给定数量的元素,支持模糊查询
    一次返回数量不可控,只能是大概率符合count参数

    2.如何通过redis实现分布式锁
    分布式锁:是控制分布式系统或不同系统之间共同访问共享资源的一种锁的实现。
    分布式锁需要解决的问题:
    互斥性;安全性;死锁;容错;
    在这里插入图片描述
    原子性操作。用来实现分布式锁。在执行某段代码逻辑时,先使用SETNX对某个key设值,设置成功表示没有别的线程在执行该段代码。反之,就有别的线程正在占用该段资源。

    如何解决SETNX长期有效的问题?
    expire key seconds
    设置key的生存时间,当key过期时(生存时间为0),会自动删除

    优化:从Redis 2. 6.12开始可以将SETNX和expire结合。
    在这里插入图片描述
    3.如何实现异步队列:
    在这里插入图片描述
    使用list作为队列,RPUSH生产消息,LPOP消费消息。
    缺点:没有等待队列里有值就直接消费
    弥补:可以通过在应用层引入Sleep机制去调用LPOP重试。

    在这里插入图片描述
    BlPOP能代替sleep做更精准的阻塞控制。

    在这里插入图片描述
    在这里插入图片描述
    缺点:消息的发布是无状态的,无法保证可达。
    对于发布者来说消息是即发即失的。若消费者在生产者发布消息时下线,重新上线时是接收不到该消息的。要解决这个问题,就要使用专业的消息队列。如Kafka,rabbitMQ

  • 相关阅读:
    SQL刷题查漏补缺7
    Material Design之CoordinatorLayout 与AppbarLayout与CollapsingToolbarLayout
    18.在springboot中的RedisTemplate序列化,json序列化
    java线程调度
    php一维数组合并
    vivo鲁班RocketMQ平台的消息灰度方案
    3.获取元素
    深度清洁:使用npm prune命令优化你的Node.js项目
    finally执行语句的注意和小陷阱
    Python:使用docxtpl实现模板生成docx文件
  • 原文地址:https://blog.csdn.net/TOMORROW6COME/article/details/139824557