博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis应用场景及常见问题
阅读量:7197 次
发布时间:2019-06-29

本文共 1344 字,大约阅读时间需要 4 分钟。

Redis是什么

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 , , , , 与范围查询, , 和 索引半径查询。 Redis 内置了 ,, , 和不同级别的 , 并通过 和自动 提供高可用性(high availability)。

使用目的

  1. 提高性能,加快系统响应时间
  2. 提高系统并发能力

常见使用场景

  • 高速缓存和数据存储介质

  • 生成订单号(发号器)

    1.INCRBY命令 订单号生成规则:订单业务前缀+商家id+自增序号

  • 限流(lua+redis+配置中心实现动态限流)

    local key = "limit_key:" .. KEYS[1]  ## 限流keylocal limit = tonumber(ARGV[1])      ## 单元时间内并发次数local expire_time = ARGV[2]          ## 过期时间local result = redis.call("EXISTS", key)if result == 1 then    if redis.call("INCR", key) > limit then        return 0    else        return 1    endelse    redis.call("SET", key, 1)    redis.call("EXPIRE", key, expire_time)    return 1end复制代码
  • 分布式锁 (目前业界比较好的开源方案Redission)

    1. 加锁过程 SET lock_name value NX PX 3000

      • lock_name:即锁名称,需具备唯一性
      • value: 用于唯一标识锁的持有者
      • NX 表示只有当 lock_name(key) 不存在的时候才能 SET 成功,从而保证只有一个客户端能获得锁,而其它客户端在锁被释放之前都无法获得锁
      • PX 30000 自动过期时间3S
    2. 解锁过程 if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end

      • 先查询(get)锁对应的 value,与自己加锁时设置的 value 进行对比,如果相同,则可确认这把锁是自己加的,然后再发起解锁(del),避免误删。
  • MQ消费端幂等(分布式锁的一种)

    ​ MQ消息体需带唯一的bizId,每次消费前,先去Redis获取该Key是否存在,存在即为重复消费,不存在,执行正常业务,并将bizId作为key放入redis,设置相应的过期时间

  • 消息队列(有兴趣自行去了解)

常见问题

  • 缓存穿透
    1. 缓存空值,设置短暂过期时间
    2. 布隆过滤器
  • 缓存雪崩
    1. 分散设置过期时间,避免集体过期
    2. 加锁访问数据库
  • hotKey
    1. 本地缓存方案
    2. 利用分片算法的特性,对key进行打散到每个集群节点
  • bigKey
    1. 对big key存储的数据进行拆分,拆分成多个key分开存储。例:ItemDTO对象 可以拆分商品基础数据和商品详情(图文详情等)单独的key存储

转载地址:http://fwakm.baihongyu.com/

你可能感兴趣的文章
setTimeout与setInterval区别
查看>>
安装配置rabbitmq
查看>>
linux服务器运维 -- 路线、架构
查看>>
Sqoop数据分析引擎安装与使用
查看>>
linux学习:tail命令--监控日志
查看>>
万能的top命令
查看>>
关于系统调用、库函数的理解
查看>>
sysctl -p 报"unknown key" 错误解决办法
查看>>
centos6下配置nfs
查看>>
保存图片
查看>>
使用TMG2010让多个web服务器共用一个公网地址
查看>>
与CIO的交友攻略(内附详解,圈内疯传)
查看>>
polysh批量执行shell命令
查看>>
如何使用GNS3和Cisco IOU搭建路由交换实验-IOU篇
查看>>
keepalived 多实例
查看>>
mysql部分参数注解
查看>>
***PHP Notice: Undefined index: ..问题的解决方法
查看>>
php模块安装
查看>>
Python3.2 --- Print函数用法
查看>>
Django 当中使用CSS之类的东西如何设置路径
查看>>