Redisでよく使われるいくつかの機能
15084 ワード
Redisの特性:
Strings:Stringsデータ構造は簡単なkey-valueタイプで、valueは実はStringだけでなく、数字でもよい.常用コマンド:set,get,decr,incr,mgetなど.一般的な方法:リストコンテンツ取得文字列長文字列appendコンテンツ設定と取得文字列のあるコンテンツ設定と取得文字列のあるビット(bit)一括設定一連の文字列のコンテンツHashs:Redis Hash対応Value内部は実際にはHashMapであり、常用コマンド:hget,hset,hgetallなどである.Lists:Redis listの実装は双方向チェーンテーブルであり、逆検索と遍歴をサポートでき、操作が容易であるが、一部の追加メモリオーバーヘッドをもたらし、Redis内部の多くの実装、送信バッファキューなどもこのデータ構造を使用している.常用コマンド:lpush,rpush,lpop,rpop,lrangeなど.Sets:Sets集合の概念は、重複しない値の組み合わせです.Redisはまた集合に交差、並列、差分などの操作を提供し、共通の関心、共通の好み、2度の友达などの機能を非常に便利に実現することができる.常用コマンド:sadd,spop,smembers,sunionなど.Sorted Sets:Redis sorted setの使用シーンはsetと類似しており、setが自動的に秩序化されていないことを区別しています.sorted setは、ユーザが優先度(score)のパラメータを追加的に提供することによってメンバーをソートし、順序付け、すなわち自動ソートを挿入することができる.共通コマンド:zadd,zrange,zrem,zcardなど
≪値の保存|Save Value|emdw≫:このように保存すると、カウントに使用されます.そうしないと、エラーが発生します.
Strings:Stringsデータ構造は簡単なkey-valueタイプで、valueは実はStringだけでなく、数字でもよい.常用コマンド:set,get,decr,incr,mgetなど.一般的な方法:
数:
Redisはとても良いカウンタで、カウンタはRedisの原子性の自己増加操作が実現できる最も直感的なモードで、その考えはかなり簡単です:ある操作が発生するたびに、RedisにINCRコマンドを送信します。Webサイトへのアクセス数、登録ユーザー数、文章のいいね数、高同時秒殺活動、分散シーケンス番号生成などの統計カウント機能を使用して実現します。Redisはこのようなカウント問題を解決するのに手応えがあり、リレーショナル・データベースよりも高速で、リソースの消費が少ない。カウントはset()メソッドでリセットすることもできます。
≪値の保存|Save Value|emdw≫:このように保存すると、カウントに使用されます.そうしないと、エラーが発生します.
stringRedisTemplate.opsForValue().set("test","testValue",10);
/* */
@RequestMapping("/count")
@ResponseBody
public String count(){
ValueOperations opsForValues=Template.opsForValue();
// Value testValue
System.out.println(opsForValues.get("test").equalsIgnoreCase("testValue"));
for (int i = 4; i < 100; i++) {
// , key ,
// 0
opsForValues.increment("test", 1);
}
//
System.out.println(opsForValues.get("test")); //100
return "ok";
}
時間数
簡単なカウント以外に、例えば登録ユーザー数は日単位で統計する必要があり、処理方法は比較的簡単で、日付をカウンタkeyに持ち込めばよい場合があります。このように、他の方法で統計カウントを行うこともでき、key値に統計を追加するだけでよい。
@RequestMapping("/count2")
@ResponseBody
public String count2(){
String key="test_"+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
ValueOperations opsForValues=Template.opsForValue();
// Value testValue
System.out.println(opsForValues.get(key));
for (int i = 0; i < 100; i++) {
// , key ,
//
opsForValues.increment(key, 1);
}
//
System.out.println(opsForValues.get(key)); //100
return "ok";
}
ファジイキー値によるクエリー
条件付きでカウントするときにkey値に時間を加え、あるオブジェクトの統計数をクエリーするだけでファジイKey値クエリーを使用できる場合があります。
@RequestMapping("/like")
@ResponseBody
public String like(){
ValueOperations<String,String> opsForValues=Template.opsForValue();
// user key
Set<String> set=Template.keys("use*");
for (String s:set) {
String str=opsForValues.get(s);
// key value
}
return "ok";
}
hashsストレージを使用してjavaオブジェクトの変更を取得する
実際の開発では,ユーザのニックネーム,年齢,性別,積分など,クライアントのシーケンス化後に文字列の値として格納される構造化された情報をHashMapにパッケージ化することがしばしば行われているが,そのうちの1つを修正する必要がある場合には,通常,ある値を逆シーケンス化した後,ある値を修正し,シーケンス化して格納する必要がある.これにより、オーバーヘッドが増大するだけでなく、2つの同時操作が積分を修正する必要があるなど、同時操作の可能性のある場合にも適用されません。 一方、RedisのHash構造は、データベース内のUpdateの属性のように、属性値を1つだけ変更することができます。RedisのHash構造はオブジェクトの名前をredisのkey値、オブジェクトの一意属性値をhashのkey値、オブジェクトをredisのvalue値とする
@RequestMapping("/testHash")
@ResponseBody
public String testHash(){
User user=new User(1,"tom","123");
User user1=new User(2,"tom","123");
HashOperations hashOperations=Template.opsForHash();
// user=1
hashOperations.put("test",user.getId(),user1);
return "ok";
}
lists秩序化ストレージ読み込みの使用
N 。
@RequestMapping("/testList")
@ResponseBody
public String testList(){
//
ListOperations listOperations=Template.opsForList();
listOperations.leftPush("a","1");
listOperations.leftPush("a","2");
listOperations.leftPush("a","3");
listOperations.leftPush("a","4");
listOperations.leftPush("a","5");
listOperations.leftPush("a","6");
// 5 key-value
listOperations.trim("a",0,4); //[6, 5, 4, 3, 2]
System.out.println(listOperations.range("a",0,listOperations.size("a")-1));
//
return "ok";
}
setsストレージを使用して無秩序な差分セット、交差、およびセットを読み込む
//setストレージを使用して無秩序に差分セット、交差、およびセットを再求める
@RequestMapping("/testSet")
@ResponseBody
public String testSet(){
SetOperations set=Template.opsForSet();
set.add("test7_1", "2", "1","2","3","4","4","3");
set.add("test7_2", "2", "6","2","3","7","6","5");
System.out.println(" "+set.members("test7_1"));
System.out.println(" "+set.difference("test7_1", "test7_2"));
System.out.println(" "+set.intersect("test7_1", "test7_2"));
System.out.println(" "+set.union("test7_1", "test7_2"));
return "ok";
}
Sorted Setアクセスデータのソート
///Sorted Setアクセスデータソートsets保存時よりも重みパラメータscoreが1つ多く、このパラメータに従ってソートすることに相当します
@RequestMapping("/testzSet")
@ResponseBody
public String testzSet(){
ZSetOperations zSet = Template.opsForZSet();
zSet.add("test8", "use1", 9);
zSet.add("test8", "use2", 1);
zSet.add("test8", "use3", 5);
zSet.add("test8", "use4", 9);
// score
//zSet.incrementScore("test8", "use1", 1);
System.out.println(zSet.reverseRange("test8", 0, zSet.size("test8")-1));
// [use4, use1, use3, use2]
return "ok";
}