• 展开微博窗口
  • QQ:52619941
  • 微信:cnmemory
  • 展开分类目录
  • 还没有账号?

Memory

记一次redis响应慢的处理

背景

前段时间,公司某业务在高并发下,单机单个redis实例中,有个大字符串的get操作总是很慢。查看slowlog并无慢日志记录。

原因

通过咨询掌阅@老錢,得到了以下答复

redis的网络读写和逻辑处理都是单个线程处理的,slowlog只是衡量逻辑处理的时间并不包括接受指令和发送响应的时间。字符串的get操作逻辑非常快,所以slowlog没有任何信息。但是网络读写就慢了,特别是高并发下何况你的value也大的有点离谱,内存中有大量待发送的缓冲数据堆积在那里,单线程需要拼命地发送数据,所以才会这样缓慢。建议将value于本地内存缓存起来。

解决

老錢的建议是将value缓存到本地内存,当然也可以考虑增加redis实例做读写分离来分散压力,但是受限于当时项目的规模,在项目初期都是在用单个redis实例操作,如果做redis集群,业务代码改动相对较大,于是还是决定将value进行本地缓存。

那么由于项目架构采用的是传统的nginx+php-fpm,无法常驻内存,于是决定利用/dev/shm(tmpfs)将这个value缓存到本地内存文件系统中。

既然用到了本地缓存,就要考虑集群下机器的value一致性,所以最终使用redis在每台机器上部署了一个订阅服务,当value发生改变时,更新本地缓存。

效果

从zabbix中可以很明显看到网络传输的峰值下降了非常多,可见这个key在业务高峰期时读取有多频繁。

结论

对于大字符串,偶尔读写不会存在问题,但是在频繁读写就会给redis带来不小的压力,所以可以考虑做本地缓存和redis集群。…

笔记

磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO

星期三

IO 多路复用是什么意思?

这些名词比较绕口,理解涵义就好。一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就这样一个服务员服务好多人,有时没人喝酒,服务员处于空闲状态,可以干点别的玩玩手机。至于epoll与select,poll的区别在于后两者的场景中醉汉不说话,你要挨个问要不要酒,没时间玩手机了。io多路复用大概就是指这几个醉汉共用一个服务员。

作者:匿名用户
链接:https://www.zhihu.com/question/32163005/answer/55687802
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器

第一步:下载kindeditor,下载地址为:http://www.kindsoft.net/down.php 下载最新版本的,现在是4.1.10
下载之后,把里面不要的语言和演示文件删除,有,asp、asp.net jsp和examples四个文件夹删掉。

把文件夹改名为:kindeditor,然后上传到根目录includes/下面,和fckeditor同一级就是了。以后可以把fckeditor删除了。

第二步:修改admin/includes/lib_main.php把里面的create_html_editor方法修改为创建kindeditor的内容:
直接替换就ok了:

function  create_html_editor ($input_name, $input_value = '')
{
global $smarty;
$kindeditor="<script …