简介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 是用来设置微秒数的, 因此上面的设置将记录执行时间超过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函数:
 

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脚本每分钟运行一次:

 

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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索redis
ruby
redis showlog、redis show keys、redis show db、redis show、redis slowlog,以便于您获取更多的相关知识。

时间: 2024-08-01 18:27:59

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

简介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

简介Lua脚本与Redis数据库的结合使用_Redis

 可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧?  这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言.Hello, Lua! 我们的第一个Redis Lua 脚本仅仅返回一个字符串,而不会去与redis 以任何有意义的方式交互. 复制代码 代码如下: local msg = "Hello, world!" return msg 这是非常简单的,第一行代码定义了一个本地变量msg存储我们的信息, 第二行代码表示 从redis 服务端返回msg

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实现Session功能_Redis

0.什么是Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API 1.与其他用户状态保存方案比较 一般开发中用户状态使用session或者cookie,两种方式各种利弊. Session:在InProc模式下容易丢失,并且引起并发问题.如果使用SQLServer或者SQLServer模式又消耗了性能 Cookie则容易将一些用户信息暴露,加解密同样也消耗了性能. Redis采用这样的方案解决了几个问题,

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

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

Redis中主键失效的原理及实现机制剖析_Redis

作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Redis 也不例外.在 Redis 提供的诸多命令中,EXPIRE.EXPIREAT.PEXPIRE.PEXPIREAT 以及 SETEX 和 PSETEX 均可以用来设置一条 Key-Value 对的失效时间,而一条 Key-Value 对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确).可以说,主键失效这个概念还是比较容易理解的,但是在具体实现到 Redis 中又是如何呢?最近本博主就对 Redis

Redis中实现查找某个值的范围_Redis

本文来自Redis在Google Group上的一个问题,有一位同学发贴求助,说要解决如下的一个问题:他有一个IP范围对应地址的列表,现在需要给出一个IP的情况下,迅速的查找到这个IP在哪个范围,也就是要判断此IP的所有地.这个问题引来了Redis作者Salvatore Sanfilippo(@antirez)的回答.解答如下: 例如有下面两个范围,10-20和30-40 复制代码 代码如下: A_start 10, A_end 20 B_start 30, B_end 40 我们将这两个范围的

详解Redis中的双链表结构_Redis

Redis中双链表实现的基本结构: 1.节点结构 typedef struct listNode { struct listNode *prev; //前向节点 struct listNode *next; //后向节点 void *value; //该节点的值 } listNode; 2.双向链表结构 typedef struct list { listNode *head; //头节点 listNode *tail; //尾节点 void *(*dup)(void *ptr); //复制函数