redisによる商品ランキングの実現
前言ランキングは、インターネットアプリケーションの中でほとんど欠かせない要素として、人間自身の対比意欲を引き出し、商品の販売量を増やすことができる.ランキングの実装方式はほぼ大同小異であり,大部分はRedisの秩序化集合sorted setに基づいて実装されている.本稿では、商品販売ランキングというモデルを通して、プレゼンテーションを行います.また、この文章に基づいて、文章のいいねランキング、ポイントランキングなどを実現することもできます.プロジェクトGithubアドレス:https://github.com/haoxiaoyong1014/springboot-redis-examples/tree/master/springboot-redis-ranking需要
1、商品販売量別ランキング2、指定商品のランキング3を取得でき、リアルタイムの販売動向を表示する
まず、効果図を見てみましょう.
準備作業:2つのkey値を定義する
二、依存を追加する:
三、本例で使用するすべてのredisコマンド:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
ZREVRANK
ZREVRANK key member
秩序セットkeyのメンバーメンバーメンバーのランキングを返します.ここで、整列セットメンバーはscore値の減算(大きいから小さい)でソートされます.ランキングは0で、つまりscore値が最大のメンバーは0です.
例:
戻り値:
プロジェクトで使用するインスタンス:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
LINDEX
LINDEX key index
リストkeyにindexと表示される要素を返します.
例:
戻り値:
プロジェクトの例:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
ZINCRBY
ZINCRBY key increment member
シーケンスセットkeyのメンバーメンバーメンバーのscore値にインクリメンタルincrementを加え、keyが存在しない場合、またはメンバーがkeyのメンバーでない場合、ZINCRBY key incrementメンバーはZADD key incrementメンバーに等しい
例:
戻り値:
プロジェクトのインスタンス:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
LPUSH
LPUSH key value [value …]
リストkeyのヘッダーに1つ以上の値valueを挿入
例:
戻り値:
プロジェクトの例:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
zrevrangeWithScores
zrevrangeWithScores key start,end
下付きstartからendまでのデータを取り出します
戻り値:
プロジェクトの例:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
DEL
DEL key [key …]
指定した1つ以上のキーを削除すると、存在しないキーは無視されます.
例:
戻り値:
プロジェクトのインスタンス:
このプロジェクトで使用されるすべてのコマンドについて説明します.詳細なコマンドは、以下を参照してください.http://doc.redisfans.com/、皆さんが練習することをお勧めします.
1、商品販売量別ランキング2、指定商品のランキング3を取得でき、リアルタイムの販売動向を表示する
まず、効果図を見てみましょう.
準備作業:2つのkey値を定義する
public static String SALES_LIST = "phone:sales:list";
public static String BUY_DYNAMIC = "phone:buy:dynamic"
public static String separator = "#";
二、依存を追加する:
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>2.7.3version>
dependency>
三、本例で使用するすべてのredisコマンド:
販売ランキングでその商品のランキングを獲得する
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
ZREVRANK
ZREVRANK key member
秩序セットkeyのメンバーメンバーメンバーのランキングを返します.ここで、整列セットメンバーはscore値の減算(大きいから小さい)でソートされます.ランキングは0で、つまりscore値が最大のメンバーは0です.
例:
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES #
1) "jack"
2) "2000"
3) "peter"
4) "3500"
5) "tom"
6) "5000"
redis> ZREVRANK salary peter # peter
(integer) 1
redis> ZREVRANK salary tom # tom
(integer) 0
戻り値:
member key , member 。
member key , null 。
プロジェクトで使用するインスタンス:
@Override
public int phoneRank(int phoneId) {
// , 0 , null -1
Long zrank = jedis.zrevrank(Constants.SALES_LIST, String.valueOf(phoneId));
return zrank == null ? -1 : zrank.intValue();
}
販売動態を獲得する:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
LINDEX
LINDEX key index
リストkeyにindexと表示される要素を返します.
例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3 # index mylist
(nil)
戻り値:
index 。
index (out of range), nil 。
プロジェクトの例:
@Override
public List getBuyDynamic() {
List dynamicList = new ArrayList();
for (int i = 0; i < 3; i++) {
/* jedis.lindex(String key,int index)
* 。0 ,1
*/
String result = jedis.lindex(Constants.BUY_DYNAMIC, i);
if (StringUtils.isEmpty(result)) {
break;
}
String[] arr = result.split(Constants.separator);
long time = Long.valueOf(arr[0]);
String phone = arr[1];
DynamicInfo vo = new DynamicInfo();
vo.setPhone(phone);
vo.setTime(StringUtil.showTime(new Date(time)));
dynamicList.add(vo);
}
商品を購入する
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
ZINCRBY
ZINCRBY key increment member
シーケンスセットkeyのメンバーメンバーメンバーのscore値にインクリメンタルincrementを加え、keyが存在しない場合、またはメンバーがkeyのメンバーでない場合、ZINCRBY key incrementメンバーはZADD key incrementメンバーに等しい
例:
redis> ZSCORE salary tom
"2000"
redis> ZINCRBY salary 2000 tom # tom !
"4000"
戻り値:
member score ,
プロジェクトのインスタンス:
@Override
public void buyPhone(int phoneId) {
// 1
jedis.zincrby(Constants.SALES_LIST, 1, String.valueOf(phoneId));
//
long currentTimeMillis = System.currentTimeMillis();
String msg = currentTimeMillis + Constants.separator + phones.get(phoneId - 1).getName();
// key (LPUSH) (RPUSH)
jedis.lpush(Constants.BUY_DYNAMIC, msg);
}
購買動態の追加:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
LPUSH
LPUSH key value [value …]
リストkeyのヘッダーに1つ以上の値valueを挿入
例:
#
redis> LPUSH languages python
(integer) 1
#
redis> LPUSH languages python
(integer) 2
redis> LRANGE languages 0 -1 #
1) "python"
2) "python"
#
redis> LPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"
戻り値:
LPUSH , 。
プロジェクトの例:
String msg = currentTimeMillis + Constants.separator + phones.get(phoneId - 1).getName();
// key (LPUSH) (RPUSH)
jedis.lpush(Constants.BUY_DYNAMIC, msg);
売上ランキングの取得
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
zrevrangeWithScores
zrevrangeWithScores key start,end
下付きstartからendまでのデータを取り出します
戻り値:
Set<Tuple>
プロジェクトの例:
@Override
public List<PhoneInfo> getPhbList() {
// ,
Set<Tuple> tuples = jedis.zrevrangeWithScores(Constants.SALES_LIST, 0, 4);
List<PhoneInfo> list = new ArrayList<PhoneInfo>();
for (Tuple tuple : tuples) {
PhoneInfo vo = new PhoneInfo();
// phoneId
int phoneId = Integer.parseInt(tuple.getElement());
vo.setName(phones.get(phoneId - 1).getName());
vo.setSales((int) tuple.getScore());
list.add(vo);
}
return list;
}
ランキングをリセット:
コマンド#コマンド#
≪インスタンス|Instance|emdw≫
説明
DEL
DEL key [key …]
指定した1つ以上のキーを削除すると、存在しないキーは無視されます.
例:
# key
redis> SET name huangz
OK
redis> DEL name
(integer) 1
# key
redis> EXISTS phone
(integer) 0
redis> DEL phone # , key
(integer) 0
# key
redis> SET name "redis"
OK
redis> SET type "key-value store"
OK
redis> SET website "redis.com"
OK
redis> DEL name type website
(integer) 3
戻り値:
key 。
プロジェクトのインスタンス:
@Override
public void clear() {
jedis.del(Constants.SALES_LIST);
jedis.del(Constants.BUY_DYNAMIC);
}
このプロジェクトで使用されるすべてのコマンドについて説明します.詳細なコマンドは、以下を参照してください.http://doc.redisfans.com/、皆さんが練習することをお勧めします.
紙の上で得たのは結局浅く感じて、この事がお辞儀をすることを絶対に知っています。--『冬夜読書示子聿』より