1.コマンド
ストリング
set name xiaoming
get name
exprie name 5 #5秒过期
setex name 5 xiaohong
setnx name #不存在时设置
set age 10
incr age #对于数字可以增加1
incrby age 10
#批量操作
mset name xiaoming age 10
mget name age
リスト
左右添加、左右删除
lpush books java python c++
lpop books
rpush c
rpop books
lindex books 1 #获取下标为1的元素(下标从0开始)
lindex books -1 #获取倒数第一个元素
注意下标从右往左计数。另外没有rindex命令。
lrange books 0 -1 #获取0到倒数第一个元素,即全部元素
ltrim books 1 -1 #保留下标1到最后一个元素,删除其它元素。即删除第一个元素
ltrim books -1 -1 #保留最后一个元素
ltrim books 2 3 #保留下标2到下标3的元素
基礎となる構造:クイックリスト、双方向ポインターで接続されたzipList
ハッシュ
hset nums one 1 #添加值
hget nums one #获取值
hgetall nums #获取所有键值对
hmset nums two 2 three 3 #批量添加
hmget nums one two #批量获取
hincrby nums one 1 #对value为int的键值对进行加法操作
基礎となる構造:配列+リンクリスト
セットする
sadd books python #添加元素
smembers books #列出所有元素
sismember books java #判断元素是否存在
scard books #列出set中元素个数
spop books #弹出一个元素。弹出规则?
基礎となる構造:ハッシュに基づいて、値はnullに設定されます
ZSET
これは、Redis独自のデータ構造です。一方では、それは内部値の一意性を保証するセットです。一方、各値にスコアを割り当てることができます。これは、この値のソートの重みを表します。スコアで小さいものから大きいものへと並べ替えます。
#添加元素时要带着一个权重值
zadd books 9.0 "think in java"
zadd books 8.9 "java concurrency"
zadd books 8.6 "java cookbook"
zrange books 0 -1 #按score从小到大排序列出
zrevrange books 0 -1 #按score逆序排列
zcard books #获取元素个数
zscore books "think in java" #获取元素的score
zrank books "think in java" #获取位次,从0开始,低到高排序
zrangebyscore books 0 8.91 #获取分值区间内的元素
zrangebyscore books -inf 8.91 withscore #-inf表示负无穷,withscore表示列出分数
zrem books "java concurrency" #删除value
基礎となる構造:テーブルをスキップ
一般的なルール
リスト、ハッシュ、セット、およびzsetの4つのコンテナータイプには、2つの一般的なルールがあります。
(1)存在しない場合は作成する
(2)要素がない場合は削除する
有効期限
すべてのタイプの要素でexpireを使用して有効期限を設定できます。有効期限はデータ全体にのみ設定できます。たとえば、ハッシュ内のキーに有効期限を設定することはできません。
削除コマンド
すべてのタイプはdelで削除できます
2.Jedisを使用してRedisを操作します
依存関係を導入します。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.5.1</version>
</dependency>
Redisに接続する
/**
* 连接Redis
* */
public static Jedis connectJedis() {
Jedis jedis = new Jedis("localhost");
return jedis;
}
コマンドの実行
Jedisオブジェクトを介してコマンドを実行します
//Jedis中的方法和Redis命令基本是一一对应的
Jedis jedis = ConnectRedis.connectJedis();
jedis.set("name","xiaoming");
jedis.get("name");
jedis.hmset(key,hashmap);
思考:構造情報を格納するためにハッシュまたは文字列を使用しますか?
使用シナリオによると、原則はクエリの数をできるだけ減らすことです。
それぞれがフィールドの1つ(ハッシュ)のみを使用しますか?それでもすべてのフィールド(文字列)が必要ですか?
ハッシュはシリアル化および逆シリアル化する必要はありませんが、この部分のパフォーマンスの低下に耐えることができますか?
3.分散ロック
バージョン1:
setnx lock true
//执行业务逻辑
del lock
setnxを使用してロックをプリエンプションします。最初に成功した実行のみが、ロックを取得できます。
最後に、delを使用してロックを削除します。
問題:ビジネスロジックの実行中に例外が発生し、削除操作が正常に実行されない場合、他のプロセスはロックをプリエンプションできません。
バージョン2:
setnx lock true
expire lock 5
//执行业务逻辑
del lock
ロックに有効期限を追加すると、タスクが完了していなくても、有効期限が切れるとロックが解除されます。
問題:ロックのプリエンプトと有効期限の設定は2つのステートメントです。最初のステートメントの実行後にプログラムがクラッシュし、有効期限を追加できない場合、バージョン1と同じ問題が発生します。
バージョン3:
1つの命令を使用して、setnxを実行し、同時に期限切れにする
set lock true ex 5 nx
//执行业务逻辑
del lock
上記の問題を回避するために、ロックのプリエンプションと有効期限の設定が1つのステートメントで実行されます。ロックを解除する必要があります。
問題:有効期限が切れてもビジネスコードが実行されない場合、ロックが解除されます。このとき、他のプロセスがロックをプリエンプトし、同時実行の問題を引き起こす可能性があります。
Redissionはどのように分散ロックを実装しますか?上記の問題は解決しましたか?redLockとは何ですか?
Redissionはロックを取得した後、ウォッチドッグスレッドを開始して、タスクがまだロックを保持しているかどうかを継続的に判断し、保持されている場合は更新します。デフォルトは、更新ごとに30秒です。タスクの実行後にロックが期限切れになる状況は避けてください。
マシンがダウンしていて、ロックが解除されていないということは起こりますか?マシンがダウンしているため、更新されたスレッドは実行されず、時間になるとロックが自然に解放されます。通常の実行が完了すると、ロックが解除されるとウォッチドッグスレッドも停止します。
問題は依然として存在します。ロックがマスターに設定されてから、マスター/スレーブレプリケーションが実行されますが、マスターがダウンし、スレーブがマスターになりますが、ロック情報が設定されていません。その後、ロックのプロセスが成功し、ロックが2回取得される可能性があります。
解決策:複数のマスターを使用する場合、マスター-軟膏構造は適用できません。RedLockアルゴリズムは、set lock true ex 5 nxコマンドをすべてのマシンに送信します。マシンの半分以上が正常に設定された場合にのみ、ロックは成功したと見なされます。実行が完了した後、delを使用して削除します。