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,查看模式订阅数