redis的hscan和hgetall区别?
这两个都是取所有数据,hscan是迭代式的一次取几个,一次取几个,直到取完为止;
hgetall是一次性取所有;
我简单的测试了1万条hash,10万条hash,发现hgetall是比hscan更快的;
那么问题来了,hscan的应用场景在哪里?
阻塞和非阻塞的区别
占用内存不一样吧,可以对照 Eloquent 的
User::cursor()
和User::get()
理解就在下班前处理的一个 BUG,一个简单的业务逻辑:
结果,有一个时间段,访问量暴增,Redis 中记录了很多数据,导致这个 key 的成员增多,在使用
lrange <key> 0 -1
查的时候,导致了 OOM (超出 PHP 的执行内存限制),进而导致后面的业务没有继续下去,自然后面的del <key>
也就没有执行到,在经过一天的失败后,通过服务器报警得知,上去一看,这个 List 已经有 3 亿个 Item。试想一下,如果在业务中,不是使用的
lrange <key> 0 -1
而是类似于分页的方式lrange <key> ($page - 1) * 1000 $limit
的方式去拿数据(类似于 hscan),那么就不可能会出现 OOM ,导致一天的数据都阻塞在 Redis 中,形成这么一个有 3 亿个 Item 的 List,若不是及时发现了(其实也不及时了),就有可能最终导致 Redis 挂掉了。5以后