已经正确地存储到 Erlang 的 process 字典中,在存储的函数中可以get(redis_conn) 获取到,在另外的函数不能get(redis_conn)
时间: 2024-03-17 19:41:43 浏览: 19
如果在存储 Redis 连接对象的函数中可以通过 `get(redis_conn)` 获取到连接对象,但是在其他函数中无法获取连接对象,可能是因为在其他函数中的作用域(Scope)中没有定义 `redis_conn` 变量。
在 Erlang 中,变量的作用域是基于模块、函数和块(Block)的。如果变量的定义超出了其作用域,那么在其它作用域中就无法访问该变量。
因此,如果在存储 Redis 连接对象的函数中可以获取连接对象,但在其他函数中无法获取连接对象,那么可能是因为 `redis_conn` 变量的作用域仅限于存储连接对象的函数中。你可以尝试在其他函数中重新定义 `redis_conn` 变量,以便在该函数中使用。例如:
```
redis_conn = get(redis_conn),
%% 在其他函数中重新定义变量
...
```
当然,还有其他可能的原因导致在其他函数中无法获取连接对象,例如连接对象已经失效或者被其他进程/线程占用等。你可以通过打印日志或者调试代码来查找具体的原因,并采取相应的措施进行修复。
相关问题
redis_conn = get(redis_conn)这个可以获得连接对象?
事实上,这行代码是从 Erlang 的 process 字典中获取之前存储的 Redis 连接对象。
在之前的代码中,我们使用 `put(redis_conn, Pid)` 将 Redis 连接对象存储到了 process 字典中,使用的 key 为 `redis_conn`。而在另一个函数中,我们可以通过 `get(redis_conn)` 来获取之前存储的 Redis 连接对象,然后将其赋值给 `redis_conn` 变量,以便在之后的代码中使用连接对象。
需要注意的是,这里的 `redis_conn` 变量只是一个普通的变量名,与 Redis 连接对象并没有直接的关系,只是用来存储连接对象的变量名。因此,当我们通过 `get(redis_conn)` 获取到连接对象后,需要将其赋值给 `redis_conn` 变量,以便在之后的代码中使用。
正确存储了就是在其他函数get获取不到
如果你已经正确存储了 Redis 连接对象,并且在存储的过程中没有出现错误,但是在其他函数中使用 `get(redis_conn)` 仍然无法获取到连接对象,可能是因为存储的过程和获取的过程在不同的进程中。
在 Erlang 中,每个进程都拥有自己的 process 字典。如果你在一个进程中存储了 Redis 连接对象,然后在另一个进程中使用 `get(redis_conn)` 获取连接对象,就会返回 `undefined`。
为了在不同的进程中共享 Redis 连接对象,可以使用 Erlang 的分布式功能。具体来说,可以将 Redis 连接对象存储到一个名为 `redis_conn` 的注册表中,然后在不同的进程中通过 `global:sync/1` 函数同步注册表,从而实现共享。例如:
```
-module(redis_demo).
-export([start/0]).
-include_lib("eredis/include/eredis.hrl").
start() ->
%% 连接 Redis
{ok, RedisConn} = eredis:start_link("127.0.0.1", 6379),
%% 存储 Redis 连接对象到注册表中
global:register_name(redis_conn, RedisConn),
%% 在不同的函数中获取 Redis 连接对象并使用
set_key("mykey", "myvalue"),
Value = get_key("mykey"),
io:format("Value of key mykey is ~p~n", [Value]),
%% 关闭 Redis 连接
eredis:close(RedisConn).
set_key(Key, Value) ->
%% 获取 Redis 连接对象
{ok, RedisConn} = global:sync(redis_conn),
%% 存储键值对
{ok, _} = eredis:q(RedisConn, ["SET", Key, Value]).
get_key(Key) ->
%% 获取 Redis 连接对象
{ok, RedisConn} = global:sync(redis_conn),
%% 获取键值对
{ok, [Value]} = eredis:q(RedisConn, ["GET", Key]),
Value.
```
在上面的代码中,我们使用 `global:register_name(redis_conn, RedisConn)` 将 Redis 连接对象存储到名为 `redis_conn` 的注册表中。然后,在 `set_key/2` 和 `get_key/1` 函数中,我们通过 `global:sync(redis_conn)` 获取注册表中存储的 Redis 连接对象。
需要注意的是,使用分布式注册表可以在不同的进程中共享 Redis 连接对象,提高代码的可复用性。但是,由于网络通信的开销,使用分布式注册表可能会降低代码的执行效率。如果在本地使用 Redis,建议使用 process 字典来存储 Redis 连接对象,以提高代码的执行效率。