当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby PStore类用法及代码示例


本文简要介绍ruby语言中 PStore类 的用法。

PStore 实现了基于 Hash 的基于文件的持久性机制。用户代码可以按名称(键)将 Ruby 对象(值)的层次结构存储到数据存储文件中。对象层次结构可能只是一个对象。用户代码稍后可能会根据需要从数据存储中读回值,甚至更新数据。

事务行为确保任何更改一起成功或失败。这可用于确保数据存储不会处于临时状态,其中一些值已更新但其他值未更新。

在幕后,Ruby 对象使用 Marshal 存储到数据存储文件中。这具有通常的局限性。例如, Proc 对象无法编组。

使用示例:

require "pstore"

# a mock wiki object...
class WikiPage
  def initialize( page_name, author, contents )
    @page_name = page_name
    @revisions = Array.new

    add_revision(author, contents)
  end

  attr_reader :page_name

  def add_revision( author, contents )
    @revisions << { :created  => Time.now,
                    :author   => author,
                    :contents => contents }
  end

  def wiki_page_references
    [@page_name] + @revisions.last[:contents].scan(/\b(?:[A-Z]+[a-z]+){2,}/)
  end

  # ...
end

# create a new page...
home_page = WikiPage.new( "HomePage", "James Edward Gray II",
                          "A page about the JoysOfDocumentation..." )

# then we want to update page data and the index together, or not at all...
wiki = PStore.new("wiki_pages.pstore")
wiki.transaction do  # begin transaction; do all of this or none of it
  # store page...
  wiki[home_page.page_name] = home_page
  # ensure that an index has been created...
  wiki[:wiki_index] ||= Array.new
  # update wiki index...
  wiki[:wiki_index].push(*home_page.wiki_page_references)
end                   # commit changes to wiki data store file

### Some time later... ###

# read wiki data...
wiki.transaction(true) do  # begin read-only transaction, no changes allowed
  wiki.roots.each do |data_root_name|
    p data_root_name
    p wiki[data_root_name]
  end
end

交易方式

默认情况下,只有在操作系统(和底层硬件)不引发任何意外 I/O 错误的情况下,才能确保文件完整性。如果在 PStore 写入文件时发生 I/O 错误,则文件将损坏。

您可以通过设置 pstore.ultra_safe = true 来防止这种情况。但是,这会导致轻微的性能损失,并且仅适用于支持原子文件重命名的平台。有关详细信息,请参阅ultra_safe 的文档。

不用说,如果您使用 PStore 存储有价值的数据,那么您应该不时备份 PStore 文件。

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 PStore类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。