亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

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

2020-10-28 21:31:59
字體:
來源:轉載
供稿:網友

題外話:

小編先給大家推薦一個不錯的微信公眾號:

感興趣的朋友可以關注小編的微信公眾號【碼農那點事兒】,更多網頁制作特效源碼及學習干貨哦?。。?br />

需求

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

1.展示前一百名列表。

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

分析

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

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

實現

一.redis sorts sets簡介

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

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

二.springboot 中使用RedisTemplate

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

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

server: port: 9001spring: 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依賴引入如下

<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

 @Autowired private StringRedisTemplate redisTemplate; public static final String SCORE_RANK = "score_rank";

2.新增默認排行數據

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

 /** * 批量新增 */ @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,一個沒有

 /** * 獲取排行列表 */ @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)); }
//輸出獲取到的排行列表:["張三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會在插入的時候進行,在取出的時候就可以直接取出,不需要再做排序操作

 /** * 單個新增 */ @Test public void add() { redisTemplate.opsForZSet().add(SCORE_RANK, "李四", 8899); }

5.獲取李四單人的排行

 /** * 獲取單個的排行 */ @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還提供了統計分數區間的方法,如下

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

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

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

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

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

 8.使用加法操作分數

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

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

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

四.歸納

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

新增or更新

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

//單個新增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刪除,通過排名區間刪除,通過分數區間刪除。

//通過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即可

//通過排名區間獲取列表值集合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即可

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

統計

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

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

結語

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产另类久久精品| 国产日韩精品在线播放| 在线国产精品视频| 中文字幕成人精品久久不卡| 尤物yw午夜国产精品视频明星| 久久男人的天堂| 久久久久久18| 久久成人这里只有精品| 欧美精品激情视频| 国产精品看片资源| 精品国产一区二区三区在线观看| 亚洲国产日韩欧美在线动漫| 亚洲欧美自拍一区| 美女福利精品视频| 97久久精品国产| 欧美日韩久久久久| 中文字幕亚洲综合久久| 久久久999国产精品| 国产亚洲精品美女久久久久| 国产一区在线播放| 一区国产精品视频| 国产欧美一区二区白浆黑人| 色yeye香蕉凹凸一区二区av| 欧美激情图片区| 国产精品久久久久久久久久久久| 日韩精品视频在线观看网址| 欧美午夜激情在线| 亚洲欧美精品中文字幕在线| 综合久久五月天| 欧美重口另类videos人妖| 欧美精品日韩www.p站| 国产色综合天天综合网| 欧美中文在线观看国产| 欧美性20hd另类| 国产噜噜噜噜久久久久久久久| 欧美成人免费在线观看| 亚洲欧洲一区二区三区久久| 精品久久久久久中文字幕大豆网| 精品国内亚洲在观看18黄| 国产精品视频白浆免费视频| 国产不卡精品视男人的天堂| 国产精品成人一区二区三区吃奶| 欧美黑人一级爽快片淫片高清| 国产精品入口日韩视频大尺度| 精品在线观看国产| 久久国产精品久久精品| 国产亚洲精品久久久久动| 亚洲欧美综合v| 一本色道久久综合狠狠躁篇的优点| 国产v综合ⅴ日韩v欧美大片| 日韩第一页在线| 精品久久香蕉国产线看观看gif| 欧美国产日韩在线| 久久久国产精品亚洲一区| 欧美激情精品久久久久久蜜臀| 韩曰欧美视频免费观看| 91国内揄拍国内精品对白| 成人做爰www免费看视频网站| 97在线日本国产| 欧美电影免费在线观看| 久久精品国产v日韩v亚洲| 亚洲a∨日韩av高清在线观看| 亚洲视频在线播放| 国产精品成人观看视频国产奇米| 欧美日本亚洲视频| 亚洲一区二区在线| 国产成人精品久久| 亚洲美女动态图120秒| 欧美成人精品在线| 欧美精品激情在线观看| 亚洲香蕉伊综合在人在线视看| 日韩电影网在线| 欧美日韩国产成人高清视频| 国产精品第一区| 国内精品国产三级国产在线专| 成人免费网视频| 爱福利视频一区| 精品视频一区在线视频| 欧美成人午夜激情在线| 高清在线视频日韩欧美| 91精品国产综合久久久久久蜜臀| 欧美国产极速在线| 热久久这里只有精品| 久久夜精品va视频免费观看| 亚洲国模精品一区| 国产精品黄页免费高清在线观看| 精品亚洲夜色av98在线观看| 岛国精品视频在线播放| 日本精品在线视频| 91探花福利精品国产自产在线| 精品福利一区二区| 亚洲欧美国产精品久久久久久久| 欧美电影院免费观看| 2019日本中文字幕| 亚洲一区二区三区xxx视频| 亚洲视频第一页| 亚洲欧美日本伦理| 欧美性猛交xxxx久久久| 亚洲国产欧美一区| 在线观看国产成人av片| 色偷偷偷亚洲综合网另类| 欧美性xxxx极品hd欧美风情| 日本韩国欧美精品大片卡二| 亚洲精品国产精品自产a区红杏吧| 国产脚交av在线一区二区| 亚洲丝袜在线视频| 97色在线播放视频| 国产精品欧美久久久| 综合136福利视频在线| 国产精品自拍偷拍| 欧美成人精品在线播放| 92版电视剧仙鹤神针在线观看| 国产欧美日韩中文| 欧美大片网站在线观看| 中文字幕少妇一区二区三区| 日韩中文字幕精品| 欧美亚洲伦理www| 国产日韩av高清| 日本不卡免费高清视频| 亚洲精品短视频| 亚洲乱码一区av黑人高潮| 国产中文欧美精品| 中文字幕视频一区二区在线有码| 国内精品模特av私拍在线观看| 欧美在线精品免播放器视频| 欧美日韩在线视频一区二区| 久久综合久中文字幕青草| 国产欧美日韩视频| 欧美成人久久久| 亚洲成人av在线播放| 性欧美办公室18xxxxhd| 亚洲美女www午夜| 亚洲欧美日韩精品久久亚洲区| 色琪琪综合男人的天堂aⅴ视频| 欧美日韩一区二区免费视频| 啪一啪鲁一鲁2019在线视频| 亚洲色图第一页| 亚洲成人a级网| 精品少妇一区二区30p| 国产精品6699| 久久精品视频在线观看| 136fldh精品导航福利| 亚洲成人精品视频在线观看| 中文字幕欧美精品日韩中文字幕| 久久av红桃一区二区小说| www.美女亚洲精品| 久久视频在线看| 这里只有视频精品| 成人国内精品久久久久一区| 久久久免费观看视频| 久久久免费精品| 高清在线视频日韩欧美| 中文字幕在线亚洲| 日韩免费在线电影| 日韩欧美国产成人| 青草热久免费精品视频| 欧美成人免费全部| 久久99精品国产99久久6尤物| 精品久久久91| 91人人爽人人爽人人精88v| 日韩在线观看高清| 亚洲欧美激情四射在线日| 亚洲日本欧美日韩高观看| 亚洲欧美一区二区激情|