1. ホーム
  2. データベース
  3. レディス

JAVAでRedisの5つのデータ構造を利用する方法

2022-01-20 01:16:05

データ構造

Redisには5つの基本データ構造があり、それらは以下の通りです。

1. 文字列(string)

2、リスト(list)

3、hash(dictionary)

4、セット(set)

5、zset(順序付きセット)

次は、各データ構造の紹介と共通命令、そしてJAVAでのカプセル化の方法について見ていきましょう!

<スパン 文字列

文字列の紹介

文字列構造は非常に広く使われており、よく使われるのはユーザー情報をキャッシュすることである。例えば、ブロガーの"八百屋実践コラム"の八百屋プロジェクト、メール認証時に生成されるメール認証コードなどです。

保存するオブジェクト情報をJSONで文字列にシリアライズし、シリアライズした文字列をRedisでキャッシュします。格納された情報を取得する際には、デシリアライズ操作を行うだけです。

Redisの文字列はJavaの文字列と異なり、Javaの文字列は最終的な文字列であるのに対し、Redisの文字列は変更可能な動的文字列であり、内部の実装構造はJavaのArrayListに似ており、あらかじめ割り当てられた冗長領域を用いて頻繁なメモリ割り当てを軽減している点が異なります。

どちらもRedisは実際の文字列より大きな容量(スペース)を確保し、拡張時には既存のスペースを2倍にします。しかし、文字列の最大長は512MBである。

set、get、exists、delなどの一般的な操作は以下の通りです。

もちろん、mset, mgetで一括して読み書きすることも可能です。

我々は、すべてのいくつかのデータは、我々はそれが長い時間のためのキャッシュに格納させないことを知っているので、対応する有効期限を設定するには、expire、setexによってそれを設定することができ、あなたが作成するキー値が存在するかどうかを判断するためにsexnxを使用することができます。

値が整数の場合、incr, decr, incrby, decrbyで増加、減少させることも可能です。注意すべきは、符号付きlongの最大値と最小値の間を返すことで、この範囲外になると、次のようにエラーが報告される。

Javaにおける文字列のカプセル化

(注:以下は文字列型ツールクラスの完全な記述のみで、他のデータ構造は部分的にしか記載されていません)

pom.xmlに依存関係を導入する。

        <! -- redis dependency package -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>


この設定は、ymlファイルまたはプロパティファイルで行うことができますので、お好みのものをお選びください。

# yml file configuration
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:
    jedis:
      pool:
        #max-connections for the connection pool (use negative values to indicate no limit)
        max-active: 20
        #max-wait time for connection pool blocking (use negative values to indicate no limit)
        max-wait: -1
        #Max idle connections in the connection pool
        max-idle: 20
        #Minimum idle connections in the connection pool
        min-idle: 2
    #Connection timeout (milliseconds)
    timeout: 5000


# properties file configuration
# Redis server address
spring.redis.host=127.0.0.1
#Redis server connection port
spring.redis.port=6379
#Redis database index (default is 0)
spring.redis.database=0
#max connections for the connection pool (use negative values to indicate no limit)
spring.redis.jedis.pool.max-active=50
#max-blocking-wait-time for connection pools (use negative values to indicate no limit)
spring.redis.jedis.pool.max-wait=3000
#Max idle connections in the connection pool
spring.redis.jedis.pool.max-idle=20
#Minimum idle connections in the connection pool
spring.redis.jedis.pool.min-idle=2
# connection timeout (milliseconds)
spring.redis.timeout=5000


次に、Redisツールクラスを書きます。

package com.gantiexia.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

