• 读书笔记之《Redis开发与运维》—— 二


    由于内容过多,分一个系列来写,这是第二篇。

    三、小功能大用处

    1、慢查询分析

        慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息记录下来。注意是命令执行前后,redis客户端执行一条命令分为四步:发送命令、命令排队、命令执行、返回结果。所以没有慢查询不代表客户端没有超时问题。

        redis提供了slowlog-log-slower-than和slowlog-max-len配置。slowlog-log-slower-than用于设置阀值,单位微秒,默认10毫秒,也就是超过10毫秒,判定为慢查询。slowlog-max-len表示慢查询最多存储多少条,redis使用了一个列表来存储慢查询日志。当超过最大数量时,对头的第一条数据出列。

    2、Redis Shell

    redis-cli、redis-server、redis-benchmark(可以为redis做基准性能测试)等shell工具。

    3、Pipeline

        redis提供了批量操作命令,但是大部分命令不支持批量操作。Pipeline机制能够将一组redis命令进行组装,通过一次往返时间传输给redis,再将这组redis命令的执行结果按照顺序返回给客户端。注意:每次Pipeline组装的命令个数不要过大,否则会加大客户端的等待时间,也会造成一定的网络阻塞,可以将包含大量命令的Pipline拆分成多次较小的Pipline来完成。

    4、事务与Lua

        redis提供了简单的事务功能以及集成Lua脚本来保证多条命令组合的原子性。将一组需要一起执行的命令放到multi和exec两个命令之间,multi代表事务开始,exec代表事务结束,他们之间的命令原子顺序执行。如果要停止事务的执行,可以使用discard代替exec。

    如果事务中的命令出现错误,如果是语法错误,会造成整个事务无法执行,如果是运行时错误,可能一部分运行成功,一部分失败。redis不支持回滚功能。如果在事务之前,需要确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行,可以使用watch命令。

    redis中执行Lua脚本有两种方式:eval和evalsha。如果Lua脚本较长,可以使用redis-cli --eval执行脚本文件。--eval本质和eval一样,客户端如果想要执行Lua脚本,首先在客户端编写好Lua脚本代码,然后把脚本作为字符串发送给服务端。使用evalsha时,首先将Lua脚本加载到Redis服务端,得到脚本的SHA1校验和,evalsha使用SHA1作为参数可以直接执行对应的Lua脚本,避免每次发送Lua脚本的开销。这样脚本常驻服务端,脚本功能得到了复用。

    script load命令将脚本内容加载到Redis内存中。

    Lua可以使用redis.call、redis.pcall函数实现对redis的访问。注意:如果redis.call执行失败,脚本执行结束会直接返回错误,而redis.pcall会忽略错误继续执行脚本。

    Lua脚本功能带来的好处:
    Lua脚本在Redis中是原子执行的,执行过程中不会插入其他命令。
    Lua脚本可以帮助开发人员创造出自己定制的命令,并可以将这些命令常驻Redis内存中,实现复用的效果。
    Lua脚本可以一次性打包多条命令,有效减少网络开销。

    script flush:清除redis内存已经加载的所有Lua脚本; script kill:杀掉正在执行的Lua脚本,如果当前Lua脚本正在执行写操作,那么script kill将
    不会生效。

    5、Bitmaps

    Bitmaps实际上是字符串,可以对字符串的位进行操作,可以把Bitmaps看成是一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

    6、HyperLogLog

    HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,比如统计ID、IP等。HyperLogLog占用内存非常小,但是需要注意存在错误率,有一定的误差。

    7、发布订阅

    和专业的消息队列系统比,redis的发布订阅略显粗糙,这里省略。

    8、GEO

    redis实现了GEO功能,用于实现基于地理位置信息的应用,底层实现是zset。

    五、客户端

    客户端与服务端之间的通信协议是在TCP协议之上构建的,Redis定制了RESP(Redis序列化协议)实现客户端和服务端的交互。

    1、Jedis

    直接和使用连接池两种。使用JedisPool不需要每次连接都生成Jedis对象,降低开销。 Jedis的Pipeline用法和Lua脚本用法。

    2、客户端API

    client list:列出与Redis服务端相连的所有客户端连接信息。
    info clients:列出与redis服务端相连的客户端总数,最大缓冲区等。

    输入缓冲区:Redis为每个客户端分配了输入缓冲区,将客户端发送的命令临时保存,同时Redis会从输入缓冲区拉取命令并执行。输入缓冲区会根据输入内容大小的不同动态调整,每个客户端缓冲区的大小不能超过1G,超过后客户端将被关闭。

    输出缓冲区:Redis为每个客户端分配了输出缓冲区,保存命令执行的结果返回给客户端,为redis和客户端交互返回结果提供缓冲。

    输入缓冲区和输出缓冲区不会受到maxmemory限制。

    monitor命令用于监控Redis正在执行的命令,注意:一旦redis的并发量较大,那么monitor客户端的输出缓冲会暴涨,可能瞬间占用大量内存。禁止生产环境使用monitor。

    长不大的童心
  • 相关阅读:
    KMeans算法分析以及实现
    决策树(ID3,C4.5,CART)原理以及实现
    [推荐系统读书笔记]利用用户标签数据
    [推荐系统读书笔记]推荐系统冷启动问题
    [推荐系统]利用用户行为数据
    [推荐系统读书笔记]好的推荐系统
    Docker Hub国内镜像加速
    ubuntu下cannot connect to X server :1
    vscode编写C++设置左花括号不换行
    SLAM十四讲中Sophus库安装
  • 原文地址:https://www.cnblogs.com/yaofengdoit/p/12993698.html
Copyright © 2020-2023  润新知