4.5 延迟考虑

    1. 尽可能使用批量操作:

    • mget、hmget而不是get和hget,对于set也是如此。
    • lpush向一个list一次性导入多个元素,而不用lset一个个添加
    • LRANGE 一次取出一个范围的元素,也不用LINDEX一个个取出

    2. 尽可能的把redis和APP SERVER部署在一个网段甚至一台机器。

    3. 对于数据量较大的集合,不要轻易进行删除操作,这样会阻塞服务器,一般采用重命名+批量删除的策略:

    集合:

    Hash:

    4. 尽可能使用不要超过1M大小的kv。

    5. 减少对大数据集的高时间复杂度的操作:根据复杂度计算,如下命令可以优化:

    6. 尽可能使用pipeline操作:一次性的发送命令比一个个发要减少网络延迟和单个处理开销。一个性能测试结果为(注意并不是pipeline越大效率越高,注意最后一个测试结果) :

    一个场景是一个购物车的设计,一般的设计思路是:

    在获取购物车内部货品时,不使用pipeline会很低效:
    延迟考虑 - 图3
    可以修改为:

    7. 如果出现频繁对string进行append操作,则请使用list进行push操作,取出时使用pop。这样避免string频繁分配内存导致的延时。

    8. 如果要sort的集合非常大的话排序就会消耗很长时间。由于redis单线程的,所以长时间的排序操作会阻塞其他client的 请求。解决办法是通过主从复制机制将数据复制到多个slave上。然后我们只在slave上做排序操作。把可能的对排序结果缓存。另外就是一个方案是就是采用sorted set对需要按某个顺序访问的集合建立索引。