13.redis實現排行


1.1 redis實現排行功能

        參考博客:https://www.cnblogs.com/zzliu/p/11787830.html

# -*- coding: utf-8 -*- # 01.獲取redis實例
import redis main_rds = redis.StrictRedis(host='localhost',port=6379,db=0,password='') # 02.添加一組測試數據 # 向key為test的zset里面添加一組,如果已經存在就覆蓋
main_rds.zadd("test",{"a":1,"b":2,"c":3,"d":5.1,"e":6,"f":7}) # 03.從大到小取出前四大元素排行
r2 = main_rds.zrevrange("test",0,3)        # ['f', 'e', 'd', 'c']
print(r2) # 04.從小到大取出排名在 2到6之間的元素
r3 = main_rds.zrangebyscore("test",2,6)        # ['b', 'c', 'd', 'e']
print(r3) # 05.返回score在給定區間的數量
r4 = main_rds.zcount("test",2,6) print(r4) # 06.獲取整個zset的元素數量
r5 = main_rds.zcard("test")    # 6
print(r5) # 07.刪除key為f的數據
main_rds.zrem("test","f") # 08.刪除最1個名元素
main_rds.zremrangebyrank("test", 0, 1) # 09.刪除score在5~6之間元素
main_rds.zremrangebyscore("test", 5, 6)

 1.2 redis實現排行原理

  1、前言

    1) 實現一個排版榜,我們通常想到的就是mysql的order by 簡單粗暴就擼出來了。但是這樣真的優雅嗎?

    2)數據庫是系統的瓶頸,這是眾所周知的。如果給你一張百萬的表,讓你排序做排行榜,花費的時間是十分可怕的。

  2、redis的ZSet實現排行榜原理

    1)我們分析一下排行榜,一個用戶一個排名,意味着要去重

    2)Redis的ZSet這種結構是可以保住元素唯一以及有序

  3、redis有序集合要滿足下面兩點要求:

    1)支持按name來修改score

    2)支持以score來排序

    所以,zset同時使用字典和跳躍表兩個數據結構來保存有序集元素

 1.3 字典原理

  注:字典類型是Python中最常用的數據類型之一,它是一個鍵值對的集合,字典通過鍵來索引,關聯到相對的值,理論上它的查詢復雜度是 O(1) 

  1、哈希表 (hash tables)

      1. 哈希表(也叫散列表),根據關鍵值對(Key-value)而直接進行訪問的數據結構。

      2. 它通過把key和value映射到表中一個位置來訪問記錄,這種查詢速度非常快,更新也快。

      3. 而這個映射函數叫做哈希函數,存放值的數組叫做哈希表。 

      4. 通過把每個對象的關鍵字k作為自變量,通過一個哈希函數h(k),將k映射到下標h(k)處,並將此對象存儲在這個位置。

  2、具體操作過程

      1. 數據添加:把key通過哈希函數轉換成一個整型數字,然后就將該數字對數組長度進行取余,取余結果就當作數組的下標,
                        將value存儲在以該數字為下標的數組空間里。

      2. 數據查詢:再次使用哈希函數將key轉換為對應的數組下標,並定位到數組的位置獲取value。

  3、{“name”:”zhangsan”,”age”:26} 字典如何存儲的呢? 

      1. 比如字典{“name”:”zhangsan”,”age”:26},那么他們的字典key為name、age,假如哈希函數h(“name”) = 1、h(“age”)=3,

      2. 那么對應字典的key就會存儲在列表對應下標的位置,[None, “zhangsan”, None, 26 ]

  4、解決hash沖突

       

1.4 有序表的搜索

    參考博客:https://www.cnblogs.com/thrillerz/p/4505550.html 

  1、有序表的搜索

    1)考慮一個有序表

        

    2)我們把一些節點提取出來,作為索引

        

    3)我們還可以再從一級索引提取一些元素出來,作為二級索引

         

 1.5 跳表

  1、其中 -1 表示 INT_MIN, 鏈表的最小值,1 表示 INT_MAX,鏈表的最大值  

      

  2、跳表具有如下性質:

    (1) 由很多層結構組成

    (2) 每一層都是一個有序的鏈表

    (3) 最底層(Level 1)的鏈表包含所有元素

    (4) 如果一個元素出現在 Level i 的鏈表中,則它在 Level i 之下的鏈表也都會出現。

    (5) 每個節點包含兩個指針,一個指向同一鏈表中的下一個元素,一個指向下面一層的元素。

  3、跳表搜索

      

      例子:查找元素 117

      (1) 比較 21, 比 21 大,往后面找

      (2) 比較 37, 比 37大,比鏈表最大值小,從 37 的下面一層開始找

      (3) 比較 71, 比 71 大,比鏈表最大值小,從 71 的下面一層開始找

      (4) 比較 85, 比 85 大,從后面找

      (5) 比較 117, 等於 117, 找到了節點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM