組み込みRedis述語を使用する

組み込みredisは今のところLinuxしか対応していないようです。

/*
%redis組み込み関数
redis_connect
redis_free_context
redis_command
redis_command_hate_integer
redis_version
redis_is_disconnected
*/
 
redis_init:-redis_connect('127.0.0.1',6379,3000,C),assert(redis_ID(C)),!.
resis_end:-abolish(redis_ID,1),redis_free_context(C).
resis_set(K,V):-redis_ID(C),!,redis_command(C,[set,K,V],_,_).
resis_get(K,V):-redis_ID(C),!,redis_command(C,[get,K],_,V).
resis_del(K):-redis_ID(C),!,redis_command(C,[expire,K,'1'],_,_). %,s_sleep(500),
resis_count(K):-redis_ID(C),
  redis_command(C,[get,K],T,V),name(A,V),term_atom(I,A),!,N is I+1,
  redis_command(C,[set,K,N],T,V).

なのでwindowsではs_childを使用してresis_cliを子プロセスとして使うしかないです。
test:-
	s_child('redis-server',[],I1,O1,ID1),
	s_sleep(1000), %サーバ立ち上げのための時間。無いとgetで反応が来ず固まるので必須。
	s_child('redis-cli',[],I2,O2,ID2),
	f(I2,O2,10,"TEST"),
	seen(O1),told(I1),
	seen(O2),told(I2),
	s_kill(ID1,9),s_kill(ID2,9).

f(I,O,0,W):-!.
f(I,O,N,W):-
	a(W),!,
	append("get ",W,X1),
	get_redis(I,O,X1,D),write('D='),write(D),nl,
	append("del ",W,X2),
	del_redis(I,O,X2),
	name(N,N2),
	appends(["set ",W," ",N2,"."],X3),
	set_redis(I,O,X3),
	NN is N -1,
	f(I,O,NN,W).

f(I,O,N,W):-!,
	assert(a(W)),
	name(N,N2),
	appends(["set ",W," ",N2,"."],X),
	set_redis(I,O,X),
	NN is N -1,
	f(I,O,NN,W).

set_redis(I,O,S):-
	puts(I,S), %[46]="."をトリガにしてデータを取得する。
	get0(O,79), % X1 is 79,
	get0(O,75), % X2 is 75, %[79,75]="OK"
	get0(O,10). % X3 is 10.

get_redis(I,O,S,Y):-
	puts(I,S),
	get0(O,X),gets(O,X,Y-Y),
	get0(O,10). %X2 is 10.

del_redis(I,O,S):-
	puts(I,S),
	get0(O,49), %X1 is 49,
	get0(O,10). %X2 is 10. %[10,49]="改行 1" 1は"set TEST"で設定したTESTの登録数。

append0([],L,L):-!.
append0([A|L],R,[A|LR]):-!,append0(L,R,LR).
appends([A],A):-!.
appends([A1,A2|L],T):-append0(A1,A2,A3),appends([A3|L],T).
gets(S,46,T-[]):- !.
gets(S,X,T-[X|L]):-get0(S,XX),gets(S,XX,T-L).
puts(I,[]):-!,nl(I).
puts(I,[A|L]):-put(I,A),puts(I,L).
最終更新:2014年05月08日 13:40