1
twoconk 2014-06-10 11:43:25 +08:00
学习了:)
|
2
yangyang 2014-06-10 11:43:57 +08:00 via Android
現在頁面生成很快,這個頁面只要 33ms。Good job!
|
3
jedyu 2014-06-10 11:44:50 +08:00
修复就好
|
4
zuroyu 2014-06-10 11:46:04 +08:00
是的,我们已经禁止使用keys操作了,每次的keys都会带来许多超时...
|
5
KennyZJ 2014-06-10 11:47:06 +08:00
原来因为这个。
我记得很早想用keys做模糊查询的时候就因为看到了作者这条警告只好作罢,一直没做过测试。 感谢分享这次经验。 新的v2.8.9里面的zrangebylex倒是可以值得考虑发挥一下作用。 |
6
homever 2014-06-10 11:47:27 +08:00
back
|
7
shao 2014-06-10 11:47:54 +08:00
请问,这个配图是为了卖萌嘛?
|
8
xuc 2014-06-10 11:48:00 +08:00
30ms
|
10
wwqgtxx 2014-06-10 11:48:11 +08:00 via Android
现在好快,赞一个
|
11
shao 2014-06-10 11:49:31 +08:00
|
12
canesten 2014-06-10 11:49:51 +08:00
大意失荆州
Reids官方自己在指令列表里清楚的写明了Warning Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using sets. http://redis.io/commands/keys |
13
tonghuashuai 2014-06-10 11:50:45 +08:00
记得当初开始学 redis 的时候,说完 keys * 就提到了在生产环境慎用 keys,没想到 @Livid 给亲身示范了下……
|
14
lovelotuslonely 2014-06-10 11:54:08 +08:00
跟著警長的那隻是甚麼。。。(我好弱)
|
15
DearMark 2014-06-10 11:54:27 +08:00 via Android
33ms 这性能终于爆棚了
|
16
Tink 2014-06-10 11:55:14 +08:00
29MS
|
17
cj1324 2014-06-10 11:56:52 +08:00
memcached不提供类似keys命令。 看来也是有益处的。
|
18
mxi1 2014-06-10 12:02:39 +08:00
这张图竟然有3m大,怪不得一直卡啊卡啊,还以为gif图就这样呢~~~~
|
19
mxi1 2014-06-10 12:03:16 +08:00
@lovelotuslonely 大兔子🐰
|
20
hitigon 2014-06-10 12:06:02 +08:00
Livid卖萌都卖得这么正经……(倒地
|
21
qloog 2014-06-10 12:07:22 +08:00
怪不得早上打不开呢,原来确实是故障,以为我的网络问题呢~
|
22
cctvsmg 2014-06-10 12:08:24 +08:00 1
这么快,不太适应
感觉刷v2ex的一大乐趣没了 |
23
nobita 2014-06-10 12:15:26 +08:00
good job
|
24
lm902 2014-06-10 12:15:39 +08:00
|
25
lazyphp 2014-06-10 12:15:50 +08:00
难怪刚才访问 出504了。
|
26
lm902 2014-06-10 12:16:17 +08:00
好不容易才打开一个页面
|
28
kslr 2014-06-10 12:35:54 +08:00
昨晚上4点左右504了
|
29
lovelotuslonely 2014-06-10 12:36:45 +08:00 via iPhone
@mxi1 這是啥兔,耳朵那麼大
|
31
Yuansir 2014-06-10 12:42:37 +08:00
也被KEYS坑过
|
32
karvinchen 2014-06-10 12:50:17 +08:00
学习了
|
33
snowhs 2014-06-10 12:53:45 +08:00
我就是想问下配图想表达啥...
|
34
slixurd 2014-06-10 12:55:52 +08:00
KEY这条指令我记得还在阿里还是腾讯的笔试题上出过
让我们阅读英文的manual,然后说出用法和注意事项以及猜测实现来着 |
36
Livid MOD OP |
37
Kabie 2014-06-10 13:14:13 +08:00
。。。我说怎么之前经常打不开呢……
|
38
PotatoBrother 2014-06-10 13:15:48 +08:00 via iPhone
现在我这已经40ms 以内了,终于可以顺畅的逛 V2 了
|
39
cutehalo 2014-06-10 13:18:22 +08:00
Livid会卖萌 谁也挡不住 XD
|
40
decken 2014-06-10 13:30:36 +08:00
www.v2ex.com 63ms
|
42
missdeer 2014-06-10 13:36:59 +08:00
75ms
|
43
Numbcoder 2014-06-10 13:41:55 +08:00
keys 相当于 select * ,在产品环境几乎是要禁用的。
还有 Instagram 那个脚本也会对性能有很大影响,在产品环境还是少用! |
44
Los 2014-06-10 14:32:55 +08:00 1
|
47
yueyoum 2014-06-10 14:51:26 +08:00 via Android
这要是别人来说这个问题,估计早就被你们喷死了吧……
|
50
Tinet 2014-06-10 15:05:39 +08:00
看来在做开发的时候还是要抽空多读读官方的文档啊
|
51
westup 2014-06-10 15:20:55 +08:00
速度好快啊现在
|
53
jevonszmx 2014-06-10 15:47:51 +08:00
哈,记得一定要看redis手册中的时间复杂度啊,比如ltrim、hgetall之类的,就是陷阱啊,分分钟卡死redis。
|
54
Los 2014-06-10 16:09:24 +08:00 2
#44
总在线人数统计使用 ZCOUNT r.zcount("v2ex:online", int(time.time())-60*10, "+inf") 某用户是否在线使用 ZSCORE 取得最后活动时间进行判断 r.zscore("v2ex:online", member.id) |
55
wenbinwu 2014-06-10 16:13:46 +08:00
昨天我也碰到一个django的性能问题
ModelFormSet没有指定queryset就会默认使用all() 在production直接100%cpu然后死在那了 |
56
ipconfiger 2014-06-10 16:33:26 +08:00
keys 是 O(n)级别的操作啊,绝对不能直接暴露出去调用的
|
57
ngn999 2014-06-10 16:38:03 +08:00
不适应这么快的速度。=͟͟͞͞ʕ•̫͡•ʔ
|
58
cloudzhou 2014-06-10 16:52:52 +08:00
@Livid
"这次的解决方法是,需要用到 KEYS 的地方,其实是我们目前的在线人数统计,现在这个地方已经加上了缓存,所以对 KEYS 的调用就大大减少了。" 这么看起来,你只是减少了 KEYS 的调用次数,可能就是加入缓存,每3,5分钟 keys() 一次。 我认为这样的做法还不够优雅,对你现在说的这个需求,以下是我的做法: 引入 Sorted sets,创建一个名字叫: user:online 当用户 user(id: user_id),进行一次页面操作的时候,timestamp_now 就是当前时间戳: > ZADD user:online timestamp_now user_id 对于每一个用户的页面操作都是做这样的操作 * 最新的用户在线列表(精确列出在线用户,以下统计前 1000 个在线用户,按照时间戳逆序)*: > ZREVRANGE 0 1000 1) user_id_1 2) user_id_2 ... * 统计 5 分钟内的用户数(其实在线是个虚幻的概念,只能说 x 分钟内活跃认为在线)* > ZCOUNT myzset (timestamp_5_minutes_ago timestamp_now * 定期清除 x 分钟内没有活跃的用户,控制 Sorted sets 的长度 * > ZREMRANGEBYSCORE myzset -inf (timestamp_10_minutes_ago 上面操作复杂度:O(log(N)+M) 这是可以控制的,并且数据非常及时和准确。 其实这是一个很好的面试题目。 广告:我需要前端工程师,设计师: http://v2ex.com/t/115602 |
59
holy_sin 2014-06-10 16:55:28 +08:00
这个兔子好大
|
60
RoCry 2014-06-10 17:01:24 +08:00 via Android
早知道有这么大的图就不点开了... 我的流量...
|
61
Mac 2014-06-10 17:18:08 +08:00
现在的速度快的像飞一样啊
|
62
keakon 2014-06-10 17:20:33 +08:00
更简单的方案是放在一个单独的 db 里。
|
63
ShunYea 2014-06-10 19:58:35 +08:00 via Android
40MS,相当不错
|
64
spoonwep 2014-06-10 22:19:53 +08:00
原来如此,最近正在倒腾redis,学习了!
|
65
sdjl 2014-06-10 22:22:38 +08:00
想知道v2ex每天pv有多少~~?
|
66
precisi0nux 2014-06-11 09:50:57 +08:00
14ms, nice!
|
67
wikimore 2014-06-11 17:01:44 +08:00
redis数据越多越觉得坑
|
68
nezhazheng 2014-06-12 09:17:45 +08:00
scan就是被设计来解决这个问题的,生产环境keys肯定得禁用,redis单线程,keys之后,其他连接全部等待。
|
69
geew 2014-06-30 10:57:26 +08:00
|
70
Livid MOD OP @geew 如果 keys 这样的指令是每 10 分钟运行一次,那不会有太大问题。但是如果是每几秒就需要运行一次的话,你就需要考虑其他替代方案了。
|
71
geew 2014-06-30 11:09:44 +08:00
@Livid 目前主要用来删除某些相同前缀的缓存, 频率不是固定, 跟后台人员编辑新建数据有关, 问题我觉得倒不会有, 因为数据量不大而且更新也不频繁, 因此其实这条语句使用不多. 但看到了总觉得是个隐藏的坑, 因为这是个组件, 不排除以后会用在别的地方.
也看到了scan, 但不知道是不是我的使用方法有问题,一直报错: ResponseError: unknown command 'SCAN' scan的原型不是这样的么 #con.scan(self, cursor=0, match=None, count=None) 这样用: con.scan(match=keys+'*')? 有问题? |
72
cloudzhou 2014-06-30 11:21:57 +08:00
@geew
@Livid 按照我的观点,那就是根本不要在线上使用 keys 这个指令,哪怕为了未来考虑,这是定时炸弹。 按照你上面的例子,解决方法其实很简单,两种策略: 1 外部引用,举个例子来说,就是添加值的时候做一次引用: 对 namespace.xx.yy 设值,同时把这个 namespace.xx.yy 放入 sets (以 namespace 划分的 sets),当要批量引用 namespace 开头的值时,从 sets 里面遍历,然后第二次访问。 同理,删除的时候对应删除。 缺点,有时候很难保证一致性,需要做一些补偿方案,内存使用会增加。 2 版本号的概念,对于 redis,我一直还是推荐持久化数据的,并且严格控制数据的动态产生,也就是没有删除数据这个操作,但是如果你是作为 cache 使用并且数据本来就可以丢失的,那么就可以利用版本号。使用 EXPIRE ,也就是 KEY 是有一定生存周期的,并且命名是这样的: namespace.version.xx.yy 其中 version 是一个 hashes 的对应值 {namespace : version},当你要丢弃整个版本号的时候, version = version + 1,之前的 namespace version 版本全部不再使用,在过了一段时间之后(EXPIRE)自然回收。 缺点,只使用易失性数据,cache 使用,内存使用量在丢弃频繁的时候浪费过多。 总之,根据你的需求,有很多种方法,但是尽量不要使用 keys. |
73
nezhazheng 2014-06-30 13:46:12 +08:00
|
74
geew 2014-06-30 15:11:11 +08:00
|