成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis 中如何根據兩個字段排序

存儲 存儲軟件 Redis
Redis 是一個內存型數據庫,其最大的作用就是當做緩存使用。提供了幾種數據類型,方便開發過程中應對不同的需求場景。

[[379663]]

 Redis 是一個內存型數據庫,其最大的作用就是當做緩存使用。提供了幾種數據類型,方便開發過程中應對不同的需求場景。

需求是這樣的,有一些需要排序的數據,按照不止一個維度進行排序,對應到數據庫里,就是按照兩個字段進行綜合排序,那在 Redis 中應該使用哪種數據結構呢?

按單一字段排序

首先我們先把問題簡化一下,按照一個字段進行排序,看看應該怎么實現。

排行榜場景很常見,比如歷史數據排行榜、熱度排行榜(微博熱搜、知乎熱榜等、B站熱門等等),根據播放量進行排序,那針對這樣的場景,使用 Redis 怎么解決呢?

我們首先忽略掉實時更新的問題,假設是昨日榜單,數據已經確定了的,不會改變。

解決方案

列表

有人立馬想到用列表方式解決,因為列表本身就是有序的,所以把榜單以 Lists 的形式放到 Redis 中,查詢的時候直接取 列表就好了,什么都不用管了。

這種方案就是把 Redis 純粹當做緩存使用,存什么取什么,其他額外的動作一概沒有。

但是這種方案的缺陷也在于此,存進來的數據就已經是排序好的數據,所以,這個排序邏輯要在外部程序中提前寫好,然后將排序好的數據存進去。

那如果外部程序不對榜單進行排序,或者說條件不允許的情況怎么辦呢?那列表就沒辦法了。

有序集合 sorted set

sorted set 是在 Sets 的基礎上增加了分數設置作為排序依據,所以除了具備 Sets 的特性外,還可以進行排序。

它提供了一個 score 屬性,正好可以用來做排序依據,對榜單類的需求完美匹配。

  1. # 按分數從小到大排序 
  2. ZRANGE key start stop [WITHSCORES] 
  3.  
  4. # 按分數從大到小排序 
  5. ZREVRANGE key start stop [WITHSCORES]   

使用 sorted set 就可以降低外部程序的復雜度了,程序中不用對榜單進行排行了,只需要將符合入榜條件的記錄拿出來,存到 sorted set 中就可以了。

在 sorted set 結構中,就用訪問量當做分數,查詢的時候執行 ZREVRANGE 命令就可以了。

按兩個字段排序

現在需求變了一下,排序的維度有所變化,加了一個維度。還比如說熱度排行榜吧,之前按訪問量排序,現在增加了按照訪問量和評論量總和排序,反應到數據庫上是這樣的:

  1. select * from post order by read_count,comment_count desc 

這種情況下怎么做呢?

解決方案

當然還可以用列表

仍然還可以用列表實現,邏輯都不變,只要改變外部程序的查詢邏輯就可以了,之前按一個字段排序,現在按兩個來。

有序集合 sorted set

我們知道 sorted set 中只有一個 score 屬性,那怎么用這一個屬性實現兩個維度的排序呢?

這就需要在 score 屬性上做文章了,最簡單的實現,可以將訪問量+評論數的和作為 score。

但是這樣精度上太細了,如果訪問量足夠大,比如上百萬的訪問量,那幾千個評論數也就幾乎可以忽略不計了,最后實際的排序還是按照訪問量來的。但是在小訪問量上其實就可以用這種方式。

比如,訪問量有 9000、8500 的兩個文章,它倆的評論量分別為 100 和 700,那最后加起來的結果就是 9100 和 9200,所以,最后的排序結果實際上是閱讀量 8500 的排在前面。

如果訪問量過大的話,可以提高評論的權重,比如一個評論量等于 100或者1000 個閱讀量。

還可以降低閱讀量的精度,比如以萬、十萬為單位,如果以十萬為精度,那 111萬和 119萬就都按 110萬來算。

實時榜單

除了一些歷史數據榜單外, 還有很多榜單都是實時的,這種情況下就要保證 redis 中的數據是實時更新的。

那如果是實時更新的情況,用列表存儲就不合適了,讀寫 redis 是為了追求高性能,如果還用列表存儲就意味著外部程序要做實時的排序、更新 redis 操作,可想而知,那樣外部程序根本無法做到實時更新,或者代價極大。

所以,就要靠 sorted set 來解決了,可以使用 ZINCRBY命令快速更新 sorted 中的元素的分數,比如視頻的播放量更新的時候通過更新 redis 中的值,因為更新 redis 的速度是非??斓模钥梢詫崿F播放量的實時更新。

  1. ZINCRBY key increment member 

因為依靠的是 sorted set 中的分數來排序,所以,當成員的分數更新了之后,查詢出來的排行信息就是實時的榜單了。

本文轉載自微信公眾號「古時的風箏」,可以通過以下二維碼關注。轉載本文請聯系古時的風箏公眾號。

 

責任編輯:武曉燕 來源: 古時的風箏
相關推薦

2022-08-14 23:04:54

React前端框架

2022-07-09 20:35:23

數字化企業轉型

2017-06-14 13:42:00

字典數據社交

2011-09-01 21:41:42

SQL Server把字符分割成兩個字符串

2022-04-01 11:39:32

互聯網裁員紅利

2013-04-23 09:31:52

SQL Server

2023-03-31 07:31:28

SliceGolang

2011-08-29 18:17:58

Ubuntu

2022-06-27 07:50:16

鏈表節點測試

2022-06-27 08:07:13

Go語言互斥鎖

2010-04-08 17:40:02

Oracle 多表關聯

2014-02-14 18:17:12

文雅科SVF

2009-06-18 14:22:06

Hibernate多對Hibernate

2025-05-26 08:37:17

2019-08-28 10:00:34

Python測試工具命令

2020-08-14 08:13:49

列表差異編程

2020-04-17 10:13:51

Python開發工具

2020-08-18 08:22:46

歸并排序

2023-05-05 10:45:39

聯合索引數據

2024-05-13 08:35:27

PyObjectPython對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: jizjizjiz中国护士18 | 免费人成激情视频在线观看冫 | 99久久夜色精品国产亚洲96 | 中文字幕精品一区 | 一区视频在线 | 成人片免费看 | 国产精品夜夜夜一区二区三区尤 | 日韩欧美中文字幕在线视频 | 成人精品鲁一区一区二区 | 91资源在线观看 | 亚洲精品成人网 | 欧美三级不卡 | 亚洲精品亚洲人成人网 | 久久久综合久久 | 欧美不卡视频一区发布 | 日本在线一二 | 波多野结衣中文字幕一区二区三区 | 中文字幕亚洲国产 | 欧美一区二区免费电影 | 欧美一级在线观看 | 日韩午夜精品 | 国产粉嫩尤物极品99综合精品 | 午夜免费福利电影 | 97av视频在线 | 精品欧美一区二区久久久伦 | 日日射夜夜骑 | 日韩在线观看一区 | 国产区在线 | 免费国产视频 | 精品国产欧美一区二区三区成人 | 一本久久a久久精品亚洲 | 午夜欧美| 免费视频99| 亚洲精品一区二区三区中文字幕 | 欧美精品一区二区三区四区五区 | 91aiai| 亚洲精品一区中文字幕乱码 | 国产精品视频免费观看 | 国产日韩一区二区三免费高清 | 成人蜜桃av| 91精品中文字幕一区二区三区 |