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! ;-)