• redis学习二


    附加功能和Redis客户端



    慢查询

    所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。

    典型的数据库有MySQL

    但是redis一条命令执行的过程可以细分为四步

    1 发送命令 2 命令排队 3 命令执行 4 返回结果

    而慢查询只记录了第三步命令执行的结果,所以没有慢查询不代表客户端没有请求超时,或者网络传输问题导致超时。

    慢查询要明确两件事:

    慢查询的预设阈值设置,慢查询输出结果地方?

    Redis提供了slowlog-log-slower-thanslowlog-max-len配置来解决这两个问题。

    从字面意思就可以看出,slowlog-log-slower-than就是那个预设阀值,它的单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000。

    slowlog-log-slower-than=0会记录所有的命令,slowlog-log-slower-than<0对于任何命令都不会进行记录

    从字面意思看,slowlog-max-len只是说明了慢查询日志最多存储多少条,并没有说明存放在哪里?实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如slowlog-max-len设置为5,当有第6条慢查询插入的话,那么队头的第一条数据就出列,第6条慢查询就会入列。


    如何修改配置呢?

    第一种方式就是直接修改配置文件。

    第二种方式是使用config set命令,config set slowlog-log-slower-then 20000这种形式设置,最后还有添加config rewrite 命令持久化到配置文件。


    慢查询日记存在内存列表里面,redis提高了命令访问和管理。

    slowlog get [n] 返回的查询有四个参数,分别是命令id,发生时间戳,命令耗时,命令形式

    slowlog len 返回多少列表条数

    slowlog reset


    最佳实践:

    ·slowlog-max-len选定1000以上为合适值

    ·slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值,对于高OPS流量场景的Redis建议设置为1毫秒



    redis shell

    redis提供了三个工具

    redis-cli redis-server redis-benchmark

    redis-cli -r 3 ping

    redis-cli连接客户端

    redis-cli 命令
    redis-cli-help -h -p 帮助,ip,端口
    -r repeat 命令的重复次数
    -i interval(second) 命令执行的间隔
    -x stdin 从标准输入给redis
    -c cluster 可以防止moved和ask异常
    -a auth
    --scan --pattern scan key 浏览键
    --slave 自己模拟是自己的副本,可以看到自己的更新操作 当前客户端模拟当前redis节点的从节点
    --rdb 持久化,在本地生产rdb文件
    --pipe
    --eval 执行lua脚本
    --latency,--latency-history,--lantency-dist 检测网络延迟,对运维十分帮助
    --stat
    --raw --no-raw 返回命令的结果,二进制形式

    如果需要验证密码,那么

    redis-cli -a 201709 其中-a这个命令需要在最前面


    #### redis-server启动服务端

    test-memory可以用来检测当前操作系统能否稳定地分配指定容量的内存给Redis,通过这种检测可以有效避免因为内存问题造成Redis崩溃,例如下面操作检测当前操作系统能否提供1G的内存给Redis.

    redis-server --test-momery 1024

    该功能更偏向于调试和测试,只是做了简单的测试

    maxmemory选项可以设置redis占用的最大内存数量

    redis-benchmark 基准测试

    提供了很多选项帮助开发和运维人员测试Redis的相关性能

    -c 客户端并发数量,默认50
    -n< requests> 客户端请求总数
    -q -r -P
    --csv 输出到excel
    -k< boolean> 客户端是否使用keekalive
    -t 对指定命令测试


    Pipeline

    利用管道技术,将redis命令组合成为一条命令,通过一次网络传输,把命令全部发送到服务端,--pipe命令,就是将redis命令组装,一次发送,节省了RTT时间。

    注意:原生批量命令是原子的,而Pipeline不是原子的

    原生批量命令是一个命令对应多个key,Pipeline支持多个命令

    原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。

    pipeline的用处是,原生的批量命令不是每个命令都有批量操作,而pipeline可以将不同的命令直接组装起来,但是值得注意,如果组装的命令过多,那么也可能造成网络阻塞。



    Lua

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

    缺省



    BitMaps

    Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。

    可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

    setbit key offset value

    gitbit key offset

    bitcount [start][end]

    bitop op destkey key[key...]

    bitpos key targetbit [start][end] 计算key中第一个出现target的偏移量



    HyperLogLog

    HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。HyperLogLog提供了3个命令:
    pfadd、pfcount、pfmerge。

    pfadd key element[element]

    pfcount key [key]

    pfmerge destkey sourcekey[sourcekey] 并集并赋值给destkey

    127.0.0.1:6379> pfadd pf "uid1" "uid2" "uid4" "uid7" "uid7" "uid2"
    (integer) 1
    127.0.0.1:6379> pfcount pf  //不重复的个数是4
    (integer) 4
    127.0.0.1:6379> pfadd af "uid1" "uid6" "uid10" "uid5"
    (integer) 1
    127.0.0.1:6379> pfmerge bc af pf  //af与pf的并集赋予bc
    OK
    127.0.0.1:6379> pfcount bc
    (integer) 7
    

    HyperLogLog必然不是100%的正确,其中一定存在误差率。Redis官方给出的数字是0.81%的失误率。



    GEO

    Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。

    geoadd key longitude latitude member [longitude latitude member ...]

    longitude、latitude、member分别是该地理位置的经度、纬度、成员

    geopos key member [member ...]

    获取城市的地理位置

    geodist key member1 member2 [unit]

    计算城市之间的距离

    GEO的底层实现是zset



    客户端

    客户端通信协议


    一,客户端与服务端之间的通信协议是在TCP协议之上构建的。

    第二,Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易被人类识别。

    比如命令 set name lin

    被RESP解析成为*3 $3 set $4 name $3 lin

    格式是 参数个数 第一个参数的字符串个数 第一个参数的字符串 ....

    Redis的返回结果类型分为以下五种:
    ·状态回复:在RESP中第一个字节为"+"。
    ·错误回复:在RESP中第一个字节为"-"。
    ·整数回复:在RESP中第一个字节为":"。
    ·字符串回复:在RESP中第一个字节为"$"。
    ·多条字符串回复:在RESP中第一个字节为"*"。

    java高级语言的redis客户端是Jedis

    使用要点:用连接池连接;会用Pipeline;lua脚本支持。



    客户端管理


    clien list

    client list命令能列出与Redis服务端相连的所有客户端连接信息。


    监控输入缓冲区异常的方法有两种:
    1. 通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端
    2. 通过info命令的info clients模块,找到最大的输入缓冲区

    输出缓冲区:obl、oll、omem


    其他的命令

    client setName

    client getName

    client kill

    client pause

    monitor #用于监控Redis正在执行的命令,高并发下不用


    客户端相关配置

    timeout:检测客户端空闲连接的超时时间,一旦idle时间达到了timeout,客户端将会被关闭,如果设置为0就不进行检测。

    maxclients:客户端最大连接数

    tcp-keepalive:检测TCP连接活性的周期,默认值为0,也就是不进行检测,如果需要设置,建议为60

    tcp-backlog:TCP三次握手后,会将接受的连接放入队列中,tcp-backlog就是队列的大小,它在Redis中的默认值是511。通常来讲这个参数不需要调整。

    客户端统计片段,可以排查redis异常发生的原因

    info clients

    info stats

  • 相关阅读:
    python函数续
    模拟数据库查询操作
    文件处理
    字符编码
    python函数
    ACM-ICPC 2018 南京赛区网络预赛Skr
    bzoj3676: [Apio2014]回文串 pam
    Wannafly挑战赛23B游戏
    bzoj4804: 欧拉心算 欧拉筛
    bzoj3884: 上帝与集合的正确用法 扩展欧拉定理
  • 原文地址:https://www.cnblogs.com/lin7155/p/14356519.html
Copyright © 2020-2023  润新知