国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - 基于redis實現世界杯排行榜功能項目實戰

基于redis實現世界杯排行榜功能項目實戰

2019-11-18 15:59俊俊的小熊餅干 Redis

前段時間,做了一個世界杯競猜積分排行榜。對世界杯64場球賽勝負平進行猜測,猜對+1分,錯誤+0分,一人一場只能猜一次。下面通過本文給大家分享基于redis實現世界杯排行榜功能項目實戰,感興趣的朋友一起看看吧

需求

前段時間,做了一個世界杯競猜積分排行榜。對世界杯64場球賽勝負平進行猜測,猜對+1分,錯誤+0分,一人一場只能猜一次。

1.展示前一百名列表。

2.展示個人排名(如:張三,您當前的排名106579)。

分析

一開始打算直接使用mysql數據庫來做,遇到一個問題,每個人的分數都會變化,如何能夠獲取到個人的排名呢?數據庫可以通過分數進行row_num排序,但是這個方法需要進行全表掃描,當參與的人數達到10000的時候查詢就非常慢了。

redis的排行榜功能就完美鍥合了這個需求。來看看我是怎么實現的吧。

實現

一.redis sorts sets簡介

Sorted Sets數據類型就像是set和hash的混合。與sets一樣,Sorted Sets是唯一的,不重復的字符串組成。可以說Sorted Sets也是Sets的一種。

Sorted Sets是通過Skip List(跳躍表)和hash Table(哈希表)的雙端口數據結構實現的,因此每次添加元素時,Redis都會執行O(log(N))操作。所以當我們要求排序的時候,Redis根本不需要做任何工作了,早已經全部排好序了。元素的分數可以隨時更新。

二.springboot 中使用RedisTemplate

本文主要通過redisTemplate來操作redis,當然也可以使用redis-client,看個人喜好.

我在本機開啟了一個單點的redis,配置文件如下

?
1
2
3
4
5
6
7
8
9
10
11
server:
 port: 9001
spring:
 redis:
 database: 0
 url: redis://user:123@127.0.0.1:6379
 host: 127.0.0.1
 password: 123
 port: 6379
 ssl: false
 timeout: 5000

Maven依賴引入如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.4.RELEASE</version>
</parent>
 
<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 </dependency>
</dependencies>

三.代碼實現

1.注入redis,將key聲明為常量SCORE_RANK

?
1
2
3
@Autowired
private StringRedisTemplate redisTemplate;
public static final String SCORE_RANK = "score_rank";

2.新增默認排行數據

這里使用for循環創建集合,再使用批量新增10萬條數據

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 批量新增
*/
@Test
public void batchAdd() {
Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
DefaultTypedTuple<String> tuple = new DefaultTypedTuple<>("張三" + i, 1D + i);
tuples.add(tuple);
}
System.out.println("循環時間:" +( System.currentTimeMillis() - start));
Long num = redisTemplate.opsForZSet().add(SCORE_RANK, tuples);
System.out.println("批量新增時間:" +(System.currentTimeMillis() - start));
System.out.println("受影響行數:" + num);
}

//輸出
循環時間:56
批量新增時間:1015
受影響行數:100000

3.獲取前10名(根據分數倒序)

提供了兩種獲取方法,返回值一個帶有score,一個沒有

?
1
2
3
4
5
6
7
8
9
10
11
/**
* 獲取排行列表
*/
@Test
public void list() {
 
Set<String> range = redisTemplate.opsForZSet().reverseRange(SCORE_RANK, 0, 10);
System.out.println("獲取到的排行列表:" + JSON.toJSONString(range));
Set<ZSetOperations.TypedTuple<String>> rangeWithScores = redisTemplate.opsForZSet().reverseRangeWithScores(SCORE_RANK, 0, 10);
System.out.println("獲取到的排行和分數列表:" + JSON.toJSONString(rangeWithScores));
}
?
1
2
3
//輸出
獲取到的排行列表:["張三99999","張三99998","張三99997","張三99996","張三99995","張三99994","張三99993","張三99992","張三99991","張三99990","張三99989"]
獲取到的排行和分數列表:[{"score":100000.0,"value":"張三99999"},{"score":99999.0,"value":"張三99998"},{"score":99998.0,"value":"張三99997"},{"score":99997.0,"value":"張三99996"},{"score":99996.0,"value":"張三99995"},{"score":99995.0,"value":"張三99994"},{"score":99994.0,"value":"張三99993"},{"score":99993.0,"value":"張三99992"},{"score":99992.0,"value":"張三99991"},{"score":99991.0,"value":"張三99990"},{"score":99990.0,"value":"張三99989"}]

4.新增李四的分數

將“李四”加入到排行榜中,redis會在插入的時候進行,在取出的時候就可以直接取出,不需要再做排序操作

?
1
2
3
4
5
6
7
/**
* 單個新增
*/
@Test
public void add() {
redisTemplate.opsForZSet().add(SCORE_RANK, "李四", 8899);
}

5.獲取李四單人的排行

 

?
1
2
3
4
5
6
7
8
9
10
11
/**
* 獲取單個的排行
*/
@Test
public void find(){
Long rankNum = redisTemplate.opsForZSet().reverseRank(SCORE_RANK, "李四");
System.out.println("李四的個人排名:" + rankNum);
 
Double score = redisTemplate.opsForZSet().score(SCORE_RANK, "李四");
System.out.println("李四的分數:" + score);
}

