2017-07-10 8 views
0

サイトマップジェネレータを私のウェブサイトに作成しようとしていますので、私のウェブサイトからリンクを収集し、例えばのため:Php Redisはソートなしのセットで値を加算します

$redis = new Redis(); 
$redis->connect('127.0.0.1', 6379); 

$redis->sAdd('myLinks', 'www.example.com'); 
$redis->sAdd('myLinks', 'www.example.com/1'); 
$redis->sAdd('myLinks', 'www.example.com/2'); 
$redis->sAdd('myLinks', 'www.example.com/3'); 
... 

しかし、私は私のセット

print_r($redis->smembers('myLinks')); 

をチェックするときには仕方を追加そこに値を維持しません。コードの出力は、私は、彼らが0から10まで、上記の例のように追加された方法を値の位置を維持するために、どのような方法があるかどうかを知りたい

Array 
(
    [0] => www.example.com/7 
    [1] => www.example.com 
    [2] => www.example.com/2 
    [3] => www.example.com/5 
    [4] => www.example.com/1 
    [5] => www.example.com/4 
    [6] => www.example.com/3 
    [7] => www.example.com/8 
    [8] => www.example.com/9 
    [9] => www.example.com/6 
    [10] => www.example.com/10 
) 

のですか?

私はRedis Listに移動したくありません。なぜなら、それらを反復するときには非常に遅いからです。

答えて

1

これはSorted Setで実現できます。リンクを追加する必要があるたびに、Sorted Setに追加し、そのサイズをスコア(ZCARD)にします。

ZCARD mylinks 
ZADD mylinks result_of_zcard link 

このようにして、これらのリンクを並べ替えることができます。これらの操作を不可分にするために、これらの2つのコマンドをLuaスクリプトにラップすることができます。

追加した順にこれらのリンクを取得する場合は、ZRANGE mylinks 0 -1を使用してください。

これらのリンクを繰り返す必要がある場合は、ZSCANまたはZRANGEのいずれかを使用できます。どちらのコマンドも高速です。つまり、O(1)O(logN)です。

+0

ありがとうございました。 ZSCANまたはZRANGEをPHPでiteretingに使用するにはどうすればよいのですか?PHPに関しては、これらの2つの結果が見つかりませんでした。 –

+0

@AbdulJabbarWebBestow最初の要素を取得するには: '$ redis-> zRange( 'mylinks'、0、0);'。 2番目の値を取得するには、 '$ redis-> zRange( 'mylinks'、1,1);などのようにします。 'zScan'と' zRange'の詳細については、[phpredis](https://github.com/phpredis/phpredis)のgithubリンクを確認してください。 –

+0

ありがとうございます。それは本当に役に立ちました。 –

関連する問題