Lumen 基于 Laravel 打造,专为构建微服务和 APIs 而生。Lumen与Redis服务端通信可通过Predis(PHP库)或者PhpRedis(PHP的C扩展)来实现,建议使用PhpRedis,其性能更高。Lumen下使用Predis和PhpRedis都需引入illuminate/redis(PHP库),illuminate/redis(PHP库)都对Predis和PhpRedis(Laravel 5.3以上)进行了很好的封装,但illuminate/redis(PHP库)又依赖predis/predis(PHP库),故安装 illuminate/redis时会自动引入predis/predis(PHP库)。
Redis 与 Memcached 均为常用的 key-value 分布式内存对象缓存系统,可提供数据缓冲和数据共享能力,Redis 支持持久化,而 memcached 不支持持久化,发生重启后数据不会自动恢复。
关于Memcached:
- memcached基于hashmap来实现对内存对象的创建与管理,容量(哈希表中桶的数量)和加载因子(容量自动增加之前可以达到多满的一种尺度)影响其性能。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash (重建内部数据结构),从而哈希表将具有大约两倍的桶数。在Java编程语言中,加载因子默认值为0.75,默认哈希表元为101。
;
- memcached如果运行在默认状态下,应放置在防火墙后端;
- 在内置空间被占满之后,memcached采用Least Recently Used(LRU)机制替换掉旧的内容;
- 基于libevent的事件处理,运行多线程处理多客户端并发连接请求,虽说也支持分布式,但服务端并没有分布式功能,彼此不能互相通信,完全依赖于客户端实现,故障转移也不提供冗余节点,一旦某节点发生故障将导致相应的数据不可用;
- 客户端libmemcached可采用多种哈希算法(MD5、CRC等)计算key,对非标量类型数据如数组、对象(非资源类型才能被序列化)等将先进行序列化然后再发送给服务端,支持Multi操作;
- CAS(Check And Set)是Memcached中比较方便的一种防止竞争修改资源的方法
A 64bit "CAS" value, which is kept unique.
- 支持文本协议和二进制协议两种主要的协议。此外,还支持子协议SASL Authentication、Range operations。相关信息参考 https://github.com/memcached/memcached/wiki
下边这段是关于文本协议“noreply”的描述,同时建议使用二进制协议:
Most ASCII commands allow a "noreply" version. One should not normally use this with the ASCII protocol, as it is impossible to align errors with requests. The intent is to avoid having to wait for a return packet after executing a mutation command (such as a set or add). The binary protocol properly implements noreply (quiet) statements. If you have a client which supports or uses the binary protocol, odds a