ERP 系统优化之客户信息、联系人信息缓存之把数据放入 Redis 缓存

最近写的这些文章都是对在职的时候的一些经验的总结。 说到内存缓存我想很多人肯定会想想到 Redis 和 Memcache 这两个内存数据库。Redis 和 Memcache 的共同之处都是将数据存放在内存中,都支持一主多从,都支持过时设置。 不同之处在于 Memcache 除了k/v类型的数据外还支持缓存其他东西,如图片等。 Redis 不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等更丰富数据结构的存储。 Memcache 挂了后数据会丢失,而Redis则可以通过aof恢复数据(当然,这个恢复是要点时间的)。 两者的使用场景也一般不太一样,Redis 出来作为 NoSQL 数据库使用外,还能用做消息队列、数据堆栈和数据缓存等。 Memcached 适合于缓存 SQL 语句、数据集、用户临时性数据、延迟查询数据和session等。 为什么要做缓存优化? 因为每天早上的8:30 ~ 11:00 下午 2:00 ~ 4:00是员工使用ERP的高峰期,这时候的数据库的读写量很大,然后给 MySQL 就开始很吃力。 这里从数据的稳定性和数据类型的支持程度来看,我们选择使用 Redis ,因为我们需要使用了计数器,队列等功能。 既然是优化,那么我们首先从读写最频繁的数据表开始进行做优化,当前ERP里面的 客户信息(xx_client) 表和 客户联系人(xx_client_contact) 信息表,这两张表的读写是最频繁的。 所以经过衡量,我们觉得把这两张表的信息放到 Redis 里面去。 数据在查询的时候首先从 Redis 里面取数据,当 Redis 没有数据的时候再从 MySQL 里面取数据。 数据的增删改,这个我们维护一套 DB 的解决方案,在数据进行 MySQL 增删改操作的时候,同时对 Redis 进行增删操作。 下面我们来按步骤来开始进行: 如何把...

[阅读更多 →]

Redis 高级特性 Pipeline (管道) 使用和基本测试

都说 Pipeline 有很大好处,但是能量是守恒的,好坏也是相对的。 所以我们主要来测试看看 Pipeline 的利弊。 带着几个问题我们来进行基本的测试。

  1. Pipeline 对命令数量是否有限制?
  2. Pipeline 打包执行多少命令合适?
  3. Pipeline 批量执行的时候,是否对Redis进行了锁定,导致其他应用无法再进行读写?

Redis 常规使用方式

我们都知道Redis 是单线程的,那么在常规使用情况下,我们使用 Redis ,如下代码执行是什么流程呢?

$key1 = "abc1"; $key2 = "abc2"; $key3 = "abc3"; $redisObj->set($key1, 1); $redisObj->set($key2, 2); $redisObj->set($key3, 3);

Redis 的执行方式是逐条命令: 发送命令->执行->返回执行结果。

如图:

什么是 pipeline 呢?

知道了常规的使用方式,那么我们再来看看 pipeline 模式,pipeline 模式则是将执行的命令写入到缓冲中,最后由exec命令一次性发送给redis执行返回。

我们以灌一个list来进行测试,以20000条list数据为例,来对比一下常规模式的的写入和 pipeline 模式的写入。

Redis pipeline 的执行方式: 打包开始->缓存->打包结束->发送->执行->返回执行结果。

如图:

逐条写模式(常规模式)

<?php $redisObj = new \Redis(); $redisObj->connect('127.0.0.1', 6379);

$t...

[阅读更多 →]