首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

获取错误在Rails中使用memcached时无法修改冻结对象

在Rails中使用memcached时,如果遇到无法修改冻结对象的错误,可能是由于Rails的缓存机制导致的。Rails默认使用Marshal序列化对象进行缓存,而Marshal序列化后的对象是冻结的,无法修改。

要解决这个问题,可以尝试以下几种方法:

  1. 使用ActiveSupport::Cache::MemCacheStore替代默认的缓存存储器。ActiveSupport::Cache::MemCacheStore使用的是Dalli gem,它支持在缓存中存储冻结对象。你可以在config/environments/production.rb文件中进行配置:
代码语言:ruby
复制
config.cache_store = :mem_cache_store, 'memcached-server-address'
  1. 如果你仍然想继续使用默认的缓存存储器,并且需要修改冻结对象,可以尝试使用Rails的缓存读取和写入方法的副本进行修改。例如,使用Rails.cache.read方法获取缓存对象的副本,然后进行修改后再使用Rails.cache.write方法写回缓存。
代码语言:ruby
复制
# 读取缓存对象的副本
cached_object = Marshal.load(Marshal.dump(Rails.cache.read('cache_key')))

# 修改副本
cached_object.some_attribute = 'new_value'

# 将修改后的副本写回缓存
Rails.cache.write('cache_key', cached_object)
  1. 如果以上方法仍然无法解决问题,可以考虑使用其他缓存存储器,如Redis。Redis支持存储冻结对象,并且在Rails中有很好的支持。你可以使用redis-rails gem来集成Redis缓存存储器。

以上是解决在Rails中使用memcached时无法修改冻结对象的几种方法。根据具体情况选择合适的方法进行处理。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么不能用Memcached存储Session?

第一篇文章给出的理由大致是说,如果用memcached存储Session,那么当memcached集群发生故障(比如内存溢出)或者维护(比如升级、增加或减少服务器),用户会无法登录,或者被踢掉线...一旦slab满了,即使更大的slab还有空间,数据也会被回收,而不是放入更大的slab……特定的slab,Session最老的用户将会掉线。...不过,由于memcached的LRU算法是局部的,那种方式不仅导致内存使用率不高,而且也无法消除用户因为Session回收而出现随机掉线的风险。...“set”到memcached,并写入数据库; Session增加一个字段,标识Session最后写入数据库的时间; 每个页面加载的时候,优先从memcached读取Session,其次从数据库读取...; 每加载N页或者Y分钟后,再次将Session写入数据库; 从数据库获取过期Session,优先从memcached获取最新数据。

61420

云原生应用的12要素

需要指出的是,这里定义的“配置”并不包括应用的内部配置,比如 Rails 的 config/routes.rb,或是使用 Spring 代码模块间的依赖注入关系 。...对应用程序而言,两种都是附加资源,通过一个 url 或是其他存储 配置的服务定位/服务证书来获取数据。...构建时会使用指定版本的代码,获取和打包 依赖项,编译成二进制文件和资源文件。 发布阶段 会将构建的结果和当前部署所需 配置 相结合,并能够立刻在运行环境投入使用。...Beanstalkd, Redis 缓存 Ruby/Rails ActiveSupport::Cache Memory, filesystem, Memcached 开发人员有时会觉得本地环境中使用轻量的后端服务具有很强的吸引力...例如,本地使用 SQLite 线上使用 PostgreSQL;又如本地缓存在进程内存而线上存入 Memcached