//輸出
李四的個人排名:91101
李四的分數:8899.0

6.統計分數區間人數

redis還提供了統計分數區間的方法,如下

?
1
2
3
4
5
6
7
8
/**
* 統計兩個分數之間的人數
*/
@Test
public void count(){
Long count = redisTemplate.opsForZSet().count(SCORE_RANK, 8001, 9000);
System.out.println("統計8001-9000之間的人數:" + count);
}

//輸出
統計8001-9000之間的人數:1001

 7.獲取集合的基數(數量大小)

?
1
2
3
4
5
6
7
8
/**
* 獲取整個集合的基數(數量大小)
*/
@Test
public void zCard(){
Long aLong = redisTemplate.opsForZSet().zCard(SCORE_RANK);
System.out.println("集合的基數為:" + aLong);
}

 

//輸出
集合的基數為:100001

 8.使用加法操作分數

這個方法是直接在原有的score上使用加法;如果沒有這個元素,則會創建,并且score初始為0.再使用加法

?
1
2
3
4
5
6
7
8
/**
* 使用加法操作分數
*/
@Test
public void incrementScore(){
Double score = redisTemplate.opsForZSet().incrementScore(SCORE_RANK, "李四", 1000);
System.out.println("李四分數+1000后:" + score);
}

//輸出
李四分數+1000后:9899.0

四.歸納

在以上測試類中我們使用了redis的那些功能呢?在以上的例子中我們使用了單個新增,批量新增,獲取前十,獲取單人排名這些操作,但是redisTemplate還提供了更多的方法。

新增or更新

有三種方式,一種是單個,一種是批量,對分數使用加法(如果不存在,則從0開始加)。

?
1
2
3
4
5
6
//單個新增or更新
Boolean add(K key, V value, double score);
//批量新增or更新
Long add(K key, Set<TypedTuple<V>> tuples);
//使用加法操作分數
Double incrementScore(K key, V value, double delta);

刪除

 刪除提供了三種方式:通過key/values刪除,通過排名區間刪除,通過分數區間刪除。

?
1
2
3
4
5
6
//通過key/value刪除
Long remove(K key, Object... values);
//通過排名區間刪除
Long removeRange(K key, long start, long end);
//通過分數區間刪除
Long removeRangeByScore(K key, double min, double max);

1.列表查詢:

分為兩大類,正序和逆序。以下只列表正序的,逆序的只需在方法前加上reverse即可

?
1
2
3
4
5
6
7
8
9
10
11
12
//通過排名區間獲取列表值集合
Set<V> range(K key, long start, long end);
//通過排名區間獲取列表值和分數集合
Set<TypedTuple<V>> rangeWithScores(K key, long start, long end);
//通過分數區間獲取列表值集合
Set<V> rangeByScore(K key, double min, double max);
//通過分數區間獲取列表值和分數集合
Set<TypedTuple<V>> rangeByScoreWithScores(K key, double min, double max);
//通過Range對象刪選再獲取集合排行
Set<V> rangeByLex(K key, Range range);
//通過Range對象刪選再獲取limit數量的集合排行
Set<V> rangeByLex(K key, Range range, Limit limit);

2.單人查詢

可獲取單人排行,和通過key/value獲取分數。以下只列表正序的,逆序的只需在方法前加上reverse即可

?
1
2
3
4
//獲取個人排行
Long rank(K key, Object o);
//獲取個人分數
Double score(K key, Object o);

統計

統計分數區間的人數,統計集合基數。

?
1
2
3
4
//統計分數區間的人數
Long count(K key, double min, double max);
//統計集合基數
Long zCard(K key);

結語

以上就是redis中使用排行榜功能的一些例子,和對redis的操作方法了。redis不僅僅只是作為緩存,它更是數據庫,提供了許多的功能,我們都可以好好的利用。

在這里我使用redis來實現了世界杯積分排行的展示,無論是在批量更新或是獲取個人排行等方便,都有著很高效率,也降低了對數據庫操作的壓力,達到了很好的效果。

原文鏈接:https://www.cnblogs.com/wenjunwei/p/9754346.html

延伸 · 閱讀

精彩推薦
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
主站蜘蛛池模板: 91尤物网站网红尤物福利 | 亚洲一区二区三区免费看 | 欧美影院 | 99精品一区二区三区 | 国产视频一二区 | 欧美成人精品激情在线观看 | 日韩精品一区二区在线观看 | 在线播放黄 | 久草社区 | 国产日韩精品一区 | 超碰8| 一区二区视频免费 | 精品动漫一区 | av在线一区二区 | aaa在线免费观看 | 一区二区精品视频 | 91仓库 | 国产最好的精华液网站 | 噜噜噜噜噜色 | 国产资源免费观看 | 欧美激情久久久久久 | 高清xxxx| 久久久精品日本 | 免费成人在线观看 | 在线影院av | 久久高清片 | 精品国产三级 | 国产亚洲精品久久久久久久 | 日韩欧美国产一区二区三区 | 日韩欧美国产精品 | 久久精品无码一区二区日韩av | 天堂中文资源在线 | 久久综合伊人 | 国产精品美女 | 九九热视频在线 | 午夜精品一区二区三区在线视频 | 日韩中文字幕视频在线观看 | 精品免费一区 | 韩日精品视频 | 日本免费视频 | 欧美日韩精品在线观看 |