用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8943|回复: 11
收起左侧

[优化] CI的redis驱动的严重性能问题

[复制链接]
发表于 2016-7-13 15:18:56 | 显示全部楼层 |阅读模式
redis驱动当存储php对象时,其key都会放到一个$_serialized数组中。且每次初始化时,会执行sMembers('_ci_redis_serialized'),把所有序列化对象的key值赋值给$_serialized数组,放入内存,这个操作,当key成千上万是,效率是非常低的,而且很占内存。会严重影响性能,拖垮redis和应用服务器。

redis驱动没有其他的解决方案?官网提供的这个太坑,难道是我使用的姿势不对?
发表于 2017-8-29 11:40:29 | 显示全部楼层
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 14:20:53 | 显示全部楼层
★わ浪漫少帅 发表于 2017-8-29 11:42
我测试了下,这个数据量大的时候通过sMembers取就会延迟1-2s,简直惊人,导致redis连接数变得越来越大,结 ...

我看最新的 CI 好像已经没有这些代码了。
 楼主| 发表于 2016-7-13 15:26:42 | 显示全部楼层
如果只是需要避免数字类型的value被序列化而导致incr等自增方法无法使用,大可把数字单独判读,不做序列化,而其他的一律序列化掉就好了,还会有其他问题吗?
发表于 2016-7-14 14:46:57 | 显示全部楼层
你说的是 Session 么
 楼主| 发表于 2016-7-14 18:14:00 | 显示全部楼层
Hex 发表于 2016-7-14 14:46
你说的是 Session 么

不是呀。就是使用redis存储php对象的时候
发表于 2016-7-17 22:49:06 | 显示全部楼层
那就这样吧 发表于 2016-7-14 18:14
不是呀。就是使用redis存储php对象的时候

那就是 cache?
CI 里就这两个地方会用到 redis 吧。。。。
发表于 2016-10-26 16:13:14 | 显示全部楼层
你这个问题后面如何解决的?
发表于 2017-5-18 19:49:39 | 显示全部楼层
本帖最后由 qgmac1 于 2017-5-18 20:21 编辑

找到system\libraries\Cache\drivers\Cache_redis.php   132和133行,直接注释既可
发表于 2017-8-29 11:42:54 | 显示全部楼层
我测试了下,这个数据量大的时候通过sMembers取就会延迟1-2s,简直惊人,导致redis连接数变得越来越大,结果就是越来越卡

本版积分规则