Dashboard > СУБД > Home > PostgreSQL, plperl, memcached > Information > Сравнение Страницы
  СУБД Вход | Зарегистрироваться   Вариант для печати.  
  PostgreSQL, plperl, memcached
Версия 1 shixaro
на Sep 08, 2011 12:19.


 
сравнено с
Ключ
Эти линии были удалены. Это слово было удалено.
Эти линии были добавлены. Это слово было добавлено.

Просмотреть историю страницы


there.are.num.changes

 Например, надо посчитать количество сидеров по конкретной раздаче в трекерной таблице в базе торрент-трекере и кэшировать (потому что постоянно дергать - напряжно для базы). На голом перле с использованием мемкэша это делалось бы примерно так:
  
 {noformat}
  
 #!/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;
 {noformat}
  
 Результат работы:
 {noformat}
  
 $ ./mc.pl 81646
 count: 1
 {noformat}
  
  
 Чтобы использовать plperl, необходимо привинтить его поддержку к слонику и подключить к самой базе:
 {noformat}
 psql -U user -h host -c "create language plperl"
 {noformat}
  
 Для того, чтобы была возможность использовать Cache::Memcached, нужно подключить в базе "un-trusted" вариант plperl:
 {noformat}
 psql -U user -h host -c "create language plperlu"
 {noformat}
  
 На plperlu процедура будет выглядеть примерно так:
 {noformat}
 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 $sth = spi_query("SELECT COUNT(*) AS count FROM phpbb_bt_tracker WHERE torrent_id=$tid AND seeder=1");
  $row = spi_fetchrow($sth);
  $seeders=$row->{count};
  $cache->set($key, $seeders, $ttl);
  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;
 {noformat}
  
  
 Результаты работы:
 {noformat}
 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)
 {noformat}
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.5 Build:#805 Apr 26, 2007) - Запрос Bug/feature - Связаться с администраторами