TimeUnit; /**
 * @author GanTieXia
 * @date 2021/11/21 18:07
 *
@Component
public class RedisUtils {

    /* Just inject it after introducing the corresponding dependencies *    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * Read the cache
     *
     * @param key
     * @return
     *    public String get(final String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * Write to cache
     *    public boolean set(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * with expiration time key
     *
     * @param key
     * @param value
     * @param timeOut
     * @param timeUnit
     * @return
     *    public boolean setKeyTimeOut(final String key,String value,long timeOut,TimeUnit timeUnit){
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value, timeOut, timeUnit);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Update the cache
     *    public boolean getAndSet(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().getAndSet(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Delete the cache
     *    public boolean delete(final String key) {
        boolean result = false;
        try {
            redisTemplate.delete(key);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}



リストリスト

リスト一覧 はじめに

Redisのリストは、JavaのLinkedListに相当しますが、配列ではなくリンクリストです。そして、これは挿入と削除が非常に高速である一方、インデックスの位置決めは遅くなることを意味します。

リストの各要素は双方向ポインタを用いてリンクされており、前方および後方のトラバーサルをサポートしています。データ構造は、リストの最後の要素がポップアップされ、メモリが再利用されると自動的に削除される。

Redisのリスト構造は、非同期キューとして使用することができます。遅延させる必要のあるタスク構造を文字列にシリアライズし、Redisリストに格納し、別のスレッドがリストからデータを取得して処理できるようにします。

キュー

待ち行列が先入れ先出しのデータ構造であることはよく知られていますが、よく耳にするメッセージ待ち行列でも、要素への順次アクセスを確保するために利用することが可能です。

スタック

スタックは先入れ先出しのデータ結果であり、一般的にwithdrawを使うのと同じである。

また,lindex,lrange 0 -1 (最後の要素は-1,最後から2番目の要素は-2) で対応する位置の要素をすべて取得し,ltrim である区間の要素を残し,それ以外の位置の要素を切り落とすことも可能です.しかし,これらの操作の時間計算量はO(n)なので,一般には推奨されない.

Javaでリストをラップする

(完全なコードについては、上記の文字列ラッパーを参照してください)

// Pass in as many parameters as you need
// The main statement of the set method
redisTemplate.opsForList(). ; // . The later methods are written according to your application scenario


ハッシュ(辞書)

ハッシュ辞書の紹介

Redisの辞書は、JAVAでいうところのHashMapに相当するものです。辞書を必要とせず、内部に多くのKey-Valueペアを格納することができる辞書です。

また、HashMapの概念モデルについては、ブログ主さんの中で JAVA上級編~HashMapの基礎となる実装分析(a) とてもわかりやすく解説されています。

javaのHashMapは、辞書が非常に大きい場合、リハッシュは非常に時間のかかる操作です、あなたは一度にすべてを再ハッシュする必要があります。

プログレッシブ・リハッシュ戦略とは、リハッシュ時に新旧両方のハッシュ構造を保持し、同時に両方のハッシュ構造に問い合わせを行うものである。最後のハッシュ要素が移動した後、古いハッシュ構造は削除され、メモリは再利用される。

例えば、ユーザー情報を格納する場合、文字列をそのままシリアライズして格納し、欲しい情報を得るためにはデシリアライズする必要があります。ハッシュを使えば、ユーザー構造体のすべてのフィールドを格納できるので、例えばユーザー名を取得したい場合、ユーザー情報全体を取得する必要がなく、ネットワークトラフィックを節約できます。

しかし、ハッシュ構造は単一の文字列よりも多くのストレージを消費するという欠点があります。

次に、操作について見てみましょう。

Javaでハッシュ辞書をラッピングする

(完全なコードについては、上記の文字列のカプセル化を参照してください)

// Pass in as many parameters as you need
// The main statement of the set method
redisTemplate.opsForHash(). ; // . The later methods are written according to your application scenario


set(セット)

セット内容紹介

Redisのセットは、JavaのHashSetに相当し、内部のキーは順序がなくユニークで、Javaでは一般的にセットの重複を排除するために使用されます。

Redisコレクションの内部に相当するのは特殊な辞書で、各キーの値はNULLであり、他のデータ構造と同様に、最後の要素が削除されるとデータ構造が削除され、メモリが再利用される。

次に、操作説明を見てみましょう。

Javaでセットコレクションをラッピングする

(完全なコードについては、上記の文字列のカプセル化を参照してください)

// Pass in as many parameters as you need
// The main statement of the set method
redisTemplate.opsForSet(). ; //. The later methods are written according to your application scenario


zset(順序付きリスト)

zset 順序付きリスト

zsetはまた、内部値の一意性を保証し、各値にスコアを割り当て、値のソートされた重みを表します。

zsetはどのようなことに使えるのですか?例えば、ファンリストを開くと、valueにはユーザー情報、scoreにはフォロータイムが格納されており、ファンリストをフォロータイム順に表示することができる...など、ここではあまり詳しく説明しませんが、このようなことができます。

次の操作を見てみましょう。

Javaでzset順序付きリストをラッピングする

(完全なコードについては、上記の文字列ラッパーを参照してください)

// Pass in as many parameters as you need
// The main statement of the set method
redisTemplate.opsForZSet(). ; // . The later methods are written according to your application scenario


以上、Redisの5つのデータ構造をJAVAでカプセル化する方法について説明しました。Redisに関する詳しい情報は、BinaryDevelopの過去の記事を検索するか、以下の記事を引き続きご覧ください。