redis开发与运维笔记(2)

本文深入探讨Redis的键管理、数据库管理、慢查询日志、测试工具、管道(Pipeline)、事务与Lua脚本、发布订阅等功能。解析dump、restore、migrate命令用于键迁移,scan及其变种命令用于键遍历,以及select、flushdb/flushall的数据库管理。介绍慢查询日志的配置与使用,Redis-cli、redis-server、redis-benchmark的测试技巧,Pipeline和Lua脚本的高效运用,以及发布订阅机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、键管理

(1)键迁移

  • dump+restore可以实现在不同的Redis实例之间进行数据迁移的功能, 整个迁移的过程分为两步:
    1) 在源Redis上, dump命令会将键值序列化, 格式采用的是RDB格式
    2) 在目标Redis上, restore命令将上面序列化的值进行复原, 其中ttl参数代表过期时间, 如果ttl=0代表没有过期时间。 
    第一, 整个迁移过程并非原子性的,而是通过客户端分步完成的。 第二, 迁移过程是开启了两个客户端连接, 所以dump的结果不是在源Redis和目标Redis之间进行传输

  • migrate命令也是用于在Redis实例间进行数据迁移的, 实际上migrate命令就是将dump、 restore、 del三个命令进行组合, 从而简化了操作流程。
    migrate命令具有原子性, 而且从Redis3.0.6版本以后已经支持迁移多个键的功能, 有效地提高了迁移效率, migrate在10.4节水平扩容中起到重要作用。
    第一, 整个过程是原子执行的, 不需要在多个Redis实例上开启客户端的, 只需要在源Redis上执行migrate命令即可。 
    第二, migrate命令的数据传输直接在源Redis和目标Redis上完成的。 
    第三, 目标Redis完成restore后会发送OK给源Redis, 源Redis接收后会根据migrate对应的选项来决定是否在源Redis上删除对应的键。
    migrate host port key|"" destination-db timeout [copy] [replace] keys key1 key2 key3
    key|""。要迁移的键,多个键此处为""。
    keys key1 key2 key3。迁移多个键

(2)键遍历

  • 全量遍历键。keys pattern。支持pattern匹配。如果非要使用,在一个不对外提供服务的Redis从节点上执行, 这样不会阻塞到客户端的请求, 但是会影响到主从复制
  • 渐进式遍历。每次执行scan, 可以想象成只扫描一个字典中的一部分键, 直到将字典中的所有键遍历完毕
    scan cursor [match pattern] [count number]
    ·cursor是必需参数, 实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。
    ·match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像。
    ·count number是可选参数,它的作用是表明每次要遍历的键个数,默认值是10,此参数可以适当增大
    除了scan以外,Redis提供了面向哈希类型、集合类型、有序集合的扫描遍历命令,解决诸如hgetall、 smembers、 zrange可能产生的阻塞问题,对应的命令分别是hscan、 sscan、 zscan,它们的用法和scan基本类似
    渐进式遍历可以有效的解决keys命令可能产生的阻塞问题,但是scan并非完美无瑕,如果在scan的过程中如果有键的变化(增加、 删除、 修改),scan并不能保证完整的遍历出来所有的键

(3)数据库管理

  • 切换数据库。select db。各个数据库之间没有联系,可以存在相同的键。redis是单线程的,多个数据库使用同一个cpu,彼此至今还是会受影响。
  • 清除数据库。flushdb/flushall。如果当前数据库键值数量比较多,flushdb/flushall存在阻塞Redis的可能性

2、小功能,大用处

(1)慢查询只是统计的命令执行的时间,不包括客户端发送命令、命令排队、返回结果的时间。

  • slowlog-log-slower-than预设阀值,它的单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000。slowlog-log-slower-than=0会记录所有的命令,slowlog-log-slowerthan<0对于任何命令都不会进行记录。
  • 实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度
  • 在Redis中有两种修改配置的方法, 一种是修改配置文件, 另一种是使用config set命令动态修改。如果要Redis将配置持久化到本地配置文件,需要执行config rewrite命令
  • 获取慢查询日志。slowlog get [n] ,n可以指定条数。每个慢查询日志有4个属性组成, 分别是慢查询日志的标识id、 发生时间戳、 命令耗时、 执行命令和参数 
  • 获取慢查询日志当前的列表长度,slowlog len。
  • 慢查询日志列表清空。slowlog reset。

(2)最佳实践

  • slowlog-max-len配置建议: 线上建议调大慢查询列表, 记录慢查询时Redis会对长命令做截断操作, 并不会占用大量内存。 增大慢查询列表可以减缓慢查询被剔除的可能, 例如线上可设置为1000以上
  • slowlog-log-slower-than配置建议: 默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值。 由于Redis采用单线程响应命令, 对于高流量的场景, 如果命令执行时间在1毫秒以上, 那么Redis最多可支撑OPS不到1000。 因此对于高OPS场景的Redis建议设置为1毫秒。 
  • 慢查询只记录命令执行时间, 并不包括命令排队和网络传输时间。 因此客户端执行命令的时间会大于命令实际执行时间。 
  • 定期执行slow get命令将慢查询日志持久化到其他存储中(例如MySQL) , 然后可以制作可视化界面进行查询

