简介Redis中的showlog功能
|
Redis 有一个实用的slowlog功能,正如你可以猜到的,可以让你检查运行缓慢的查询. Slowlog 将会记录运行时间超过Y微秒的最后X条查询. X 和 Y 可以在 redis.conf 或者在运行时通过 CONFIG 命令: 进行设置。 slowlog-log-slower-than 是用来设置微秒数的,因此上面的设置将记录执行时间超过5秒的查询. 要获取记录的日志,你可以使用 SLOWLOG GET X 命令,这里 X 是你想要获取的记录条数: 它将会展示一个唯一的id,时间戳和发生的查询,查询执行所花掉的时间和实际被执行的命令+参数. 你可以通过SLOWLOG RESET擦出日志.
也许除了我之外所有人都知道这个问题了,但是这证明了Redis的DEL命令的时间复杂度对于字符串和哈希值而言是O(1),而对于list、set和sorted set而言则是O(N) (这里的 N 是集合中数据项的数目). 你会删除一个包含数百万条数据的set吗? 那就等着阻塞吧. 我们的解决方案很简单: 不去删除这些数据项,而是将它们重命名,并且在后台作业中用小而可间断的块去执行对它们的删除操作. 首先,是我们的delayed_delete函数:
local key = KEYS[1]
local data_type = redis.call('type',key).ok
if data_type == 'set' or data_type == 'zset' then
local temp = 'gc:tmp:' .. redis.call('incr','gc:ids') .. ':' .. key
redis.call('rename',key,temp)
return redis.call('sadd','gc:' .. data_type,temp)
end
return redis.call('del',key)
下一步我们安排了一个Ruby脚本每分钟运行一次:
require 'redis'
r = Redis.new(driver: :hiredis)
r.srandmember('gc:set',10000).each do |set|
items = r.srandmember(set,5000)
if items.nil? || items.length == 0
r.srem('gc:set',set)
next
end
r.srem(set,items)
end
r.srandmember('gc:zset',10000).each do |zset|
if r.zremrangebyrank(zset,5000) < 5000
r.srem('gc:zset',zset)
end
end
你可以基于自己的需要将修改数字. 你的集合有多大,以及它们被删除有多频繁? 因为我们不去太过频繁的做这些类型的产出操作,我们可以一次只进行一小块的删除操作. 不过这种方法比直接删除更加的慢,但它在并发的环境下却可以表现得很好. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQL Server 2005 DTS导入平面数据出现错误解决方
- SQL Server SQL语句练习实例之五 WMS系统中的关于
- sql-server – SQL RESTORE WITH RECOVERY;挂起率
- SQL Server 2005备份失败
- 为什么我们需要数据库表中的审计列?
- sql-azure – 新用户无法登录到SQL Azure
- sql – JOIN和WHERE中的过滤查询之间的区别?
- SQL Server或MySQL中的博客数据库通常足够了20 M
- SQL Server insert select与select into 的用法示
- sql-server-2008-r2 – SQL Server数据库主密钥
