Advertisement
DRVTiny

recursive_get_redis_tree

May 19th, 2017
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.16 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use 5.16.1;
  3. use strict;
  4. use warnings;
  5. use utf8;
  6.  
  7. use Redis::Fast;
  8. use CBOR::XS;
  9. use JSON::XS;
  10. use Data::Dumper;
  11. my $cbor=CBOR::XS->new;
  12. my $redC=Redis::Fast->new;
  13. use Time::HiRes qw(time);
  14.  
  15. $redC->select(8);
  16.  
  17. sub get_tree {
  18.     my ($rootNode, $cb)=@_;
  19.     $rootNode='s'.$rootNode unless substr($rootNode,0,1) eq 's';
  20.     my ($rslt,$rx_get_tree);
  21.     my $GC=0;
  22.     $rx_get_tree=sub {
  23.         unless (@_) {
  24.             $cb->($rslt) unless $GC;
  25.             return
  26.         }
  27.         my @deps=map 's'.$_, @_;
  28.         $GC++;
  29.         $redC->mget(@deps, sub {
  30.             my $c=0; $GC--;
  31.             $rx_get_tree->(
  32.                 map {
  33.                     @{ scalar($rslt->{$deps[$c++]}=$cbor->decode($_))->{'dependencies'} || [] };
  34.                 } @{$_[0]}
  35.             );
  36.         });
  37.     };
  38.     $redC->get($rootNode, sub {
  39.         $rx_get_tree->( @{ scalar($rslt->{$rootNode}=$cbor->decode($_[0]))->{'dependencies'} || [] } );
  40.     });
  41. }
  42.  
  43. my $startTime=time();
  44. get_tree(shift, sub {
  45.     my $est=scalar(time()-$startTime);
  46.     say JSON::XS->new->encode(shift);
  47.     say STDERR $est, ' sec.'
  48. });
  49.  
  50. $redC->wait_all_responses;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement