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

Memory

mysql索引小记

在表关联查询时,如两个表的关联字段类型、编码不同,是无法利用索引的。

星期五

记一次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集群。…

对布隆过滤器(Bloom Filter)一点总结

布隆过滤器是一种空间利用率高,可以用来对数据进行排重过滤处理的数据结构,具有以下两点特征:

  • 判定为不存在的数据一定不存在
  • 判定为存在的数据可能存在也可能不存在

存在的数据如果实际上并不存在,称为false positive,那么为什么会有这种现象呢?

布隆过滤器是通过khash函数将某个key映射到m个的比特位上。那么某个key的比特位有可能会被其他的一个或多个key占用,即会产生误判为存在的情况,所以这个误判率取决于…

笔记

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

星期三

CLI下php进程假死问题排查

首先通过strace命令跟踪假死进程的系统调用信息

strace -p 16618

执行以上命令后,得到如下结果

poll([{fd=33, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
poll([{fd=33, events=POLLOUT}], 1, 1000) = 0 

利用swoole的task进程和redis实现队列任务

swoole简介

面向生产环境的 PHP 异步网络通信引擎,可以通过该扩展快速创建TCP/UDP服务端、Http服务端、websocket服务端。

Task进程简介

如果没有接触过swoole可以先上swoole官网了解swoole的进程模型

swoole_server中提供了task的进程,用来异步处理耗时的任务,只需要配置swoole_server时设置task_worker_num即可启用task进程,在worker进程中使用$server->task(array $data)进行任务的投递,但是在任务耗时且量大的情况下会出现任务丢失的现象,所以决定采用第三方来实现队列,来确保数据的完整和可靠性。…

实战直播平台开发之初窥门径(一)

前几天,接到一个需求,需要构建一个简单的直播平台,这也是第一次接触到直播方面的开发任务,带着学习与挑战的精神决定记录下来这次开发的全过程。

经过几番查阅资料,对于如何构建一个直播平台有了一些初步的概念。

1、协议

首先来说说直播的协议,在查阅资料的过程中发现以下三种普遍应用的协议。

  1. RTMP(Real Time Messaging Protocol)
  2. RTSP(Real Time Streaming Protocol)
  3. HLS(HTTP Live Streaming)

关于这三种协议,前二者是基于TCP/UDP进行实时的数据传输,HLS则是采用了…