redisï
Redis client library. Supports ECLiPSe, GNU Prolog, SICStus Prolog, SWI-Prolog, Trealla Prolog, and XVM.
For general information on Redis, including a list of the available commands, visit:
https://redis.io
API documentationï
Open the ../../apis/library_index.html#redis link in a web browser.
Loadingï
To load this library, load the loader.lgt file:
| ?- logtalk_load(redis(loader)).
Testingï
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(redis(tester)).
The tests assume a localhost Redis server running on the default port
(6379) if the REDIS_HOST and REDIS_PORT environment variables
are not defined. If the server is not detected, the tests are skipped.
The unit tests were originally written by Sean Charles for his GNU Prolog Redis client library:
https://github.com/emacstheviking/gnuprolog-redisclient
The Logtalk version is a straight-forward port of the original tests
using the test/1 dialect of lgtunit.
Supported Redis Featuresï
This library provides wrapper predicates for commonly used Redis
operations across multiple data types. For Redis commands not covered by
a wrapper, use the generic redis::send/3 predicate with the command
as a compound term.
Connection Managementï
connect/1- Connect to localhost on default port (6379)connect/3- Connect to specified host and portdisconnect/1- Disconnect from Redis serversend/3- Send any Redis command and receive reply
String Operationsï
get/3- Get the value of a keyset/4- Set the value of a keyappend/4- Append a value to a keygetrange/5- Get substring of string stored at keysetrange/5- Overwrite part of a string at key starting at offsetstrlen/3- Get the length of the value stored at keymget/3- Get values of multiple keysmset/3- Set multiple key-value pairs atomicallyincr/3- Increment integer value of key by onedecr/3- Decrement integer value of key by oneincrby/4- Increment integer value of key by amountdecrby/4- Decrement integer value of key by amount
Key Operationsï
del/3- Delete a keyexists/3- Check if a key existskeys/3- Find all keys matching a patternttl/3- Get time to live for a key in secondsexpire/4- Set a timeout on a key in secondspersist/3- Remove the expiration from a keyrename/4- Rename a keytype/3- Get the type of value stored at key
Hash Operationsï
Hashes are maps between string fields and string values, ideal for representing objects.
hset/5- Set field in a hashhget/4- Get value of field in a hashhgetall/3- Get all fields and values in a hashhdel/4- Delete field from a hashhexists/4- Check if field exists in a hashhkeys/3- Get all field names in a hashhvals/3- Get all values in a hashhlen/3- Get number of fields in a hash
List Operationsï
Redis lists are ordered collections of strings, sorted by insertion order.
lpush/4- Prepend value to a listrpush/4- Append value to a listlpop/3- Remove and return first element of listrpop/3- Remove and return last element of listlrange/5- Get range of elements from listllen/3- Get length of listlrem/5- Remove elements from listltrim/5- Trim list to specified range
Set Operationsï
Redis sets are unordered collections of unique strings.
sadd/4- Add member to a setsrem/4- Remove member from a setsmembers/3- Get all members in a setsismember/4- Check if value is member of setscard/3- Get number of members in a set
Sorted Set Operationsï
Sorted sets are collections of unique strings (members) ordered by an associated score. Members are unique, but scores may repeat.
zadd/5- Add member with score to sorted setzrem/4- Remove member from sorted setzrange/5- Get range of members from sorted set by indexzrank/4- Get rank (index) of member in sorted setzcard/3- Get number of members in sorted setzscore/4- Get score of member in sorted set
Usage Examplesï
% Connect and perform basic string operations
?- redis::connect(Connection),
redis::set(Connection, mykey, 'Hello World', Status),
redis::get(Connection, mykey, Value),
redis::disconnect(Connection).
Status = 'OK',
Value = 'Hello World'.
% Working with hashes
?- redis::connect(Connection),
redis::hset(Connection, user:1000, name, 'John Doe', _),
redis::hset(Connection, user:1000, email, 'john@example.com', _),
redis::hgetall(Connection, user:1000, Fields),
redis::disconnect(Connection).
Fields = [bulk(name), bulk('John Doe'), bulk(email), bulk('john@example.com')].
% Using lists as queues
?- redis::connect(Connection),
redis::rpush(Connection, queue, task1, _),
redis::rpush(Connection, queue, task2, _),
redis::lpop(Connection, queue, Task),
redis::disconnect(Connection).
Task = task1.
% Batch operations with mget/mset
?- redis::connect(Connection),
redis::mset(Connection, [key1, val1, key2, val2], Status),
redis::mget(Connection, [key1, key2], Values),
redis::disconnect(Connection).
Status = 'OK',
Values = [bulk(val1), bulk(val2)].
% Key expiration
?- redis::connect(Connection),
redis::set(Connection, session:xyz, 'user_data', _),
redis::expire(Connection, session:xyz, 3600, _), % Expire in 1 hour
redis::ttl(Connection, session:xyz, TTL),
redis::disconnect(Connection).
TTL = 3600.
% Using send/3 for commands without wrappers
?- redis::connect(Connection),
redis::send(Connection, info(server), Reply),
redis::disconnect(Connection).
Creditsï
This library is inspired by the Sean Charles GNU Prolog Redis client library.
Known issuesï
Recent versions of macOS seem to disable the mapping of localhost to
127.0.0.1. This issue may prevent running this library unit tests
and the redis::connect/1 predicate from working. This can be fixed
either by editing the /etc/hosts file or by using in alternative the
predicate redis::connect/3 with '127.0.0.1' as the first
argument.