Redis有实际slowlog
功能。正如您可以猜到的,您可以
检查慢
运行的
查询。最后将记录查询slowlog X运行在Y微秒。X和Y可以在redis.conf或在运行时
配置命令。
复制代码如下:配置集slowlog日志低于5000
配置集slowlog最大长度25
设置.
slowlog日志低于用于设置微秒,所以以上设置将记录运行超过5秒的查询。把日志记录,你可以用得到的X命令slowlog,其中x是记录你想要的数目。
复制代码如下:slowlog得到10
它将
显示一个唯一的ID、时间戳和事件查询、查询
执行所花费的时间和实际的命令+
参数。你可以通过
删除日志slowlog复位。
上次看slowlog,我一直无法平静看到DEL命令已经花费了超过20毫秒的时间。记住,redis是单
线程的,因此它将块(严重阻碍)并发
系统。同时,因为这是一个写
操作,这将阻止这个复制过程中的所有时间依赖Redis复制。
服务量,是否正在进行。
也许除了我之外,人人都知道这一点,但它证明了使用DEL命令字符串的哈希值,时间复杂度为O(1),并为列表,设置和
排序集(n)(其中n是集合中的项目数)。你可以删除包含数百万个数据集等阻止它。
我们的
解决方案非常简单:我们不删除这些数据项,而是
重命名它们,并在后台使用小型可中断块执行这些数据项。首先,我们delayed_delete功能:
本地键=键{ 1 }
当地data_type = redis.call(键)。好吧
如果data_type'set'or然后= = = = data_type'zset
局部
温度= 'gc:TMP:..redis.call('incr ','gc:IDS)..:..钥匙
Redis.call('rename键,温度)
返回redis.call('sadd ','gc:..data_type,温度)
终点
返回redis.call('del键)
这会将收集和添加新的
名字:设置或GC GC:zset集。(我们没有使用列表,但是如果你使用它,你也应该
支持它。
接下来,我们安排了一个Ruby
脚本,每分钟运行一次:
require'redis
R = redis.new(司机::hiredis)
r.srandmember('gc:集',10000)。每做|集|
项目= r.srandmember(组5000)
如果items.nil | | items.length = = 0
R.srem('gc:设置,设置)
下一个
终点
R.srem(设置项)
终点
r.srandmember('gc:zset,10000)。每做| zset |
如果r.zremrangebyrank(zset,0, 5000)<5000
R.srem('gc:zset,zset)
终点
终点
您可以根据您的需要
修改号码。你的收藏有多大,它们被删除的
频率有多大,因为我们不
经常做这些输出操作,我们一次只能删除一小块。
但是这种
方法比直接删除更慢,但在并发环境中可以很好地执行。