Elixir新手使用Nebulex创建本地缓存时遇ArgumentError错误求助
解决Nebulex本地缓存初始化错误:ArgumentError在:ets.lookup_element
问题复现
你尝试创建Panda.Cache本地缓存,执行以下代码时触发了错误:
data = %{id: 1, text: "hello"} Mycache.set(data[:id], data) # 这里大概率是笔误,应该调用的是Panda.Cache?
对应的错误信息:
** (ArgumentError) argument error
(stdlib) :ets.lookup_element(Panda.Cache, :metadata, 2)
(nebulex) lib/nebulex/adapters/local/metadata.ex:19: Nebulex.Adapters.Local.Metadata.get/1
(nebulex) lib/nebulex/adapters/local.ex:177: Nebulex.Adapters.Local.set/4
(panda) lib/panda...
问题根源
这个错误的核心是Nebulex缓存进程还没启动——Nebulex本地缓存依赖ETS表存储元数据和缓存内容,进程未启动时ETS表根本不存在,自然会导致:ets.lookup_element找不到目标表和:metadata键。
一步步解决
按照下面的步骤就能搞定这个问题:
确保缓存模块定义正确
你的Panda.Cache模块必须正确引入Nebulex的缓存行为,并指定本地适配器:defmodule Panda.Cache do use Nebulex.Cache, otp_app: :panda, adapter: Nebulex.Adapters.Local end添加缓存配置项
在config/config.exs里给缓存加上基础配置(参数可以根据自己的需求调整):config :panda, Panda.Cache, gc_interval: 86_400_000, # 24小时自动清理过期缓存 max_size: 1000, # 缓存允许存储的最大条目数 allocated_memory: 2_000_000 # 缓存可用内存上限(2MB)启动缓存进程
Nebulex是基于OTP进程的,必须启动才能工作,有两种启动方式:- 随应用自动启动:在
lib/panda/application.ex的子进程列表中加入缓存,这样每次启动应用时缓存会自动启动:defmodule Panda.Application do use Application @impl true def start(_type, _args) do children = [ Panda.Cache # 把缓存加入子进程列表 ] Supervisor.start_link(children, strategy: :one_for_one) end end - 手动启动(测试用):如果只是在iex里临时测试,可以直接调用启动函数:
Panda.Cache.start_link()
- 随应用自动启动:在
重新执行缓存操作
确认缓存启动后,修正可能的模块名笔误,再执行你的set操作:data = %{id: 1, text: "hello"} Panda.Cache.set(data.id, data)
额外小提示
- 如果是在iex中测试,记得用
iex -S mix启动,这样应用会自动加载并启动缓存进程。 - 检查模块名拼写:你代码里的
Mycache应该是Panda.Cache的笔误,这也可能是问题的诱因之一哦。
内容的提问来源于stack exchange,提问作者Aboozar Rajabi
相关产品推荐
相关产品推荐

