A Perl module is available on CPAN, appropriately named Redis. One might therefore be tempted to do something like:
<plugin:Redis server localhost:6379>
<null $Redis.set('key', 'value')>
Great idea, however it turns out that didn't work. Is Bedrock broken? Hmmm...let's find out.
Perl modules like Redis that utilize a large number of AUTOLOAD subroutines and do not implement an appropriate can method are not going to present a code reference when Bedrock's parser calls the module's can method...so as a recognition of this possibility the Func.pm module within Bedrock's parsing does this:
my $funcref;
$funcref = $obj->can($func);
...
if ( $funcref ) {
@ref_v = $funcref->( $obj, @funcargs );
}
else {
&log_message(
undef,
"$self: eval function in case implemented via AUTOLOAD\n\@ref_v = $obj->$func(\@args);"
);
eval '@ref_v = $obj->' . $func . '(@args);';
if ( $@ ) {
if ( $@ =~/TagX::Scalar/ ) {
die "attempt to invoke possibly non-existent method ($func) on a possibly non-existent scalar\n";
}
else {
die "$@\n";
}
}
}
Hey, umm...what's that? @args? Shouldn't that be @funcargs? Yup....bug. Fixed in 2.4.1-snapshot today. Okay, so anyway...
What can we do with Bedrock and Redis?
Well, generally we can use it as a persistent storage mechanism similar to the way we use the $session object.
<null $Redis.set('foo', 'bar')>
...on one page and then...
<var $Redis.get('foo')>
Of course that example is like saying you can use a brick to prop open a door! There are lot more interesting and exciting things you can do with Redis.
How about counting page hits from unique IPs?
<null $Redis.pfadd('home-page', $env.REMOTE_ADDR)>
Using Redis' HyperLogLog (requires Redis 2.8.9) facility we can add a member and let Redis keep track of counting unique hits.
<var $Redis.pfcount('home-page')>
Or resetting a counter at midnight by specifying a time value (seconds since the epoch) to the expireat function.
<sqlselect "select unix_timestamp(date_add(curdate(), interval 1 day)) exp">
<null $Redis.expireat('home-page', $exp)></sqlselect>
...and of course we can store serialized data to Redis.
<null $Redis.set('env', $env.json()>
and deserialize it later to a Bedrock object...
<null:user_env --json $Redis.get('env')>
Yup...this is cool! ;-)