文档章节

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

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

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
粉丝 15
博文 28
码字总数 18749
作品 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
Redis 安装及配置 (转整理)

Redis 安装及配置 (转整理) Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合...

rootliu
05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

移除或自定义 WordPress 仪表盘欢迎面板

第一次登录 WordPress 后台仪表盘页面,默认都会显示 WordPress 的欢迎面板: 如果我们要移除这个面板,在主题的 functions.php 中添加下面的代码即可: 12 //移除 WordPress 仪表盘欢迎面...

james_laughing
11分钟前
0
0
HashMap实现原理及源码分析

HashMap实现原理及源码分析   哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,...

DemonsI
15分钟前
0
0
eggjs学习笔记

快速初始化 生成项目(要求最低的node版本8.x) npm i egg-init -gegg-init egg-example --type=simplecd egg-examplenpm i 启动项目 npm run dev 配置 环境配置会覆盖默认配置 config...

别人说我名字很长
18分钟前
1
0
Winform Timer控件时间间隔

sender as System.Timers.Timer).Interval = 23 * 60 * 60 * 1000.0;//将时间间隔改为23小时,23小时后重新发生timer_Elapsed事件。 //60000:时间间隔1分钟,300000:时间间隔5分钟,600000:...

笑丶笑
18分钟前
0
0
在win10系统下怎样快速切换任务视图

切换窗口:Alt + Tab 任务视图:Win + Tab (松开键盘界面不会消失) 切换任务视图:Win + Ctrl +左/右 创建新的虚拟桌面:Win + Ctrl + D 关闭当前虚拟桌面:Win + Ctrl + F4...

SummerGao
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部