在什么情况下你应该序列化数据?什么时候不应该?

med*_*iev 2 php python serialization

我知道序列化用于将数据类型转换为可存储的格式,用于缓存等目的.

我更具体地问的是,你应该在什么情况下实际决定存储数据(serialize()在PHP中使用,pickle在Python中使用模块等)?

假设我们有一个流量很大的网站,在我们的/blog页面中,我们使用静态内容xml文件,gettext mo文件和动态生成的数据库内容.

示例#1:

我们依赖静态内容的文件是en/blog.xml:

'<content><![CDATA[
<h1>Welcome to my blog!</h1>
<p>Lorem ipsum dolor sit amet..</p>

]]></content>'
Run Code Online (Sandbox Code Playgroud)

我们想要自己序列化这个xml文件并将其存储在缓存中吗?

示例#2:

我们还有一个动态生成的表单,通常我会假设我不会序列化任何东西,因为它是服务器端生成的和动态的,但我们的表单字段标签是国际化的,用户请求这个页面用西班牙语,因此我们使用的是翻译类.抓取以mo/csv/xml格式存储的表单字段标签.

内容contact-us.php:

<label for="first_name"><?php echo $L->_("First Name");?></label>
<input id="first_name" name="first_name" type="text">
Run Code Online (Sandbox Code Playgroud)

"First Name"消息id转换从应用程序级转换文件中提取,我们将其解析并存储在驻留在我们的转换类中的数组中.因此,我们的代码mo在每个页面请求上都不解析文件,而不是在解析mo之后序列化整个数组,然后依赖于序列化的转储,这将是理想的选择.

示例#3:

让我们在我们的博客页面上说我们正在阅读最近的5篇博文.

$posts = BlogClass->sql('SELECT blog_message, blog_author FROM blog_posts LIMIT 5 ORDER BY blog_date DESC');
Run Code Online (Sandbox Code Playgroud)

我们是否希望依赖于memcache之类的东西,只需设置一个键到sql语句的结果,它会序列化查询的结果,还是?

奖金:

如果有人能够提供有效/实际使用/错误使用序列化的具体示例,那就太好了 - 就像一个多页面,巨大的形式,可以提取数据库信息并将内容存储在会话中,或者任何示例你不得不依赖序列化..

hob*_*ave 5

例1

轮廓.

  • 生成内容页面的代价是否过高?
  • 反序列化生成的内容会降低成本吗?

如果两个答案都是肯定的,请考虑一下.

例2

轮廓.

  • 生成内容页面的代价是否过高?
  • 反序列化生成的内容会降低成本吗?

如果两个答案都是肯定的,请考虑一下.

例3

轮廓.

  • 这个查询是否过于昂贵?
  • 从memcached中获取数据要快得多吗?

如果两个答案都是肯定的,请考虑一下.

奖金

我从不会因为可以而序列化我的数据.我需要有理由这样做,否则它只是过早的优化.决定是否应该这样做有几个因素.

对序列化数据集执行排序或其他操作

这几乎总是一个坏主意.例如,如果您从数据库中序列化结果集,然后需要通过某个字段重新排序此设置,那么您就是在自己的脚下拍摄.

消息

如果您需要将序列化数据传递给其他服务/语言,那么选择序列化至关重要.如果我知道或认为其他事情可能需要阅读它,我会避免使用特定于语言的方法进行序列化.JSON通常是跨语言序列化的理想格式.

更新序列化数据

您必须愿意重新生成序列化数据以更新其源.对序列化数据进行任何类型的复杂更新将是非常昂贵的.

人类可读性

如果您需要轻松阅读,我建议您避免使用特定于语言的格式.我建议使用JSON.

编辑:

我再次查看示例3中的查询.这是一个非常简单的查询,您只选择2个字段,并按日期字段排序.使用正确索引的表,此查询应该是微不足道的,我不建议将这样的内容缓存到memcached中.