Redis 三種資料結構與事務

2022-07-11 09:48:11 字數 2953 閱讀 4801

定位,附近的人,打車距離計算,學生請假還假打卡時判斷是否在學校中

redis的geo在3.2就推出了,這個功能可以推算地理位置的資訊,兩地之間的距離

geoadd 新增地理位置  

geoadd key 緯度 經度 名稱

# 規則:無法直接新增兩極,南極北極,一般正常情況下城市資料是直接錄入的

geoadd china:city 116.40 39.90 beijing # china:city是我們的key

geoadd china:city 121.47 31.23 shanghai

geoadd china:city 106.50 29.53 chongqin

geoadd china:city 114.05 22.52 shenzhen

geoadd china:city 120.16 30.24 hangzhou

geoadd china:city 108.96 34.26 xian

geopos 獲取城市的地理位置,獲取緯度和經度,一定是乙個座標值

geopos china:city beijing chongqin # 可以拿乙個也可以多個

geodist 返回兩個給定位置之間的距離

geodist china:city beijing shanghai 預設單位是公尺,返回直線距離

geodist china:city beijing shanghai km 將單位設定為km

georadius 以給定的的經緯度為中心,找到乙個半徑內的元素

georadius china:city 110 30 500 km # 找110 30這個經緯度為中心,半徑500km內的

georadius china:city 110 30 500 km withdist 顯示在中心位置的距離

georadius china:city 110 30 500 km withdist withcoord count 1 # 只找乙個

比如附近的人這種功能,可以使用這種

georadiusbymember 找出位於指定元素周圍的其他元素

georadiusbymember china:city beijing 500km

geo底層實現原理其實就是zset,我們可以使用zset來操作geo

比如我們可以用zset的方法刪除某個地理位置

zrange china:city 0 -1

zrem china:city beijing 刪除北京

是一種資料結構,用來做基數統計的演算法

優點:占用記憶體是固定的,2^64個不同的元素的計數(long資料型別的最大值),只需要12kb的記憶體。官方統計有0.81%的誤差率。但是一般情況下我們是可以接受這個誤差的。

傳統方法用set來儲存使用者的id,因為set不允許重複。然後統計set中的元素數量。當然在高併發場景下我們允許一定的誤差。這個方式儲存了大量的使用者id,但我們的目的僅僅只是為了計數,這種方案就不太好。

使用hyperloglog

pfadd key1 1 2 3 4 5 # 建立key

pfcount key1 # pfcount統計的就是基數的數量

pfadd key2 4 5 6 7 8

pfcount key2

pfmerge key3 key1 key2 # 合併兩組,key3是乙個並集

pfcount key3

如果不允許有誤差,就使用set或者自己的方法,但是要權衡記憶體的問題

位儲存位圖,也是一種資料結構,都是操作二進位制來進行記錄,只有0或者1的狀態。

統計使用者資訊,比如活躍或者不活躍,登入與未登入,365打卡,等等只有兩個狀態的情景

比如365天打卡,365天=365bit 1位元組=bit 相當於我們只需要45位元組左右就可以記錄

乙個人一年的打卡情況,比如1是打卡,0沒有打卡,以下為記錄乙個人一周的打卡情況

setbit user:1 0 1 # 周一

setbit user:1 1 0 # 周二

setbit user:1 2 1

setbit user:1 3 0

setbit user:1 4 1

setbit user:1 5 1

setbit user:1 6 1

getbit user:1 3 看周四是否打卡

統計打卡天數

bitcount user:1 統計一周打卡幾天,之後我們就可以進行判斷看是否要扣錢

bitcount user:1 0 4 統計周一到周五打卡天數

redis的事務本質:一組命令的集合,乙個事務中的所有命令都會被序列化,在事務的執行過程中,按照順序執行。相當於有乙個佇列,其中有命令1,命令2,命令3.

所以redis的事務有一次性,順序性,排他性(即單個命令不能被打斷)

redis的單條命令是保證原子性的,但是redis的事務不能保證原子性。

redis事務沒有隔離級別的概念,所有的命令在事務中,並沒有直接被執行,只有發起執行命令的時候才會執行

redis可以實現樂觀鎖

正常執行事務流程:

multi 開啟事務

exec 執行事務

multi

set k1 v1

set k2 v2

get k2

set k3 v3

exec

放棄事務:

multi

set k4 v4

discard

放棄之後其中的**不會執行

編譯型錯誤:

當執行事務過程中,出現編譯型錯誤時,比如其中某一條命令寫錯了,那麼所有這個事務中的所有命令都不會執行。

當執行時異常:

當出現執行異常,比如出現了邏輯錯誤(比如1/0這種),那麼只能那一條命令失敗,其他命令會照常執行,所以redis的事務無法保證原子性。

Redis五種資料結構

redis除了儲存鍵之外還可以儲存常見的5種資料型別,分別是 string list set zset hash。結構型別 結構儲存的值 結構的讀寫能力 string字串 可以是字串 整數或浮點數 對整個字串或字串的一部分進行操作 對整數或浮點數進行自增或自減操作 list列表 乙個鍊錶,鍊錶上的每...

Redis五種資料結構

對redis來說,所有的key 鍵 都是字串,所謂的5種資料結構是指針對value而言 資料結構型別 說明使用場景 常用方法 其他鏈結 string字串型別1 redis中最基本的資料型別,乙個key對應乙個value。2 是二進位制安全的,意思是 redis 的 string 可以包含任何資料。如...

Python中的三種資料結構

python中,有3種內建的資料結構 列表 元組和字典。1.列表 list是處理一組有序專案的資料結構,即你可以在乙個列表中儲存乙個序列的專案。列表中的專案。列表中的專案應該包括 在方括號中,這樣python就知道你是在指明乙個列表。一旦你建立了乙個列表,你就可以新增,刪除,或者是搜尋列表中的專案。...