저는 대부분 RAM에 물건을 보관해야하는 인트라넷 앱에서 작업했습니다. ETS
메커니즘을 추상화하는 데 도움이되는 안정적인 caching library
을 만들었습니다. 이 라이브러리에서 저는 ETS
테이블에 대한 메소드를 만들고, 소유하고 노출하는 작업자 인 gen_servers
을 만듭니다. 나는 그것들을 cache1
과 cache2
으로 명명했다. 이 둘은 소유권이 서로 상충되는 경우 중복 된 방식으로 소유권을 양도합니다. 응용 프로그램 가져 오기 : http://www.4shared.com/zip/z_VgKLpa/cache-10.html 그냥 압축을 풀고 Emake file
을 사용하여 다시 컴파일 한 다음 Erlang Lib directory
에 입력하십시오. 어떻게 작동하는지 보려면 여기를 참조하십시오.
F:\programming work\cache-1.0>erl -pa ebin
Eshell V5.9 (abort with ^G)
1> application:start(cache).
ok
2> rd(student,{name,age,sex}).
student
3> cache_server:new(student,set,2).
ok
4> cache_server:write(#student{name = "Muzaaya Joshua",
sex = "Male",age = (2012 - 1987) }).
ok
5> cache_server:write(student,[#student{name = "Joe",sex = "Male"},
#student{name = "Mike",sex = "Male"}]).
ok
6> cache_server:read({student,"Muzaaya Joshua"}).
[#student{name = "Muzaaya Joshua",age = 25,sex = "Male"}]
7> cache_server:read({student,"Joe"}).
[#student{name = "Joe",age = undefined,sex = "Male"}]
8> cache_server:get_tables().
[{cache1,[student]},{cache2,[]}]
9> rd(class,{class,no_of_students}).
class
10> cache_server:get_tables().
[{cache1,[student]},{cache2,[]}]
11> cache_server:new(class,set,2).
ok
12> cache_server:get_tables().
[{cache1,[student]},{cache2,[class]}]
13> cache_server:write(class,[
#class{class = "Primary " ++ integer_to_list(N),
no_of_students = random:uniform(50)} || N <- lists:seq(1,7)])
.
ok
14> cache_server:read({class,"Primary 6"}).
[#class{class = "Primary 6",no_of_students = 30}]
15> cache_server:delete({class,"Primary 2"}).
ok
16> cache_server:get_cache_state().
[{server_state,cache1,1,[student]},
{server_state,cache2,1,[class]}]
17> rd(food,{name,type,value}).
food
18> cache_server:new(food,set,2).
ok
19> cache_server:write(food,[#food{name = "Orange",
type = "fruit",value = "Vitamin C"}]).
ok
20> cache_server:get_cache_state().
[{server_state,cache1,2,[food,student]},
{server_state,cache2,1,[class]}]
21>
이제
ets:give_away/3
의 중요성을 이해하기 위해
cache1
또는
cache2
중 하나가 충돌하면 어떻게되는지보십시오. 현재 서버 상태 (테이블의 현재 소유자를 보여줍니다)는 다음과 같습니다.
21> cache_server:get_cache_state().
[{server_state,cache1,2,[food,student]},
{server_state,cache2,1,[class]}]
22>
cache1
충돌이 발생합니다.
22> gen_server:cast(cache1,stop).
ok
Cache Server: cache2 has taken over table: food from server: cache1
23>
Cache Server: cache2 has taken over table: student from server: cache1
23> cache_server:get_cache_state().
[{server_state,cache1,0,[]},
{server_state,cache2,3,[student,food,class]}]
24>
마찬가지로 다른 하나는
24> gen_server:cast(cache2,stop).
ok
Cache Server: cache1 has taken over table: student from server: cache2
25>
Cache Server: cache1 has taken over table: food from server: cache2
25>
Cache Server: cache1 has taken over table: class from server: cache2
25> cache_server:get_cache_state().
[{server_state,cache1,3,[class,food,student]},
{server_state,cache2,0,[]}]
26>
입니다. 소스 코드의 개념을 사용하여 직접 만들 수 있습니다. 해당 라이브러리에서 만든
ETS
테이블은
public
및
named
이므로
ETS
함수를 사용하여 테이블에 직접 액세스 할 수 있습니다.