本文简要介绍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
的文档。
相关用法
- Ruby PStore.commit用法及代码示例
- Ruby PStore.abort用法及代码示例
- Ruby PStore.[]=用法及代码示例
- Ruby PrettyPrint.current_group用法及代码示例
- Ruby Pathname.<=>用法及代码示例
- Ruby Pathname.children用法及代码示例
- Ruby Process.groups用法及代码示例
- Ruby Process.wait2用法及代码示例
- Ruby Process.getpgrp用法及代码示例
- Ruby Proc.eql?用法及代码示例
- Ruby PTY.open用法及代码示例
- Ruby PrettyPrint.genspace用法及代码示例
- Ruby PKey.sign_raw用法及代码示例
- Ruby Profiler模块用法及代码示例
- Ruby Process.setproctitle用法及代码示例
- Ruby PPMethods.comma_breakable用法及代码示例
- Ruby Process.setrlimit用法及代码示例
- Ruby Proc.prc ==用法及代码示例
- Ruby Profiler.raw_data用法及代码示例
- Ruby Process.uid用法及代码示例
- Ruby Pathname.descend用法及代码示例
- Ruby Process.pid用法及代码示例
- Ruby Proc.ruby2_keywords用法及代码示例
- Ruby Pathname.getwd用法及代码示例
- Ruby PKey.generate_parameters用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 PStore类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。