sql >> データベース >  >> NoSQL >> Redis

アイテム数によるRedisポップリストアイテム

    キューで作業していると思います 、1つの場所に1000個のアイテムを挿入し、挿入された順序で複数の場所でアイテムを取得します。 。

    1つのコマンドでそれを達成することはできませんが、2つのコマンドでそれを達成することができます。 luaスクリプトを記述して、それらをアトミックにすることができます。

    Lrange:http://redis.io/commands/lrange

    Lrange list -100 -1
    

    これにより、リストの最初の100個の要素が一覧表示されます。ここでのオフセットは-100です。これにより、挿入されたのとは逆の順序でアイテムが返されることに注意してください。したがって、キューメカニズムを確保するには、ループを逆にする必要があります。

    Ltrim:http://redis.io/commands/ltrim

    ltrim list 0 -101
    

    これにより、リストの最初の100個の要素がトリミングされます。ここで101はn+1なので、101でなければなりません。ここでオフセットは101です

    luaブロック内にそれらを書き込むと、原子性が保証されます。

    簡単な例を挙げましょう。

    100個の要素を1か所に挿入します。

    lpush list 1 2 3 .. 100
    

    複数のクライアントがそれぞれこのluaブロックにアクセスしようとしています。ここでn値が5だとします。 1stclientが入り、最初の5つの要素が挿入されます。

    127.0.0.1:6379> lrange list -5 -1
    1) "5"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    

    それらをluaオブジェクトに保持し、削除します。

    127.0.0.1:6379> LTRIM list 0 -6
    OK
    

    それらをコードに戻すと、必要な結果は1 2 3 4 5になりますが、得られる結果は5 4 3 2 1.です。したがって、ループを逆にして操作を実行する必要があります。

    次のクライアントが来ると、次の値のセットを取得します。

    127.0.0.1:6379> lrange list -5 -1
    1) "10"
    2) "9"
    3) "8"
    4) "7"
    5) "6"
    

    このようにして、要件を達成できます。お役に立てれば。

    編集:

    Luaスクリプト:

    local result = redis.call('lrange', 'list','-5','-1')
    redis.call('ltrim','list','0','-6')
    return result
    


    1. docker-compose:コンテナ間のredis接続が拒否されました

    2. ScaleGridDBaaSforRedis™をAWSVirtualPrivate Cloud(VPC)にデプロイする

    3. Redis SETのパフォーマンスがGETよりも優れているのはなぜですか?

    4. mongoDBでユニオンクエリを作成する方法