文章目录
慢查询
慢查询的两个配置参数
- slowlog-log-slower-than
单位(微秒),默认值是10000,假如执行了一条“很慢”的命令(例如keys*),如果它的执行时间超过了10000微秒,那么它将被记录在慢查询日志中如果slowlog-log-slower-than=0会记录所有的命令,slowlog-log-slowerthan<0对于任何命令都不会进行记录 - slowlog-max-len
列表的最大长度,一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出
修改配置文件
config set key value #动态修改配置文件(不持久)
config rewrite #将配置持久化到本地配置文件
慢查询日志相关命令
slowlog get [n] #获取慢查询日志
slowlog len #慢查询日志列表当前长度
slowlog reset #慢查询日志重置
每个慢查询日志有4个属性组成:
- 标识id
- 发生时间戳
- 命令耗时
- 执行命令和参数
redis-cli
info #查看信息
-r num command #表示将命令执行多次
-i num #每隔num秒执行一次命令,须与-r一起使用(单位s),可用小数表示ms
-x #从标准输入读取数据作为redis-cli的最后一个参数
-a #如果设置了密码,可以用-a选项,这样就不用手动输入auth命令
--scan和--pattern #用于扫描指定模式的键
--slave #把当前客户端模拟成redis节点的从节点,可以用来获取当前redis节点的更新操作
--rdb #请求redis实例生成并发送RDB持久化文件,保存在本地
--pipe #用于将命令封装成redis通信协议定义的数据格式,批量发送给redis执行
--bigkeys #使用scan命令对redis键进行采样,从中找出内存占用比较大的键值
--eval #执行指定的lua甲苯
--latency #监测平均网络延迟
--latency-history #分时段监测延迟,15s输出一次
--latency-dist #使用统计图表的形式从控制台输出延迟统计信息
--stat #实时获取redis的重要统计信息
--no-row #--no-raw选项是要求命令的返回结果必须是原始的格式,--raw返回格式化后的结果
redis-server
redis-server --test-memory num #监测当前操作系统能否稳定分配指定容量的内存给redis,单位(MB)
redis-benchmark
redis-benchmark 可以为 redis 做基准性能测试,它提供了很多选项测试redis相关性能
-c num #客户端并发数量,默认50
-n num #客户端请求总量,默认100000
#redis-benchmark -c 100 -n 20000 表示100个客户端同时请求redis,共20000次
-q #仅显示redis-benchmark的requests per second信息
-r num #向redis插入num个随机键
-p #每个请求的pipeline的数据流(默认为1
-k #客户端是否使用keepalive 1为使用
-t #对指定命令进行基准测试
--csv #结果按照csv格式输出
事务
redis提供了简单的事务功能,将一组需要一起执行的命令放在multi和exec两个命令之间,如果要停止事务的执行,可以使用discard命令代替exec
命令错误
- 语法错误会造成整个事务无法执行
- 语法正确,运行时错误,redis不支持回滚功能,错误之前的命令会执行,需要开发人员自己修复这类问题
有些场景需要在事务之前确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行(类似于乐观锁),redis提供了watch来解决这类问题
lua用法概述
(1)字符串
local string val = "world" //local表示局部变量
(2)数组
local tables myArray = {"redis",88.0} //注意lua中数组下标从1开始计算
(3) for
for i = 1,100
do
//something
end
// #tables 获得数组长度
for index,value in ipairs(myArray)
do
//something
end
(4)if else
if a<=1
then
//somthing
else
//somthing
end
(5)hash(其实也是tables)
local tables user_1 = { age = 28 }
print("echo ".. user_1["28"]) //..连接字符串
for key,value in pairs(use_1)
(6)函数
function funcName()
end
lua与redis
在redis中执行Lua脚本有两种方法:eval和evalsha
(1) eval
eval 脚本内容 key个数 key列表 参数列表
eval 'return "hello "..KEYS[1]..ARGV[1]' 1 redis world
输出为 "hello redisworld"
如果lua脚本较长,可以使用redis-cli --eval直接执行文件
(2)evalsha
首先将脚本加载到redis服务端,得到该脚本的SHA1校验和,evalsha命令使用SHA1作为参数可以直接执行对应lua脚本,避免每次发送lua脚本的开销
redis-cli script load "$(cat lua_get.lua)" #将脚本内容加载到redis中
evalsha SHA1code key个数 key列表 参数列表
lua的redis API
redis.call()
redis.pcall()
如果redis.call执行失败,脚本会返回错误
redis.pcall会忽略错误继续执行脚本
redis.log()可以将lua脚本的日志输出到redis的日志文件中
lua脚本的好处
- lua脚本在redis中是原子执行的
- 可以创造自己定制的命令,并常驻redis内存中,实现复用
- 可以将多条命令一次性打包,有效减少网络开销
redis管理lua脚本
script exists [sha1...] #判断sha1是否已经加载到内存中
script flush #清除redis内存已经加载的所有lua脚本
script kill #杀掉正在执行的lua脚本
redis 提供了一个 lua-time-limit 此参数,默认是5s,但并不会停止,而是向其他命令发送busy信号,提示使用 script kill 杀掉这个脚本。不过如果当前 lua 脚本正在执行写操作,则 kill 不会生效
Bitmaps
setbit key offset value #设置键的第offset索引位的值
getbit key offset #获取键的第offset位的值
bitcount [start] [end] #获取指定范围内1的个数
bitop op destkey [key...] #对多个bitmaps做集合运算,op = or, and , not , xor
bitpos key targetBit [start] [end]#计算第一个值为targetBit的位置,start和end可以设定一个范围,单位(字节),即start为1时,从index8开始
HyperLogLog
一种基数算法,利用极少的内存空间完成独立总数的统计
pfadd key [elment...] #向HyperLogLog添加元素,成功返回1
pfcount [key...] #计算独立用户数
pfmerge destkey [sourcekey...]
HyperLogLog内存占用极少,但不是100%正确,存在%0.81的失误率
所以在选择HyperLogLog是需要确认如下两条:
- 只为了计算独立总数,不需要获取单条数据
- 可以容忍一定的误差率
发布订阅
publish channel message #发布消息
subscribe [channel...] #订阅消息
unsubscribe [channel...] #取消订阅
psubscribe [pattern...] #按照模式订阅
unpsubscribe [pattern...] #按照模式取消订阅
pubsub channels [pattern] #查询活跃的频道(至少有一个订阅者)
pubsub numsub [channel...] #查看频道订阅数
pubsub numpat #查看模式订阅数
有关订阅消息有两点需要注意:
- 客户端在执行订阅命令后进入了订阅状态,只能接收subscribe,psubscribe,unsubscribe,punsubscribe的四个命令
- 新开启的订阅客户端,无法收到该频道之前的消息,因为redis不会对发布的消息进行持久化
和很多专业的消息队列系统相比,redis的发布订阅略显粗糙,例如无法实现消息堆积和回溯
GEO
GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。
这部分暂时不想了解,先跳过,有需要再补上