СУБД
Добавил(а) shixaro, последний раз редактировал(а) shixaro Sep 20, 2011  (посмотреть изменения)
Метки: 

Например, надо посчитать количество сидеров по конкретной раздаче в трекерной таблице в базе торрент-трекере и кэшировать (потому что постоянно дергать - напряжно для базы). На голом перле с использованием мемкэша это делалось бы примерно так:

#!/usr/bin/perl
use strict;
use DBI;
use Cache::Memcached;
my $pghost="host";
my $pgbase="base";
my $pguser="user";
my $pgpass="pass";
my $tid=$ARGV[0];
my $cache = Cache::Memcached->new({servers => ["127.0.0.1:11211"], debug => 0});
my $ttl=3600;
my $sth;
my $count;

my $dbh = DBI->connect("dbi:Pg:dbname=$pgbase;host=$pghost",$pguser,$pgpass, {PrintError => 0, AutoCommit => 0 });

if (!defined($cache->get("seedcount_torrent_".$tid)))
{
 $sth = $dbh->prepare("SELECT COUNT(*) FROM phpbb_bt_tracker WHERE torrent_id=? AND seeder=1"); 
 $sth->execute($tid);
 $count = $sth->fetchrow_array;
 $cache->set("seedcount_torrent_".$tid, $count, $ttl);
} 
else {$count=$cache->get("seedcount_torrent_".$tid);}

print "count: $count\n";

my $rc = $dbh->disconnect;

Результат работы:

$ ./mc.pl 81646
count: 1

Чтобы использовать plperl, необходимо привинтить его поддержку к слонику и подключить к самой базе:

psql -U user -h host -c "create language plperl"

Для того, чтобы была возможность использовать Cache::Memcached, нужно подключить в базе "un-trusted" вариант plperl:

psql -U user -h host -c "create language plperlu"

На plperlu процедура будет выглядеть примерно так:

CREATE FUNCTION get_seedcount(integer) RETURNS integer AS $$
 use Cache::Memcached;
 my ($tid) = @_;
 my $ttl=3600;
 my $key='seedcount_torrent_'.$tid;
 my $cache = Cache::Memcached->new({servers => ["127.0.0.1:11211"], debug => 0});
 my $seeders;
 if ( defined($cache->get($key)) ) {$seeders=$cache->get($key);}
 else
 {
   my $row;
   my $plan = spi_prepare('SELECT COUNT(*) AS count FROM phpbb_bt_tracker WHERE torrent_id=$1 AND seeder=1', 'INTEGER');
   my $sth = spi_query_prepared( $plan, $tid );
   $row = spi_fetchrow($sth);
   $seeders=$row->{count};
   $cache->set($key, $seeders, $ttl);
 }
 $cache->disconnect_all;
 return $seeders;
$$ LANGUAGE plperlu;

Результаты работы:

tracker=# EXPLAIN ANALYZE select * from get_seedcount(93534);
 QUERY PLAN 
------------------------------------------------------------------------------------------------------------------
 Function Scan on get_seedcount (cost=0.25..0.26 rows=1 width=4) (actual time=1736.049..1736.050 rows=1 loops=1)
 Total runtime: 1736.096 ms
(2 rows)

tracker=# EXPLAIN ANALYZE select * from get_seedcount(93534);
 QUERY PLAN 
------------------------------------------------------------------------------------------------------------
 Function Scan on get_seedcount (cost=0.25..0.26 rows=1 width=4) (actual time=1.120..1.120 rows=1 loops=1)
 Total runtime: 1.136 ms
(2 rows)

Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.5 Build:#805 Apr 26, 2007) - Запрос Bug/feature - Связаться с администраторами