日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Redis三种特殊数据类型

發(fā)布時(shí)間:2024/9/30 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis三种特殊数据类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis三種特殊數(shù)據(jù)類(lèi)型

geospatial 地理位置

朋友的定位, 附近的人, 打車(chē)的距離計(jì)算
Redis的Geo在Redis3.2版本就推出了.這個(gè)功能可以推算地理位置信息, 兩地之間的距離, 方圓幾里的人
首先需要一個(gè)城市經(jīng)度緯度查詢(xún)工具 自行百度搜索

只有六個(gè)命令

相關(guān)命令
GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

getadd

添加地理位置
規(guī)則:兩級(jí)無(wú)法添加, 我們一般會(huì)下載城市數(shù)據(jù), 直接通過(guò)java程序一次性導(dǎo)入
參數(shù)key 值(緯度、經(jīng)度、名稱(chēng))

具體的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 規(guī)定如下:
有效的經(jīng)度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
當(dāng)坐標(biāo)位置超出上述指定范圍時(shí),該命令將會(huì)返回一個(gè)錯(cuò)誤。
(error) ERR invalid longitude,latitude pair 39.900000,116.400000

GEOADD

127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing (integer) 1 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing (integer) 1 127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen (integer) 1 127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian (integer) 2 127.0.0.1:6379>

GEOPOS

獲取當(dāng)前位置定位: 一定是一個(gè)坐標(biāo)值!

127.0.0.1:6379> geopos china:city beijing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 127.0.0.1:6379> geopos china:city beijing chongqing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 2) 1) "106.49999767541885"2) "29.529999579006592" 127.0.0.1:6379>

GEODIST

獲取當(dāng)前位置定位: 一定是一個(gè)坐標(biāo)值!

127.0.0.1:6379> geopos china:city beijing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 127.0.0.1:6379> geopos china:city beijing chongqing # 獲取指定城市的經(jīng)度緯度 1) 1) "116.39999896287918"2) "39.900000091670925" 2) 1) "106.49999767541885"2) "29.529999579006592" 127.0.0.1:6379>

GEODIST

兩人之間的距離
返回兩個(gè)給定位置之間的距離。
如果兩個(gè)位置之間的其中一個(gè)不存在, 那么命令返回空值。
指定單位的參數(shù) unit 必須是以下單位的其中一個(gè):

  • m 表示單位為米。
  • km 表示單位為千米。
  • mi 表示單位為英里。
  • ft 表示單位為英尺。
127.0.0.1:6379> GEODIST china:city beijing shanghai "1067378.7564" 127.0.0.1:6379> GEODIST china:city beijing shanghai km "1067.3788" 127.0.0.1:6379> GEODIST china:city beijing chongqing "1464070.8051" 127.0.0.1:6379>

GEORADIUS

附近的人(獲取所有附近的人的地址, 定位! )通過(guò)半徑來(lái)查詢(xún)
以給定的經(jīng)緯度為中心, 返回鍵包含的位置元素當(dāng)中, 與中心的距離不超過(guò)給定最大距離的所有位置元素。
范圍可以使用以下其中一個(gè)單位:

  • m 表示單位為米。
  • km 表示單位為千米。
  • mi 表示單位為英里。
  • ft 表示單位為英尺。

所有數(shù)據(jù)都應(yīng)該錄入: china:city 才會(huì)讓結(jié)果更加的準(zhǔn)確

127.0.0.1:6379> georadius china:city 110 30 1500 km # 獲取 110 30 這個(gè)經(jīng)緯度為中心 尋找方圓1000km 內(nèi)的城市 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379>georadius china:city 110 30 150 km withdist # 顯示到中間距離的位置 127.0.0.1:6379> georadius china:city 110 30 150 km withcoord # 顯示他人的定位信息 127.0.0.1:6379> georadius china:city 110 30 150 km withdist withcoord count 2 # 篩選指定的結(jié)果 (empty list or set) 127.0.0.1:6379>

GEORADIUSBYMEMBER

找出位于指定元素周?chē)氐钠渌?

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km 1) "beijing" 2) "xian" 127.0.0.1:6379>

GEOHASH

命令返回一個(gè)或多個(gè)位置的geohash表示
該命令將返回11個(gè)字符的Geohash字符串

# 將二維經(jīng)緯度轉(zhuǎn)換為一維的字符串, 如果兩個(gè)字符串越接近, 那么則距離越近 127.0.0.1:6379> geohash china:city beijing chongqing 1) "wx4fbxxfke0" 2) "wm5xzrybty0" 127.0.0.1:6379>

GEO底層實(shí)現(xiàn)原理

其實(shí)就是Zset 我們可以使用Zset命令來(lái)操作geo

127.0.0.1:6379> zrange china:city 0 -1 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379>

HyperLogLogs

什么是基數(shù)

