简介Redis中的showlog功能

   这篇文章主要介绍了简介Redis中的showlog功能,作者同时对比了DEL命令的性能,需要的朋友可以参考下

  Redis 有一个实用的slowlog功能,正如你可以猜到的,可以让你检查运行缓慢的查询. Slowlog 将会记录运行时间超过Y微秒的最后X条查询. X 和 Y 可以在 redis.conf 或者在运行时通过 CONFIG 命令:

  代码如下:

  CONFIG SET slowlog-log-slower-than 5000

  CONFIG SET slowlog-max-len 25

  进行设置。

  slowlog-log-slower-than 是用来设置微秒数的, 因此上面的设置将记录执行时间超过5秒的查询. 要获取记录的日志,你可以使用 SLOWLOG GET X 命令, 这里 X 是你想要获取的记录条数:

  代码如下:

  SLOWLOG GET 10

  它将会展示一个唯一的id,时间戳和发生的查询,查询执行所花掉的时间和实际被执行的命令+参数. 你可以通过SLOWLOG RESET擦出日志.

  最后一次查看slowlog,我很不淡定的看到DEL命令的执行竟然花了超过20毫秒的时间. 还记得吗,Redis是单线程的,因此这样会阻塞(并且严重的有碍)我们系统的并发. 还有,因为这是一个写操作,它将会在向所有从属Redis服务复制的时候阻塞这一复制过程. 额,到底这是咋回事呢?

  也许除了我之外所有人都知道这个问题了,但是这证明了Redis的DEL命令的时间复杂度对于字符串和哈希值而言是O(1),而对于list、set和sorted set而言则是O(N) (这里的 N 是集合中数据项的数目). 你会删除一个包含数百万条数据的set吗? 那就等着阻塞吧.

  我们的解决方案很简单: 不去删除这些数据项,而是将它们重命名,并且在后台作业中用小而可间断的块去执行对它们的删除操作. 首先,是我们的delayed_delete函数:

  ?

1
2
3
4
5
6
7
8
9
10

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)

  这将会将集合重命名,并且将新的名称添加到gc:set 或者 gc:zset set中 (我们没有使用 list, 但如果你使用了的话,你也应该向其加入这方面的支持).

  下一步我们安排了一个Ruby脚本每分钟运行一次:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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, 0, 5000) < 5000
r.srem('gc:zset', zset)
end
end

  你可以基于自己的需要将修改数字. 你的集合有多大,以及它们被删除有多频繁? 因为我们不去太过频繁的做这些类型的产出操作, 我们可以一次只进行一小块的删除操作.

  不过这种方法比直接删除更加的慢, 但它在并发的环境下却可以表现得很好.

时间: 2024-11-27 23:54:21

简介Redis中的showlog功能的相关文章

简介Redis中的showlog功能_Redis

Redis 有一个实用的slowlog功能,正如你可以猜到的,可以让你检查运行缓慢的查询. Slowlog 将会记录运行时间超过Y微秒的最后X条查询. X 和 Y 可以在 redis.conf 或者在运行时通过 CONFIG 命令:     复制代码 代码如下: CONFIG SET slowlog-log-slower-than 5000 CONFIG SET slowlog-max-len 25 进行设置. slowlog-log-slower-than 是用来设置微秒数的, 因此上面的设置

如何监控 redis 中lsit集合

问题描述 多个县城同时网redis中的某个list集合中添加元素如何对这个list集合做监控目前是写了一个while(true){......}的循环,一直在遍历这个list集合,感觉这样不太好有没有更好的方法来监控这个list集合 解决方案 解决方案二:楼主说的监控是要做什么要达到什么目的呢解决方案三:引用1楼suciver的回复: 楼主说的监控是要做什么要达到什么目的呢 这个list集合就是一个堆栈,如果堆栈中有增加数据(元素),则需要对该元素做相应的处理解决方案四:引用2楼haorengo

MSXML4.0 版中的新增功能_小偷/采集

MSXML4.0 版中的新增功能 2001 年 9 月发行的 Microsoft XML Core Services (MSXML) 4.0 版中的新增功能  Microsoft Corporation  2001年10月 下载 MSXML 4.0,网址为 MSDN Downloads(英文). 摘要: 本文重点介绍了与版本 3.0 相比,2001 年 9 月发行的 Microsoft XML Core Services (MSXML) 4.0 版中的新功能和重要变更.  目录 简介  新功能 

Redis中5种数据结构的使用场景介绍

这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下. 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String--字符串 Hash--字典

Redis中5种数据结构的使用场景介绍_Redis

一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String--字符串 Hash--字典 List--列表 Set--集合 Sorted Set--有序集合 下面我们就来简单说明一下它们各自的使用场景: 1. String--字符串 String 数据结构是简单的 key-

redis中使用java脚本实现分布式锁_Redis

redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题.例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性,这如果在同一个vm下面,就很容易加锁,但如果在分布式环境下就没那么容易了,当然利用redis现有的功能也有解决办法,比如redis的脚本. redis在2.6以后的版本中增加了Lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用

Redis中的动态字符串学习教程_Redis

sds 的用途Sds 在 Redis 中的主要作用有以下两个: 实现字符串对象(StringObject): 在 Redis 程序内部用作 char* 类型的替代品: 以下两个小节分别对这两种用途进行介绍. 实现字符串对象 Redis 是一个键值对数据库(key-value DB), 数据库的值可以是字符串.集合.列表等多种类型的对象, 而数据库的键则总是字符串对象. 对于那些包含字符串值的字符串对象来说, 每个字符串对象都包含一个 sds 值. "包含字符串值的字符串对象",这种说法

MSXML4.0 版中的新增功能

MSXML4.0 版中的新增功能 2001 年 9 月发行的 Microsoft XML Core Services (MSXML) 4.0 版中的新增功能  Microsoft Corporation  2001年10月 下载 MSXML 4.0,网址为 MSDN Downloads(英文). 摘要: 本文重点介绍了与版本 3.0 相比,2001 年 9 月发行的 Microsoft XML Core Services (MSXML) 4.0 版中的新功能和重要变更. 目录 简介  新功能 

ios-需要在IOS中设置延迟功能

问题描述 需要在IOS中设置延迟功能 需要一个延时器,进行23秒的延迟然后执行函数.应该怎么实现?用不用NSTimer? 解决方案 performSelector: withObject: afterDelay: 解决方案二: 简单点的话,使用performSelector: withObject: afterDelay: 方法 [self performSelector:@selector(delayMethod:) withObject:nil afterDelay:23];