3、redis shell 测试

(1)Redis-cli

  • -h 服务端ip
  • -p 端口
  • -r (repeat)将命令执行多次。redis-cli -r 3 ping 
  • -i (interval)每个几秒执行几次。redis-cli -r 5 -i 1 ping 
  • -a (auth)密码
  • --slave。将当前客户端模拟成服务端的从节点。
  • --rdb。生成RDB持久化文件,保存到本地。可用来做持久化文件的定期备份
  • --eval。执行lua脚本
  • --latency。测试客户端到目标redis服务的网络延迟;--latency-history,每隔多久输出一次网络延迟;--latency-dist,使用统计图表的形式从控制台输出延迟统计信息
  • --stat。实时获取redis的重要统计信息。key的数量、内存占用量、客户端数量、请求数量、连接数量

(2)redis-server

  • redis-server --test-memory 1024。检测当前操作系统能否稳定地分配指定容量的内存给Redis。整个内存检测的时间比较长。该功能更偏向于调试和测试

(3)redis-benchmark。可以为Redis进行基准性能测试

  • -c。代表客户端的并发数量(默认是50) 
  • -n(num) 。代表客户端请求总量(默认是100000) 。redis-benchmark-c100-n20000代表100各个客户端同时请求Redis, 一共执行20000次 
  • -r(random) 选项, 可以向Redis插入更多随机的键
  • --csv选项会将结果按照csv格式输出, 便于后续处理, 如导出到Excel等

4、redis Pipline

(1)原生批量命令和Pipeline对比。

  • 原生批量命令是原子的,Pipeline是非原子的。
  • 原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
  • 原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。

(2)最佳实践

  • 一次组装Pipeline数据量过大, 一方面会增加客户端的等待时间, 另一方面会造成一定的网络阻塞, 可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成
  • Pipeline只能操作一个Redis实例

5、redis 事务与Lua

(1)事务

  • 简单事务功能,multi和exec命令之间的命令,能够原子顺序执行。如果事务之中存在命令拼写错误,整个事务不会执行;如果存在运行时错误,事务并不会回滚
  • watch命令,是事务执行之前,确保事务中的key没有被其他客户端修改过,修改过的话就不执行事务。类似于乐观锁
  • Redis的事务比较简单,无法保证事务回滚,无法实现事务内命令之间的逻辑运算

(2)lua用法简述。由c语言实现,许多应用选用它作为脚本语言。尤其在游戏领域

(3)Redis中使用lua

  • eval 执行lua脚本。eval 脚本内容 key个数 key列表 参数列表。对应 jedis.eval
  • evalsha 执行lua脚本。

    script load命令可以将脚本内容加载到Redis内存中,返回SHA1。对应jedis.scriptLoad
    evalsha 脚本SHA1值 key个数 key列表 参数列表

  • lua 的Redis API。

    使用redis.call函数实现对Redis的访问。例如:redis.call("set", "hello", "world");redis.call("get", "hello")
    还可以使用redis.pcall函数实现对Redis的调用,如果redis.call执行失败,那么脚本执行结束会直接返回错误,而redis.pcall会忽略错误继续执行脚本

  • 开发提示

    Lua可以使用redis.log函数将Lua脚本的日志输出到Redis的日志文件中,但是一定要控制日志级别。
    Redis3.2提供了Lua Script Debugger功能用来调试复杂的Lua脚本

  • Redis管理Lua脚本

    script load 将Lua脚本加载到Redis内存中
    scripts exists sha1 [sha1 …] 判断sha1是否已经加载到Redis内存中
    script flush 清除Redis内存已经加载的所有Lua脚本
    script kill 用于杀掉正在执行的Lua脚本。如果此时lua脚本阻塞redis了,可以使用此命令快速将脚本杀掉。如果正在执行的是写操作,script kill 将不会生效,只能通过shutdown save停掉redis服务。

6、redis 发布订阅

  • 发布消息。publish channel message 。
  • 订阅消息。subscribe channel [channel ...]。多个客户端订阅同一个频道,都会受到消息推送,类似于广播。
  • 取消订阅。unsubscribe [channel [channel ...]]
  • 按照模式订阅和取消订阅。psubscribe pattern [pattern...];punsubscribe [pattern [pattern ...]]
  • 订阅查询。pubsub channels [pattern],查看活跃的频道;pubsub numsub [channel ...],查看频道订阅数;pubsub numpat,查看模式订阅数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值