4.3K110
  • 云原生概念

    需要指出的是,这里定义的“配置”并不包括应用的内部配置,比如 Rails 的 config/routes.rb,或是使用 Spring 代码模块间的依赖注入关系 。...对应用程序而言,两种都是附加资源,通过一个 url 或是其他存储 配置的服务定位/服务证书来获取数据。...构建时会使用指定版本的代码,获取和打包 依赖项,编译成二进制文件和资源文件。 发布阶段 会将构建的结果和当前部署所需 配置 相结合,并能够立刻在运行环境投入使用。...Beanstalkd, Redis 缓存 Ruby/Rails ActiveSupport::Cache Memory, filesystem, Memcached 开发人员有时会觉得本地环境中使用轻量的后端服务具有很强的吸引力...例如,本地使用 SQLite 线上使用 PostgreSQL;又如本地缓存在进程内存而线上存入 Memcached

    4.3K51

    DevOps工具介绍连载(48)——静态扫描工具Brakeman

    有时结果会奇怪地变成nil并导致间歇性错误。注意,只有JRuby上使用实线程才会弹出此窗口。 现在CallIndex冻结的结果有助于防止将来对共享数据进行这种修改。...变化 降价的信心 由于先前的重构,Markdown报告未提供置信度。 变化 报告比较修复 由于存在一个非常老的错误,当将带有某些警告的旧报告与带有零警告的新报告进行比较,旧警告未报告为已修复。...将识别出更多的情况,特别是当它是方法调用的目标。 更多范围 无论检测到Rails的版本如何,都将处理named_scope和scope。...2.7冻结错误 将发布日期添加到CHANGES(TheSpartan1980)的每个版本 文件权限 报告了ruby_parser-legacygem的安全问题,该文件安装了具有世界可写权限的某些文件...Ruby 2.7冻结字符串 Ruby 2.7,符号和其他一些常量值(true/ false等)将返回冻结的字符串。这仅以较小的方式影响了Brakeman,但现在已修复,以准备Ruby 2.7。

    2.2K10

    面试官:请你介绍一下let const Object.freeze() ,set和get

    如果你有一个巨大的数组或Object,并且确信数据不会修改使用Object.freeze()可以让性能大幅提升。 Object.freeze() 方法可以冻结一个对象。...一个被冻结对象再也不能被修改冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。...打印输出还是2 ,属性a的值不能被改变 解析:writable:false 可以看作为属性不可改变,严格模式("use strict";)下,引擎会抛出TypeError的异常,这表示我们无法修改一个不可写的属性...configurable:只要属性是可配置的,就可以使用 defineProperty(...)方法来修改属性描述符 注意⚠️ false情况下,如果修改,不管是不是严格模式,都会抛出TypeError...,但可以正常访问他 属性描述符上面有介绍,最后介绍下访问描述符 定义对象,加入访问描述符: ?

    64330

    尝试使用Memcached遇到的狗血问题

    因为默认的Memcached配置,使用了本机ip:127.0.0.1 ,此时利用VI修改下配置 vi /etc/memcached.conf 文件打开后,修改下,把-l前面加入#号注释掉,重启服务器就可以了...第一步好了,接下来就是程序的改写了 Memcached Client的使用 Client选择上,我用了Enyim.Cache,@dudu推荐滴,不过已经好久没更新了,我在其github上下载的源码,在编译出现了强名称的错误...Enyim使用起来很简单,只要在config配置好Memcached的地址及端口,就能利用MemcachedClient类进行操作了。...尝试了把几个Enumerable转换成List后,问题解决了,但程序好多地方都这样写的,想想目前公司不会转到Memcached,随后放弃了后面的修改,因为我的目的仅仅是玩一下而已,呵呵。...今天不是教程,仅仅是开发遇到的各类问题,自己琢磨这解决,使用第三方的模块,请尽量下载其源代码,对您会有帮助的。

    96350

    【BlackHat 2017 议题剖析】连接的力量:GitHub 企业版漏洞攻击链构造之旅

    HTTP 与 HTTPS 方案 缺少 302 重定向 faraday 缺少 CR-LF 注入 无法控制 POST 数据与 HTTP 报头 目前唯一可控的是 Path 部分。...使用 shutdown 命令的过程,Elasticsearch 根本不考虑 POST 数据的具体细节。...可以看到,Graphite 收到用户输入的 url 后直接进行获取。因此,我们可以使用首个 SSRF 触发第二个 SSRF,并将它们并入到 SSRF 执行链。...我们用 SSRF 执行链 Memcached 存储恶意 Ruby 对象。待到 GitHub 再次获取缓存,Ruby Gem mecached 将自动对数据进行反序列化操作。...XD Rails 控制台中的不安全 Marsal irb(main):001:0> GitHub.cache.class.superclass => Memcached::Rails irb(main

    1.2K160

    Redis7种集合类型应用场景

    使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。...除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置及获取字符串的某一位...(bit) 批量设置一系列字符串的内容 Hashs Memcached,我们经常将一些结构化的信息打包成hashmap,客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候需要修改其中某一项...---- Previous 阻止iOS设备锁屏 Next 使用rvmMac安装ruby...和rails

    33930

    一文详解 WordPress 中使用 Memcached 的常见问题

    PHP Memcached 扩展基于 libmemcached 开发的,使用 libmemcached 库提供的 API 与 Memcached 服务进行交互,只支持面向对象的接口,2009年才实现,...这是因为 object-cache.php 是使用 WordPress 的表前缀($table_prefix)来区分不同站点在内存的缓存的。...如果你同个服务器多个 WordPress 网站的表前缀都相同,都是默认的 wp_,那么 object-cache.php 就无法区分是哪个站点了。 有两个解决方法: 1. ...Memcached 。...但是使用函数 wp_cache_get 去获取的时候,总是返回 null,最后查手册才发现,Memcahced 设置过期时间要注意特殊情况: 缓存过期时间是一个 Unix 时间戳,也可以是一个从现在算起的以秒为单位的数字

    52620

    Rails存储库从SVN转向Git

    版本存储库迁移的同时,我们也会将问题跟踪系统转移到基于Rails开发的Lighthouse应用之上,于是到目前为止,我们的存储库和问题跟踪系统都是使用Rails应用,这对我们是一个很好的鼓励。...代码存储库迁移之后,我们将冻结现有Subversion的存储库以及Trac问题跟踪系统。这两个系统都会保留较长一段 间,但是我们并不建议使用者再去访问它们。...Git目前最新的版本是1.5.4.5,这个版本之前的版本基础上修改了十多处Bug,并且对于部分文档进行了更新。...对于使用Git所带来的好处,国内的开发者Robin LuBlog这样评价道: 初始化非常方便...对于随便写两行代码就要放到SCM里的人来说,再合适不过。...Git ,分支管理更为容易,无论是建立新的分支,还是分支之间切换,仅有一条命令就可以完成,不需要建立多余的目录。

    1.4K90

    17Object对象

    false enumerable 当且仅当该属性的enumerable为true,该属性才能够出现在对象的枚举属性。...表示属性值可否被修改修改现有属性 当writable为false无法修改其属性。...新增属性 与修改同理当writable为false无法修改其属性。为true可以修改. ? ? 设置configurable值 Booleant值,表示目标属性的描述符是否可以被修改。...防篡改对象 定义的对象默认在任何时候、任何位置,无论有意义的还是无意义的都可以修改对象的属性或方法。而这些篡改可能会影响对象的内置属性或方法,从而导致对象的正常功能可能无法使用。...一旦将对象进行了冻结,那么该对象只能使用,不能做任何修改,包括删除 判断是否是密封对象Object.isFrozen(obj),参数同样是需要判断的对象.

    59630

    缓存之Memcached

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。...[N] 连接 将第3步获取的主机,将 k1 = "v1" 放置该服务器的内存 代码实现如下: 1 2 3 mc = memcache.Client([('1.1.1.1:12000...删除指定的一个键值对 delete_multi Memcached删除指定的多个键值对 1 2 3 4 5 6 7 8 #!..."899") Ps:本质上每次执行gets,会从memcache获取一个自增的数字,通过cas去修改gets的值,会携带之前获取的自增值和memcache的自增值进行比较,如果相等,则可以提交...,如果不想等,那表示gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改

    46630

    禁止添加属性、封闭对象冻结对象的 API

    禁止添加属性的 API ---- // 禁止在对象添加属性 Object.preventExtensions(user) // 无法对象新增属性 // 非严格模式下不会抛出错误,严格模式下会抛出错误...// user.site = 'doc.itqaq.com' // 判断是否允许可以往对象添加属性 if (Object.isExtensible(user)) { user.site = 'www.itqaq.com...封闭对象的 API 操作 ---- 封闭对象: 不能添加和删除属性,也不能修改对象的属性特征。...冻结对象的 API 操作 ---- 封闭对象: 无法添加、删除、修改属性值,也不能修改对象的属性特征。...自动修改属性特征 writable: false,configurable: false // 冻结对象 Object.freeze(user) // 判断对象有没有被冻结 true 已冻结 if (!

    71730

    挖洞经验 | 看我如何综合利用4个漏洞实现GitHub Enterprise 远程代码执行

    这是因为该SSRF漏洞存在以下几方面限制: 只支持POST方法 只允许HTTP和HTTPS方式 不产生302重定向 faraday不存在CR-LF命令注入 无法对POST数据和HTTP头信息进行控制...由于GitHub Enterprise的9200端口为绑定了一个ElasticSearch搜索服务,当使用关机命令,该ElasticSearch服务不会对POST数据进行检查,因此,我们可随意对它的REST-ful...在对大量源码的分析过程,我对GitHubMemcached存储Ruby对象的机制觉得好奇,一番研究后发现,GitHub Enterprise使用Ruby Gem的Memcached方式来处理缓存,...我们可以使用前述的SSRF漏洞执行链来把恶意Ruby对象存储Memcached,当GitHub要获取缓存,Ruby Gem memcached就会自动执行反序列化操作,这种效果就会是:哇,远程代码执行...GitHub Enterprise Rails控制端存在反序列化漏洞的Marshal: 回过头来,我们总结梳理一下整个漏洞利用过程: 第1个SSRF漏洞,用来绕过WebHook的保护机制 第2个SSRF

    1.7K60

    memcached架构及缓存策略

    服务器不关心数据本身的意义及结构,只要是可序列化数据即可;存储项由“键、过期时间、可选的标志及数据”四个部分组成 4.功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器采用相应的动作...chunk, 然后将数据缓存于其中 内存释放机制: Laxzy Expiration: Memcached每个被存取的对象都有唯一的标识符key,存取操作均通过key进行,例如可以把后端数据库的select...操作提取出来,然后对相应的SQL进行hash计算得出key,然后以这个keymemcached查找数据,如果数据不存在,说明其尚未被写入缓存,并设置一个失效时间(比如1小),失效时间内的数据都是从缓存中提取...,这样就有效地减少了数据库的压力 Least Recently Used(LRU): 删除“最近最少使用”的记录的机制;当memcached的内存空间不足,从最近未被使用的记录搜索,并将其空间分配给新的记录...;-M 参数禁止LRU功能,内存用尽memcached会返回错误,不建议使用memcached -M -m 1024

    67010

    python操作memcache

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存缓存数据和对象减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。...例如:host_list[N]; 连接将第3步获取的主机,将k1 = 'v1'放置该服务器的内存。...; delete_multi:Memcached删除指定的多个键值对。...v1 = mc.cas('product_count',"899") print(v1) 输出: 899 True 本质上每次执行gets,会从memcache获取一个自增的数字,通过cas去修改...gets的值,会携带之前获取的自增值和memcache的自增值进行比较,如果相等,则可以提交,如果不相等,那表示gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值),如此一来有可能出现非正常数据

    90810

    JavaScript的四种枚举方式

    优缺点 普通的对象枚举之所以吸引人,是因为它很简单:只要定义一个带有键和值的对象,枚举就可以了。 但是一个大的代码库,有人可能会意外地修改枚举对象,这将影响应用程序的运行。...基于Object.freeze()枚举 保护枚举对象不被修改的一个好方法是冻结它。当一个对象冻结,你不能修改或向该对象添加新的属性。换句话说,这个对象变成了只读。...JavaScript,Object.freeze()工具函数可以冻结一个对象。...代理是一个特殊的对象,它包裹着一个对象,以修改对原始对象的操作行为。代理并不改变原始对象的结构。 枚举代理拦截对枚举对象的读和写操作,并且: 当访问一个不存在的枚举值,会抛出一个错误。...然后创建超过3个实例抛出一个错误。 当然,最好让你的枚举实现尽可能的简单。枚举的目的是为了成为普通的数据结构。 总结 JavaScript,有4种创建枚举的好方法。

    48240

    JavaScript——对象的属性

    JavaScript,所有的对象都是一组属性的集合,属性可以是数值,字符串等原始类型,也可以是函数,或者是其他对象。 属性的类型 JavaScript的属性有两种类型:数据属性和访问器属性。...var o = {}; o.prop1 = "value1"; 上面的代码对象o的属性prop1即会在被赋值自动创建。...属性的特性会有一些默认值,要修改特性的默认值,必须使用Object.defineProperty方法。...对象限制 ES5提供了一系列限制对象修改的方法,按限制程度由低到高,依次有禁止扩展,密封,冻结三种模式。当然,即使是冻结模式,访问器属性的set方法仍然可正常动作,表现出来就是该属性值仍可修改。...修改已有数据属性的值(如果该属性可写) 修改已有访问器属性的值(如果有set方法) 冻结对象 通过Object.freeze方法可以将对象进行冻结,冻结后的对象无法: 添加新的属性 删除已有的属性 改变已有属性的特性

    2.4K30

    python操作缓存memcache

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。...它通过在内存缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。..."899") Ps:本质上每次执行gets,会从memcache获取一个自增的数字,通过cas去修改gets的值,会携带之前获取的自增值和memcache的自增值进行比较,如果相等,则可以提交...) Ps:本质上每次执行gets,会从memcache获取一个自增的数字,通过cas去修改gets的值,会携带之前获取的自增值和memcache的自增值进行比较,如果相等,则可以提交,如果不想等...,那表示gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改

    1.3K10
    领券