php数据压缩函数gzcompress使用

分类:技术文档 - PHP文档 | 阅读(2841) | 发布于:2018-11-05 19:22 | 标签:无

压缩:gzcompress 解压:gzuncompress

 123,
    'name' => '张三',
    'age' => 24
];

$json = json_encode($data, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
$compressed= gzcompress($json);
$mysql_insert_data = base64_encode($compressed);

$compressed_new = base64_decode($mysql_insert_data);
$json_new = gzuncompress($compressed_new);
$data_new = json_decode($json_new, true);

print_r($data_new);

1.如果要json_encode的话,要先于gzcompress执行。如果gzcompress先执行,json_encode返回的是空值。
2.gzcompress(json_encode(数组))这种写法是不对的,得到的结果是一堆乱码。必须分开写,json_encode处理结果赋值给一个变量,然后gzcompress处理这一变量
3.gzcompress结果直接存入数据库不会成功。可以base64_encode一下。

经研究发现, gzuncompress的处理结果与zlib_decode的处理结果相同. (在gzcompress时使用了zlib格式). 把gzuncompress函数,换成zlib_decode即可. 完全不影响使用.

阅读更多...

redis管道pipeline的运用

分类:技术文档 - Redis | 阅读(2582) | 发布于:2018-11-05 18:04 | 标签:无

Redis使用的是客户端-服务器(CS)模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。服务端处理命令,并将结果返回给客户端。

普通模式与管道模式
普通模式:由于通信会有网络延迟,假如client和server之间的包传输时间需要0.125秒。那么上面的三个命令6个报文至少需要0.75秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显然没有充分利用 redis的处理能力。
管道模式:(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间,而且Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。 Pipeline 的默认的同步的个数为53个,也就是说arges中累加到53条数据时会把数据提交。其过程如下图所示:client可以将三个命令放到一个tcp报文一起发送,server则可以将三条命令的处理结果放到一个tcp报文返回。 需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。具体多少合适需要根据具体情况测试。

$redis = new Redis();
$redis->connect('127.0.0.1', 5678);
$redis->select(9);
$memberId = 12345678;
$memberHandler = ServBox()->Member();
$pipeline = $redis->pipeline();
while ($memberId > 0) {
    $pipeline->del($memberHandler->getKeyMemberInfo($memberId));
    if ($memberId % 50 == 0) {
        $pipeline->exec();
        $pipeline = $redis->pipeline();
    }
    $memberId--;
}
$pipeline->exec();
$redis = new Redis();

$redis->connect('127.0.0.1', 5678);
$redis->pipeline();
for ($i=0;$i<1000;$i++)
{
    $redis->set("test_{$i}",pow($i,2));
    $redis->get("test_{$i}");
}
$redis->exec();
$redis->close();

阅读更多...

docker容器开启sshd登陆服务

分类:技术文档 - Docker容器 | 阅读(2194) | 发布于:2018-10-24 10:27 | 标签:无

dockerfile:
FROM       ubuntu:16.04
MAINTAINER xchengli@126.com

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd

#密码为root
RUN echo 'root:root' | chpasswd

#允许root的ssh远程登陆
RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config

#开放22端口
EXPOSE 22

#开启后台服务
CMD    ["/usr/sbin/sshd", "-D"]
安装及启动
docker build -t ubuntu-sshd .
docker run -d -p 2022:22 ubuntu_sshd

阅读更多...

zeroMQ,rabbirMQ,kafka比较

分类:技术文档 - 队列 | 阅读(2345) | 发布于:2018-10-10 12:56 | 标签:无

RabbitMq比较成熟,在可用性、稳定性、可靠性上较好。RabbitMQ并发性最高,原因是它的实现语言是天生具备高并发高可用的erlang语言。

Kafka设计的初衷就是处理日志的,可以看做是一个日志系统,针对性很强,所以它并没有具备一个成熟MQ应该具备的特性。Kafka的性能(吞吐量、tps)比RabbitMq要强,两者在这方面没有可比性。

ZeroMQ是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,不支持消息持久化。

RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。

阅读更多...

MySQL官方Docker镜像的使用

分类:技术文档 - MySQL | 阅读(2245) | 发布于:2018-09-28 10:11 | 标签: docker mysql

首先是pull image,这里我拉取的是5.6.35:

sudo docker pull mysql:5.6.35

拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口:

sudo docker run --name mysql -p 12345:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6.35

试着用客户端连接,成功了,查询mysql.user表发现允许从任何地方用root访问,这特么也太不安全了!

果断连接到bash:

sudo docker exec -it mysql bash

运行mysql,竟然有!

下面就是基本的操作,收回root权限,建库,开用户……

等等,数据库文件在哪??还有,字符集不是UTF-8??阅读官方文档,得知/etc/mysql/conf.d下可以自定义配置文件,于是乎自己建了一个my.cnf,重新运行:

sudo docker run --name mysql -p 12345:3306 -v $DOCKER_RUNTIME/mysql/data:/var/lib/mysql -v $DOCKER_RUNTIME/mysql/conf:/etc/mysql/conf.d -d mysql:5.6.35

这里顺便改了数据库文件的目录,$DOCKER_RUNTIME是我自己定义的环境变量,各位可以自行指定。

阅读更多...

两群羊的博弈论

分类:散文阅读 - 科普阅读 | 阅读(2577) | 发布于:2018-09-07 20:15 | 标签:无

上帝把两群羊放在草原上,一群在东,一群在西。
上帝还给羊群找了两种天敌,一种是老虎,一种是狼.上帝对羊群说:“如果你们要狼,就给一只,任它随意咬你们。 如果你们要老虎,就给两头,你们可以在两头老虎中任选一头, 还可以随时更换。”
东边那群羊想,老虎凶猛,还是要狼吧。
它们要了一只狼。
西边那群羊想,老虎虽然凶猛,但我们有选择权。
它们就要了两头老虎。
那只狼进了东边的羊群后,就开始吃羊。
狼小食量小。西边那群羊挑选了一头老虎,另一头则留在上帝那里。
这头老虎进入羊群后, 开始吃羊,而且食量惊人。
这样羊群就天天都要被追杀。羊群赶紧请上帝换一头老虎。
不料,上帝保管的那头老虎一直没有吃东西,正饥饿难耐,它扑进羊群,比前面那头老虎咬得更疯狂。
羊群一天到晚只是逃命。
东边的羊群庆幸自己选对了天敌,又嘲笑西边的羊群没有眼光。
西边的羊群非常后悔,要求更换天敌,改要一只狼。
上帝说:“天敌一旦确定,就不能更改。”
西边的羊群只好把两头老虎不断更换,换哪一头都比南边的羊群悲惨得多,它们索性不换了,让一头老虎吃得膘肥体壮,另一头老虎则饿得精瘦。
眼看那头瘦老虎 快要饿死了,羊群才请上帝换一头。
这头瘦老虎经过长时间的饥饿后,慢慢悟出了一个道理:自己虽然凶猛异常,一百只羊都不是对手,可是自己的命运是操纵在羊群手里的。
羊群随时可以把自己送回上帝那里,让自己饱受饥饿的煎熬,甚至有可能饿死。
想通这个道理后,瘦老虎就对羊群特别客气,只吃死羊和病羊。
羊群喜出望外,有几只小羊提议干脆固定要瘦老虎,不要那头肥老虎了。
一只老公羊提醒说:“瘦老虎是怕我们送它回上帝那里挨饿,才对我们这么好。万一肥老虎饿死了,我们没有了选择的余地,瘦老虎很快就会恢复凶残的本性。”
羊群觉得老羊说得有理,为了不让另 一头老虎饿死,它们赶紧把它换回来。
原先膘肥体壮的那头老虎,已经饿得只剩下皮包骨头了,并且也懂得了自己的命运是操纵在羊群手里的道理。
为了能在草原上待久一点,它竟百般讨好起羊群来。西边的羊群终于过上了自由自在的生活。
东边的那群羊的处境却越来越悲惨了,那只狼因为没有竞争对手,羊群又无法更换它,它就胡作非为,每天都要咬死几十只羊, 这只狼早已不吃。
羊肉了,它只喝羊心里的血。它还不准羊叫, 哪只叫就立刻咬死哪只。
东边的羊群哀叹:“早知 道这样,还不如要两头老虎。”
算是博弈论里面比较经典的

阅读更多...

信任和不辜负信任

分类:散文阅读 - 科普阅读 | 阅读(2434) | 发布于:2018-09-07 20:15 | 标签:无

大雁与人同飞的视频,有以下注释:第一次看见这个视频时以为就是一段特技剪辑的作品而已。原来这是一部真人真事的电影《伴你高飞》,讲的是一个14岁的加拿大女孩领着16只小雁南飞的故事。
小女孩艾米在树丛里发现了16只刚刚破壳的小野雁,它们把艾米当成了妈妈(第一个见到的动物),将艾米团团围住,艾米去哪儿,就跟到哪儿。
从此艾米就当上了“雁妈妈”,和父亲(滑翔机爱好者)一起照顾着这些小雁。
时间过得很快,小雁渐渐长大。
问题是,小雁并不是长大后自己就能飞行,必须得到父母的指导,到了秋天,它们只有跟随父母飞行,才能顺利迁徙到南方。
怎么办?
艾米的父亲突发奇想:制作一台飞行速度和大雁相当的滑翔机,用滑翔机教它们飞翔。
可是,这群小雁只是拍了几下翅膀,依然留在地上:它们只认艾米。
于是,艾米父亲又做了个疯狂的决定:把小艾米训练成一名飞行员,由艾米领着野雁飞去南方。
艾米父亲还找到鸟类专家,设计了迁徙的路线,
中间历经曲折,也有很多趣事,……
这是从未有人做过的尝试,这是大多数人想都不敢想的旅程:两个人、两架飞机、16只大雁,从加拿大飞到美国……
让人欣慰的是,第二年春天,艾米的雁群自行北返,全部16只,都回到了艾米家的阳台。

阅读更多...

Redis 分库

分类:技术文档 - Linux | 阅读(2883) | 发布于:2018-07-24 15:35 | 标签:无

Redis 可以分库,相当于 MySQL 中的 database。控制数据库总数在 redis配置文件中设置,默认是 16 个。数据库名称是整数索引标识,而不是由一个数据库名称字符串。

选择数据库用 select 命令
redis>select 2
OK 

reidis 中的操作,默认是 数据库 0;
每个数据库都有属于自己的空间,不必担心数据库之间的key冲突。

阅读更多...

mysql中日期类型DATETIME和TIMESTAMP的区别

分类:技术文档 - MySQL | 阅读(3039) | 发布于:2018-05-11 10:27 | 标签: DATETIME TIMESTAMP

在实际应用的很多场景中,mysql的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。

1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。

2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。

3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。

4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。

阅读更多...

Ubuntu下netBeans字体有锯齿解决办法

分类:技术文档 - Linux | 阅读(3136) | 发布于:2018-05-08 11:06 | 标签: 锯齿 netbeans

编辑netBeans配置文件,“/home/lxc/netbeans-8.2/”为安装路径,根据个人情况替换。

mangniao@Jenny:~$ sudo gedit /home/lxc/netbeans-8.2/etc/netbeans.conf

查找“netbeans_default_options”,在结尾处添加

 -J-Dswing.aatext=true -J-Dawt.useSystemAAFontSettings=on

注意:参数要添加到双引号内部。

保存,重启netBeans,这样就去掉了难看的锯齿,

阅读更多...