CI的redis驱动的严重性能问题
redis驱动当存储php对象时,其key都会放到一个$_serialized数组中。且每次初始化时,会执行sMembers('_ci_redis_serialized'),把所有序列化对象的key值赋值给$_serialized数组,放入内存,这个操作,当key成千上万是,效率是非常低的,而且很占内存。会严重影响性能,拖垮redis和应用服务器。redis驱动没有其他的解决方案?官网提供的这个太坑,难道是我使用的姿势不对? Hex 发表于 2016-7-17 22:49
那就是 cache?
CI 里就这两个地方会用到 redis 吧。。。。
我也发现ci cache 中redis处理,会通过sMembers获取一个集合,每次保存都会在这个集合中加,类似一个map的样子,我不知道官网为什么要这么做,redis本身就能做到了。
Cache_redis.php 注释这两行就可以了
$serialized = $this->_redis->sMembers('_ci_redis_serialized');
empty($serialized) OR $this->_serialized = array_flip($serialized); ★わ浪漫少帅 发表于 2017-8-29 11:42
我测试了下,这个数据量大的时候通过sMembers取就会延迟1-2s,简直惊人,导致redis连接数变得越来越大,结 ...
我看最新的 CI 好像已经没有这些代码了。 如果只是需要避免数字类型的value被序列化而导致incr等自增方法无法使用,大可把数字单独判读,不做序列化,而其他的一律序列化掉就好了,还会有其他问题吗? 你说的是 Session 么 Hex 发表于 2016-7-14 14:46
你说的是 Session 么
不是呀。就是使用redis存储php对象的时候 那就这样吧 发表于 2016-7-14 18:14
不是呀。就是使用redis存储php对象的时候
那就是 cache?
CI 里就这两个地方会用到 redis 吧。。。。 你这个问题后面如何解决的? 本帖最后由 qgmac1 于 2017-5-18 20:21 编辑
找到system\libraries\Cache\drivers\Cache_redis.php 132和133行,直接注释既可 我测试了下,这个数据量大的时候通过sMembers取就会延迟1-2s,简直惊人,导致redis连接数变得越来越大,结果就是越来越卡
页:
[1]
2