基數(shù)(cardinality,也譯作勢(shì)),是指一個(gè)集合(這里的集合允許存在重復(fù)元素,與集合論對(duì)集合嚴(yán)格的定義略有不同,如不做特殊說(shuō)明,本文中提到的集合均允許存在重復(fù)元素)中不同元素的個(gè)數(shù)。例如看下面的集合:

A{1, 2, 3, 4, 5, 2, 3, 9, 7}

這個(gè)集合有9個(gè)元素,但是2和3各出現(xiàn)了兩次,因此不重復(fù)的元素為1,2,3,4,5,9,7,所以這個(gè)集合的基數(shù)是7。

如果兩個(gè)集合具有相同的基數(shù),我們說(shuō)這兩個(gè)集合等勢(shì)。基數(shù)和等勢(shì)的概念在有限集范疇內(nèi)比較直觀,但是如果擴(kuò)展到無(wú)限集則會(huì)比較復(fù)雜,一個(gè)無(wú)限集可能會(huì)與其真子集等勢(shì)(例如整數(shù)集和偶數(shù)集是等勢(shì)的)。

簡(jiǎn)介

Redis 2.8.9 版本就更新了 HyperLogLogs 數(shù)據(jù)結(jié)構(gòu)
優(yōu)點(diǎn): 占用內(nèi)存是固定的 2^64 不同的元素的技術(shù) 只需要12kb 的內(nèi)存 若從內(nèi)存角度比較的話(huà) HyperLogLogs 首選
Redis HyperLogLogs 基數(shù)統(tǒng)計(jì)算法
網(wǎng)頁(yè)UV(一個(gè)人訪(fǎng)問(wèn)網(wǎng)站多次, 但是還是算作一個(gè)人)
傳統(tǒng)方式 set保存用戶(hù)的id 然后就可以統(tǒng)計(jì)set元素?cái)?shù)量就可以作為標(biāo)準(zhǔn)判斷
這種方式保存大量的用戶(hù)id就會(huì)比較麻煩 我們的目的是為了計(jì)數(shù) 而不是保存用戶(hù)id
0.81%錯(cuò)誤率 統(tǒng)計(jì)UV任務(wù) 可以忽略不記的

127.0.0.1:6379> PFadd mykey a b c d e f g h i j # 創(chuàng)建第一個(gè)元素 mykey (integer) 1 127.0.0.1:6379> pfcount mykey # 統(tǒng)計(jì) mykey 元素的基數(shù)數(shù)量 (integer) 10 127.0.0.1:6379> PFadd mykey2 i j k l m n o p # 創(chuàng)建第二個(gè)元素 mykey2 (integer) 1 127.0.0.1:6379> pfcount mykey2 (integer) 8 127.0.0.1:6379> pfmerge mykey3 mykey mykey2 # 合并兩組 mykey mykey2 => mykey3 并集 OK 127.0.0.1:6379> pfcount mykey3 (integer) 16 127.0.0.1:6379>

如果允許容錯(cuò) 那么一定可以使用 HyperLogLogs
如果不允許容錯(cuò) 就使用set或者自己的數(shù)據(jù)類(lèi)型即可

Bitmaps

位存儲(chǔ)

統(tǒng)計(jì)用戶(hù)信息(活躍 不活躍)
登錄 未登錄 打卡(365打卡)
兩個(gè)狀態(tài) 都可以使用Bitmaps
Bitmaps 位圖 數(shù)據(jù)結(jié)構(gòu) 都是操作二進(jìn)制位 來(lái)進(jìn)行記錄
就只有 0 和1 兩個(gè)狀態(tài)

測(cè)試

使用bitmap來(lái)記錄周一到周日的打卡
周一 1 周二 0 周三 1 周四 0 周五 1 周六 1 周日 0

127.0.0.1:6379> setbit sign 0 1 (integer) 0 127.0.0.1:6379> setbit sign 1 0 (integer) 0 127.0.0.1:6379> setbit sign 2 1 (integer) 0 127.0.0.1:6379> setbit sign 3 0 (integer) 0 127.0.0.1:6379> setbit sign 4 1 (integer) 0 127.0.0.1:6379> setbit sign 5 1 (integer) 0 127.0.0.1:6379> setbit sign 6 0 (integer) 0 127.0.0.1:6379>

查看某一天是否打卡

127.0.0.1:6379> getbit sign 5 (integer) 1 127.0.0.1:6379> getbit sign 3 (integer) 0 127.0.0.1:6379>

統(tǒng)計(jì)操作 統(tǒng)計(jì)打卡的天數(shù)

127.0.0.1:6379> bitcount sign (integer) 4 127.0.0.1:6379>

參考文獻(xiàn)來(lái)源
http://blog.codinglabs.org

總結(jié)

以上是生活随笔為你收集整理的Redis三种特殊数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。