zoukankan      html  css  js  c++  java
  • Redis大Key优化

    业务场景:

    即通过hash的方式来存储每一天用户订单次数。那么key = order_20200102, field = order_id, value = 10。那么如果一天有百万千万甚至上亿订单的时候,key后面的值是很多,存储空间也很大,造成所谓的大key。

    大key的风险:
    1.读写大key会导致超时严重,甚至阻塞服务。

    2.如果删除大key,DEL命令可能阻塞Redis进程数十秒,使得其他请求阻塞,对应用程序和Redis集群可用性造成严重的影响。

    redis使用会出现大key的场景:

    1.单个简单key的存储的value过大;

    2.hash、set、zset、list中存储过多的元素。

    解决问题:

    1.单个简单key的存储的value过大的解决方案:

    将大key拆分成对个key-value,使用multiGet方法获得值,这样的拆分主要是为了减少单台操作的压力,而是将压力平摊到集群各个实例中,降低单台机器的IO操作。

    2.hash、set、zset、list中存储过多的元素的解决方案:

    1).类似于第一种场景,使用第一种方案拆分;

    2).以hash为例,将原先的hget、hset方法改成(加入固定一个hash桶的数量为10000),先计算field的hash值模取10000,确定该field在哪一个key上。

    将大key进行分割,为了均匀分割,可以对field进行hash并通过质数N取余,将余数加到key上面,我们取质数N为997。

    那么新的key则可以设置为:

    newKey = order_20200102_String.valueOf( Math.abs(order_id.hashcode() % 997) )

    field = order_id

    value = 10

    hset (newKey, field, value) ;  

    hget(newKey, field)

  • 相关阅读:
    使用AsyncTask简单的文件遍历
    如何创建黑名单
    关于PopupMenu的用法
    联系人的搜索和添加
    php获取真实IP地址
    socket.io获取客户端的IP地址(修正官方1.0.4版本BUG)
    ubuntu下安装bind9
    install source nginx 1.6.0
    在Ubuntu下的samba实现
    买了新硬盘,给ESXI的虚拟机挂进真实硬盘。
  • 原文地址:https://www.cnblogs.com/lq-93/p/13620483.html
Copyright © 2011-2022 走看看