文档章节

不要开启 php redis 扩展的自动序列化选项

anoty
 anoty
发布于 08/09 15:37
字数 465
阅读 304
收藏 2

php redis 扩展有自动序列化选项,在存储kv数据的时候,可以少写点代码就打开了,使用的过程中忽然发现了一个令人郁闷的地方。

扩展没有对你要存储的值做类型判断,任何类型的值都做了自动序列化,比如下面这段代码


$rd = new Redis();
$r = $rd->connect(
    '127.0.0.1', 6379, 1
);
$rd->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
$rd->set('k', 1);
var_dump($rd->incr('k'));
echo $rd->getLastError(), PHP_EOL;
echo $rd->get('k');

你存储了一个int进去,然后在incr,就会失败


bool(false)
ERR value is not an integer or out of range

1

直接用redis-cli去看下,发现,value 被序列化了


127.0.0.1:6379> get k

"i:1;"

这是php redis 扩展序列化的部分代码(在源码包的library.c),你会发现,这个序列化并没有像memcached扩展一样做类型判断,而是全部序列化。


PHP_REDIS_API int
redis_serialize(RedisSock *redis_sock, zval *z, char **val, strlen_t *val_len
                TSRMLS_DC)
{
    ……
    switch(redis_sock->serializer) {
        case REDIS_SERIALIZER_NONE:
        ……
        case REDIS_SERIALIZER_PHP:
#if ZEND_MODULE_API_NO >= 20100000
            PHP_VAR_SERIALIZE_INIT(ht);
#else
            zend_hash_init(&ht, 10, NULL, NULL, 0);
#endif
            php_var_serialize(&sstr, z, &ht);
#if (PHP_MAJOR_VERSION < 7)
            *val = estrndup(sstr.c, sstr.len);
            *val_len = sstr.len;
#else
            *val = estrndup(ZSTR_VAL(sstr.s), ZSTR_LEN(sstr.s));
            *val_len = ZSTR_LEN(sstr.s);
#endif
            smart_str_free(&sstr);
#if ZEND_MODULE_API_NO >= 20100000
            PHP_VAR_SERIALIZE_DESTROY(ht);
#else
            zend_hash_destroy(&ht);
#endif
            return 1;
        case REDIS_SERIALIZER_IGBINARY:
        ……

    }
    return 0;
}

看来php redis 这扩展出来这么久,用户量这么大,但是文档都没进到php官方文档,也不是没有原因的。

更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号:PHP架构师

© 著作权归作者所有

共有 人打赏支持
anoty
粉丝 25
博文 42
码字总数 26186
作品 0
浦东
私信 提问
Redis windows下安装

1.安装 (1)windows把redisbinx64安装包放在电脑任意的盘里 (2)通过cmd找到对应目录: Dredisbinx64 (3)开始启动redis服务 Dredisbin_x64redis-server.exe 代表的redis安装成功 (4)开启redis客...

方花
04/24
0
0
redis和memcache的区别

memcache官方定义 Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications ......

山鹰sniper
2014/07/16
0
0
Linxu下Redis+PHP扩展的安装和Redis集群的配置【转】

redis下载: http://redis.io/download 多台服务安装: http://www.vquickphp.com/?a=blogview&id=30 开机加自启动:echo "redis-server /thepathtoredis_conf/redis.conf" >>/etc/rc.local......

big_cat
2015/07/07
0
0
本地缓存库--libshmcache

libshmcache是基于共享内存的本地缓存库,可以在多个非亲缘关系的进程间共享缓存。libshmcache写有锁,读无锁,性能非常高。libshmcache直接访问本地共享内存,速度比远程接口如redis快100倍...

fastdfs
2017/03/08
268
0
linux下安装redis扩展

首先 下载redis linux: http://download.redis.io/releases/redis-3.0.5.tar.gz windows: https://github.com/dmajkic/redis/downloads windos下 安装好redis后直接启动 启动后注意欢迎界面不......

bo-少
2015/12/08
62
0

没有更多内容

加载失败,请刷新页面

加载更多

初探Spring Cloud(一)

1. 什么是Spring Cloud? Spring提供了一系列工具,可以帮助开发人员迅速搭建分布式系统中的公共组件(比如:配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,...

__HuWei
9分钟前
0
0
Mac配置ssh免密钥登录

Mac终端每次使用ssh -p 22 user@ip登录很是麻烦,下面介绍配置ssh免密钥登录: cd ~/.ssh下创建conf文件,写入以下配置: Host test HostName ip Port 22 IdentityFile /Users/t/key/test.p...

littlemesieV
24分钟前
1
0
Spark2.0操作ES

ES提供了支持包来方便的操作ES。首先添加ES的依赖maven: <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>6.2.0</ver......

守望者之父
26分钟前
1
0
专业术语

1、防御性编程 DruidDataSource类有一个init方法,我们在spring中配置druid时,都会指定 init-method='init'. 而且DruidDataSource也在其他地方,诸如getConnection()方法里作了防御性编程, 也就...

still5656
28分钟前
1
0
微信开发--测试账号相关

1、微信公众平台选择代码开发后,其平台上的部分功能会不可用 可在开发者工具中选择开通测试账号,进行相关的功能调试(测试账号出微信支付不可调试外,其他功能基本上都可以调试) 2、测试账号...

Code辉
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部