VMOD_REDIS(3) | VMOD_REDIS(3) |
vmod_redis - Redis VMOD
import redis [as name] [from "path"] VOID subnets(STRING masks) VOID sentinels(STRING locations, INT period, INT connection_timeout, INT command_timeout, ENUM protocol, BOOL tls, STRING tls_cafile, STRING tls_capath, STRING tls_certfile, STRING tls_keyfile, STRING tls_sni, STRING password) VOID use(STRING db) VOID add_server(STRING location, ENUM type, STRING db) VOID command(STRING name, STRING db) VOID timeout(INT command_timeout, STRING db) VOID retries(INT max_command_retries, STRING db) VOID push(STRING arg, STRING db) VOID execute(BOOL master, STRING db) BOOL replied(STRING db) BOOL reply_is_error(STRING db) BOOL reply_is_nil(STRING db) BOOL reply_is_status(STRING db) BOOL reply_is_integer(STRING db) BOOL reply_is_boolean(STRING db) BOOL reply_is_double(STRING db) BOOL reply_is_string(STRING db) BOOL reply_is_array(STRING db) STRING get_reply(STRING db) STRING get_error_reply(STRING db) STRING get_status_reply(STRING db) INT get_integer_reply(STRING db) BOOL get_boolean_reply(STRING db) REAL get_double_reply(STRING db) STRING get_string_reply(STRING db) INT get_array_reply_length(STRING db) BOOL array_reply_is_error(INT index, STRING db) BOOL array_reply_is_nil(INT index, STRING db) BOOL array_reply_is_status(INT index, STRING db) BOOL array_reply_is_integer(INT index, STRING db) BOOL array_reply_is_boolean(INT index, STRING db) BOOL array_reply_is_double(INT index, STRING db) BOOL array_reply_is_string(INT index, STRING db) BOOL array_reply_is_array(INT index, STRING db) STRING get_array_reply_value(INT index, STRING db) VOID free(STRING db) STRING stats(ENUM format, BOOL stream, STRING prometheus_name_prefix, BOOL prometheus_default_labels, STRING prometheus_extra_labels, STRING db) INT counter(STRING name, STRING db) new xdb = redis.db(STRING location, ENUM type, INT connection_timeout, INT connection_ttl, INT command_timeout, INT max_command_retries, BOOL shared_connections, INT max_connections, ENUM protocol, BOOL tls, STRING tls_cafile, STRING tls_capath, STRING tls_certfile, STRING tls_keyfile, STRING tls_sni, STRING user, STRING password, INT sickness_ttl, BOOL ignore_slaves, INT max_cluster_hops)
VOID xdb.add_server(STRING location, ENUM type)
VOID xdb.command(STRING name)
VOID xdb.timeout(INT command_timeout)
VOID xdb.retries(INT max_command_retries)
VOID xdb.push(STRING arg)
VOID xdb.execute(BOOL master)
BOOL xdb.replied()
BOOL xdb.reply_is_error()
BOOL xdb.reply_is_nil()
BOOL xdb.reply_is_status()
BOOL xdb.reply_is_integer()
BOOL xdb.reply_is_boolean()
BOOL xdb.reply_is_double()
BOOL xdb.reply_is_string()
BOOL xdb.reply_is_array()
STRING xdb.get_reply()
STRING xdb.get_error_reply()
STRING xdb.get_status_reply()
INT xdb.get_integer_reply()
BOOL xdb.get_boolean_reply()
REAL xdb.get_double_reply()
STRING xdb.get_string_reply()
INT xdb.get_array_reply_length()
BOOL xdb.array_reply_is_error(INT index)
BOOL xdb.array_reply_is_nil(INT index)
BOOL xdb.array_reply_is_status(INT index)
BOOL xdb.array_reply_is_integer(INT index)
BOOL xdb.array_reply_is_boolean(INT index)
BOOL xdb.array_reply_is_double(INT index)
BOOL xdb.array_reply_is_string(INT index)
BOOL xdb.array_reply_is_array(INT index)
STRING xdb.get_array_reply_value(INT index)
VOID xdb.free()
STRING xdb.stats(ENUM format, BOOL stream, STRING prometheus_name_prefix, BOOL prometheus_default_labels, STRING prometheus_extra_labels)
INT xdb.counter(STRING name)
VMOD using the synchronous hiredis library API to access Redis servers from VCL.
This is useful in setups using Redis instances deployed across multiple data centers or availability zones.
VOID sentinels(
STRING locations="",
INT period=60,
INT connection_timeout=500,
INT command_timeout=0,
ENUM {RESP2, RESP3, default} protocol=default,
BOOL tls=0,
STRING tls_cafile="",
STRING tls_capath="",
STRING tls_certfile="",
STRING tls_keyfile="",
STRING tls_sni="",
STRING password="" )
This is useful in setups using non-clustered Redis instances in order to (1) keep roles (i.e. master / slave) updated; and (2) decrease priority of unreachable servers when creating execution plans. This is not designed for auto-discovery of Redis Servers.
period: how frequently (seconds) Redis Sentinel periodical checks are executed (0 means disabling periodical checks). Beware (1) proactive checks are also executed anytime the VCL state is changed to warm; and (2) Sentinel Pub/Sub events are listened and processed even when periodical checks are disabled.
connection_timeout: connection timeout (milliseconds; 0 means no timeout) to the Redis Sentinel servers.
command_timeout: command timeout (milliseconds; 0 means no timeout) when executing Redis Sentinel commands.
protocol: protocol to be used when talking to Redis Sentinel servers. Beware switching from RESP2 to RESP3 is only possible since Redis 6.0 and it uses an additional HELLO command when creating new Redis Sentinel connections. Be careful RESP3 support is only available since hiredis 0.15.0.
tsl: if enabled, TLS will be used when establishing connections.
tls_cafile: if not empty, this CA certificate file will be used to verify TLS connections.
tls_capath: if not empty, this will be the directory storing trusted CA certificates used to verify TLS connections. If neither tls_cafile nor tls_capath are specified, the default system-wide trusted root certs configuration will apply.
tls_certfile: if not empty, this certificate file will be used to authenticate TLS connections.
tls_keyfile: if not empty, this private key file will be used to authenticate TLS connections.
tls_sni: if not empty, this server name indication (i.e. SNI) will be used when establishing TLS connections.
password: if not empty, requests for authentication using the AUTH command will be submitted when creating new Redis Sentinel connections. This password will be used for all Redis Sentinel servers.
VOID add_server(
STRING location,
ENUM {master, slave, auto, cluster} type,
STRING db="" )
STRING stats(
ENUM {json, prometheus} format=json,
BOOL stream=0,
STRING prometheus_name_prefix="vmod_redis_",
BOOL prometheus_default_labels=1,
STRING prometheus_extra_labels="",
STRING db="" )
new xdb = redis.db(
STRING location="",
ENUM {master, slave, auto, cluster} type=auto,
INT connection_timeout=1000,
INT connection_ttl=0,
INT command_timeout=0,
INT max_command_retries=0,
BOOL shared_connections=1,
INT max_connections=128,
ENUM {RESP2, RESP3, default} protocol=default,
BOOL tls=0,
STRING tls_cafile="",
STRING tls_capath="",
STRING tls_certfile="",
STRING tls_keyfile="",
STRING tls_sni="",
STRING user="",
STRING password="",
INT sickness_ttl=60,
BOOL ignore_slaves=0,
INT max_cluster_hops=32 )
type: type of the Redis server referenced by location:
connection_timeout: connection timeout (milliseconds; 0 means no timeout) to the Redis server.
connection_ttl: TTL (seconds) of Redis connections (0 means no TTL). Once the TTL of a connection is consumed, the module transparently reestablishes it. See "Client timeouts" in http://redis.io/topics/clients for extra information.
command_timeout: command timeout (milliseconds; 0 means no timeout) when executing a Redis command. It can be overridden during command execution with .timeout().
max_command_retries: number of retries to be executed after a failed command execution. It can be overridden during command execution with .retries().
shared_connections: if enabled, Redis connections are not local to Varnish worker threads, but shared by all threads using one or more pools.
Note that when Redis Cluster support is enabled for a database, each server is the cluster is internally labeled by the VMOD with its location (IP + port).
When shared_connections is disabled, Redis connections are local to each Varnish worker thread. This option sets the maximum number of Redis connections per Varnish worker thread. Each thread keeps up to one connection per location and database instance. If more than one (database, location) pair is available, incrementing this limit allows recycling of Redis connections.
WARNING: when creating multiple database instances, always use the same value in all instances using private connections. Otherwise you may experience inconsistent behavior.
protocol: protocol to be used when talking to Redis Server servers. Beware switching from RESP2 to RESP3 is only possible since Redis 6.0 and it affects to type conversion rules. Be careful RESP3 support is only available since hiredis 0.15.0.
tsl: if enabled, TLS will be used when establishing connections.
tls_cafile: if not empty, this CA certificate file will be used to verify TLS connections.
tls_capath: if not empty, this will be the directory storing trusted CA certificates used to verify TLS connections. If neither tls_cafile nor tls_capath are specified, the default system-wide trusted root certs configuration will apply.
tls_certfile: if not empty, this certificate file will be used to authenticate TLS connections.
tls_keyfile: if not empty, this private key file will be used to authenticate TLS connections.
tls_sni: if not empty, this server name indication (i.e. SNI) will be used when establishing TLS connections.
user: if not empty and a password is provided, requests for authentication using the AUTH or HELLO command will include both the user name and its password. That enables usage of the Redis ACL system, available since Redis 6.0.
password: if not empty, requests for authentication using the AUTH or HELLO command will be submitted when creating new Redis connections. This password will be used for all Redis servers, including discovered servers when Redis Cluster support is enabled.
sickness_ttl: TTL (seconds) of the sickness flag (0 means no sickness flags) associated to a Redis server. Once a server is flagged as sick and while the flag is not expired the module will lazily drop existing connections to that server and it will try to avoid it as much as possible when creating execution plans. This TTL is overridden when Redis Sentinel servers are configured and some Sentinel discovers an unreachable server.
ignore_slaves: if enabled, slave servers are not considered when executing commands. In other words, enabling this option implicitly forces master == true when using the .execute() method.
max_cluster_hops: maximum number of redirections (0 means no limit) when executing a command and Redis Cluster support has been enabled.
VOID xdb.add_server(
STRING location,
ENUM {master, slave, auto, cluster} type )
type: type of the Redis server referenced by location:
If Redis Cluster support has been enabled other servers in the cluster and their roles are automatically discovered by the VMOD using the CLUSTER SLOTS command. In any case, knowing more cluster servers during startup increases the chances of discover the cluster topology if some server is failing.
On execution time, EVAL commands are internally replace by EVALSHA commands, which fallback to the original EVAL command if the Redis server returns a NOSCRIPT error (see http://redis.io/commands/eval).
When more than one Redis server is available, the destination server is selected according with master and with the list of weights + subnet masks provided when calling redis.subnets().
WARNING: allowing execution of commands in slave servers (i.e. master == false) must be carefully used:
STRING xdb.stats(
ENUM {json, prometheus} format=json,
BOOL stream=0,
STRING prometheus_name_prefix="vmod_redis_",
BOOL prometheus_default_labels=1,
STRING prometheus_extra_labels="" )
stream: if enabled, the response object will be streamed as a synthetic response.
prometheus_name_prefix: prefix to be used in all Prometheus metric names. It's used as a raw value; no validations or transformations at all.
prometheus_default_labels: if enabled, some default Prometheus labels will be added to all stats.
prometheus_extra_labels: extra Prometheus labels to be added to all stats. It's used as a raw value; no validations or transformations at all.
If called during vcl_synth or vcl_backend_error with the stream argument enabled, this function will return an empty string and behave as a call to the synthetic VCL function with the response object as input. This highly reduces the amount of required workspace memory.
Copyright (c) 2014-2022 Carlos Abalde <carlos.abalde@gmail.com> You're free to use and distribute this under terms in the LICENSE file.