Redis除了上文中5種基礎(chǔ)數(shù)據(jù)類型,還有三種特殊的數(shù)據(jù)類型,分別是 HyperLogLogs(基數(shù)統(tǒng)計(jì)), Bitmaps (位圖) 和 geospatial (地理位置)。@pdai
HyperLogLogs(基數(shù)統(tǒng)計(jì))
Redis 2.8.9 版本更新了 Hyperloglog 數(shù)據(jù)結(jié)構(gòu)!
- 什么是基數(shù)?
舉個(gè)例子,A = {1, 2, 3, 4, 5}, B = {3, 5, 6, 7, 9};那么基數(shù)(不重復(fù)的元素)= 1, 2, 4, 6, 7, 9; (允許容錯(cuò),即可以接受一定誤差)
- HyperLogLogs 基數(shù)統(tǒng)計(jì)用來(lái)解決什么問(wèn)題?
這個(gè)結(jié)構(gòu)可以非常省內(nèi)存的去統(tǒng)計(jì)各種計(jì)數(shù),比如注冊(cè) IP 數(shù)、每日訪問(wèn) IP 數(shù)、頁(yè)面實(shí)時(shí)UV、在線用戶數(shù),共同好友數(shù)等。
- 它的優(yōu)勢(shì)體現(xiàn)在哪?
一個(gè)大型的網(wǎng)站,每天 IP 比如有 100 萬(wàn),粗算一個(gè) IP 消耗 15 字節(jié),那么 100 萬(wàn)個(gè) IP 就是 15M。而 HyperLogLog 在 Redis 中每個(gè)鍵占用的內(nèi)容都是 12K,理論存儲(chǔ)近似接近 2^64 個(gè)值,不管存儲(chǔ)的內(nèi)容是什么,它一個(gè)基于基數(shù)估算的算法,只能比較準(zhǔn)確的估算出基數(shù),可以使用少量固定的內(nèi)存去存儲(chǔ)并識(shí)別集合中的唯一元素。而且這個(gè)估算的基數(shù)并不一定準(zhǔn)確,是一個(gè)帶有 0.81% 標(biāo)準(zhǔn)錯(cuò)誤的近似值(對(duì)于可以接受一定容錯(cuò)的業(yè)務(wù)場(chǎng)景,比如IP數(shù)統(tǒng)計(jì),UV等,是可以忽略不計(jì)的)。
- 相關(guān)命令使用
127.0.0.1:6379> pfadd key1 a b c d e f g h i # 創(chuàng)建第一組元素
(integer) 1
127.0.0.1:6379> pfcount key1 # 統(tǒng)計(jì)元素的基數(shù)數(shù)量
(integer) 9
127.0.0.1:6379> pfadd key2 c j k l m e g a # 創(chuàng)建第二組元素
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 8
127.0.0.1:6379> pfmerge key3 key1 key2 # 合并兩組:key1 key2 -> key3 并集
OK
127.0.0.1:6379> pfcount key3
(integer) 13
Bitmap (位存儲(chǔ))
Bitmap 即位圖數(shù)據(jù)結(jié)構(gòu),都是操作二進(jìn)制位來(lái)進(jìn)行記錄,只有0 和 1 兩個(gè)狀態(tài)。
- 用來(lái)解決什么問(wèn)題?
比如:統(tǒng)計(jì)用戶信息,活躍,不活躍! 登錄,未登錄! 打卡,不打卡! 兩個(gè)狀態(tài)的,都可以使用 Bitmaps!
如果存儲(chǔ)一年的打卡狀態(tài)需要多少內(nèi)存呢? 365 天 = 365 bit 1字節(jié) = 8bit 46 個(gè)字節(jié)左右!
- 相關(guān)命令使用
使用bitmap 來(lái)記錄 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:1 ......
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
查看某一天是否有打卡!
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0
統(tǒng)計(jì)操作,統(tǒng)計(jì) 打卡的天數(shù)!
127.0.0.1:6379> bitcount sign # 統(tǒng)計(jì)這周的打卡記錄,就可以看到是否有全勤!
(integer) 3
geospatial (地理位置)
Redis 的 Geo 在 Redis 3.2 版本就推出了! 這個(gè)功能可以推算地理位置的信息: 兩地之間的距離, 方圓幾里的人
geoadd
添加地理位置
127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
(integer) 3
127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
規(guī)則
兩級(jí)無(wú)法直接添加,我們一般會(huì)下載城市數(shù)據(jù)(這個(gè)網(wǎng)址可以查詢 GEO: http://www.jsons.cn/lngcode)!
- 有效的經(jīng)度從-180度到180度。
- 有效的緯度從-85.05112878度到85.05112878度。
# 當(dāng)坐標(biāo)位置超出上述指定范圍時(shí),該命令將會(huì)返回一個(gè)錯(cuò)誤。
127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
geopos
獲取指定的成員的經(jīng)度和緯度
127.0.0.1:6379> geopos china:city taiyuan manjing
1) 1) "112.54999905824661255"
1) "37.86000073876942196"
2) 1) "118.75999957323074341"
1) "32.03999960287850968"
獲得當(dāng)前定位, 一定是一個(gè)坐標(biāo)值!
geodist
如果不存在, 返回空
單位如下
- m
- km
- mi 英里
- ft 英尺
127.0.0.1:6379> geodist china:city taiyuan shenyang m
"1026439.1070"
127.0.0.1:6379> geodist china:city taiyuan shenyang km
"1026.4391"
georadius
附近的人 ==> 獲得所有附近的人的地址, 定位, 通過(guò)半徑來(lái)查詢
獲得指定數(shù)量的人
127.0.0.1:6379> georadius china:city 110 30 1000 km 以 100,30 這個(gè)坐標(biāo)為中心, 尋找半徑為1000km的城市
1) "xian"
2) "hangzhou"
3) "manjing"
4) "taiyuan"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "xian"
2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
2) 1) "manjing"
2) "864.9816"
3) 1) "118.75999957323074341"
2) "32.03999960287850968"
參數(shù) key 經(jīng)度 緯度 半徑 單位 [顯示結(jié)果的經(jīng)度和緯度] [顯示結(jié)果的距離] [顯示的結(jié)果的數(shù)量]
georadiusbymember
顯示與指定成員一定半徑范圍內(nèi)的其他成員
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km
1) "manjing"
2) "taiyuan"
3) "xian"
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
1) 1) "taiyuan"
2) "0.0000"
3) 1) "112.54999905824661255"
2) "37.86000073876942196"
2) 1) "xian"
2) "514.2264"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
參數(shù)與 georadius 一樣
geohash(較少使用)
該命令返回11個(gè)字符的hash字符串
127.0.0.1:6379> geohash china:city taiyuan shenyang
1) "ww8p3hhqmp0"
2) "wxrvb9qyxk0"
將二維的經(jīng)緯度轉(zhuǎn)換為一維的字符串, 如果兩個(gè)字符串越接近, 則距離越近
底層
geo底層的實(shí)現(xiàn)原理實(shí)際上就是Zset, 我們可以通過(guò)Zset命令來(lái)操作geo
127.0.0.1:6379> type china:city
zset
查看全部元素 刪除指定的元素
127.0.0.1:6379> zrange china:city 0 -1 withscores
1) "xian"
2) "4040115445396757"
3) "hangzhou"
4) "4054133997236782"
5) "manjing"
6) "4066006694128997"
7) "taiyuan"
8) "4068216047500484"
9) "shenyang"
1) "4072519231994779"
2) "shengzhen"
3) "4154606886655324"
127.0.0.1:6379> zrem china:city manjing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "taiyuan"
4) "shenyang"
5) "shengzhen"
參考文章
- http://www.jsons.cn/lngcode
- https://www.cnblogs.com/junlinsky/p/13528452.html
- https://www.cnblogs.com/touyel/p/12728096.html
- https://www.cnblogs.com/junlinsky/p/13528452.html
- https://www.cnblogs.com/wang-sky/p/13857787.html
知識(shí)體系
知識(shí)體系

相關(guān)文章
首先,我們通過(guò)學(xué)習(xí)Redis的概念基礎(chǔ),了解它適用的場(chǎng)景。
-
Redis入門 - Redis概念和基礎(chǔ)
- Redis是一種支持key-value等多種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)系統(tǒng)??捎糜诰彺妫录l(fā)布或訂閱,高速隊(duì)列等場(chǎng)景。支持網(wǎng)絡(luò),提供字符串,哈希,列表,隊(duì)列,集合結(jié)構(gòu)直接存取,基于內(nèi)存,可持久化。
其次,這些適用場(chǎng)景都是基于Redis支持的數(shù)據(jù)類型的,所以我們需要學(xué)習(xí)它支持的數(shù)據(jù)類型;同時(shí)在redis優(yōu)化中還需要對(duì)底層數(shù)據(jù)結(jié)構(gòu)了解,所以也需要了解一些底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)。

-
Redis入門 - 數(shù)據(jù)類型:5種基礎(chǔ)數(shù)據(jù)類型詳解
- Redis所有的key(鍵)都是字符串。我們?cè)谡劵A(chǔ)數(shù)據(jù)結(jié)構(gòu)時(shí),討論的是存儲(chǔ)值的數(shù)據(jù)類型,主要包括常見(jiàn)的5種數(shù)據(jù)類型,分別是:String、List、Set、Zset、Hash
-
Redis入門 - 數(shù)據(jù)類型:3種特殊類型詳解
- Redis除了上文中5種基礎(chǔ)數(shù)據(jù)類型,還有三種特殊的數(shù)據(jù)類型,分別是 HyperLogLogs(基數(shù)統(tǒng)計(jì)), Bitmaps (位圖) 和 geospatial (地理位置)
-
Redis入門 - 數(shù)據(jù)類型:Stream詳解
- Redis5.0 中還增加了一個(gè)數(shù)據(jù)結(jié)構(gòu)Stream,它借鑒了Kafka的設(shè)計(jì),是一個(gè)新的強(qiáng)大的支持多播的可持久化的消息隊(duì)列。
-
Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):對(duì)象機(jī)制詳解
- 我們?cè)谇拔囊呀?jīng)闡述了Redis 5種基礎(chǔ)數(shù)據(jù)類型詳解,分別是字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset),以及5.0版本中Redis Stream結(jié)構(gòu)詳解;那么這些基礎(chǔ)類型的底層是如何實(shí)現(xiàn)的呢?Redis的每種對(duì)象其實(shí)都由對(duì)象結(jié)構(gòu)(redisObject) 與 對(duì)應(yīng)編碼的數(shù)據(jù)結(jié)構(gòu)組合而成, 本文主要介紹對(duì)象結(jié)構(gòu)(redisObject) 部分。。
-
Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):底層數(shù)據(jù)結(jié)構(gòu)詳解
- 前文是第一部分底層設(shè)計(jì):對(duì)象機(jī)制詳解, 本文主要介紹底層數(shù)據(jù)結(jié)構(gòu) 部分。
-
Redis進(jìn)階 - 底層數(shù)據(jù)結(jié)構(gòu):redis對(duì)象與編碼(底層結(jié)構(gòu))對(duì)應(yīng)關(guān)系詳解
- 在學(xué)習(xí)完底層數(shù)據(jù)結(jié)構(gòu)之后,我們終于可以結(jié)合前文內(nèi)容闡述redis對(duì)象及編碼之間的關(guān)系了。
再者,需要學(xué)習(xí)Redis支持的核心功能,包括持久化,消息,事務(wù),高可用;高可用方面包括,主從,哨兵等;高可拓展方面,比如 分片機(jī)制等。
-
Redis進(jìn)階 - 持久化:RDB和AOF機(jī)制詳解
- 為了防止數(shù)據(jù)丟失以及服務(wù)重啟時(shí)能夠恢復(fù)數(shù)據(jù),Redis支持?jǐn)?shù)據(jù)的持久化,主要分為兩種方式,分別是RDB和AOF; 當(dāng)然實(shí)際場(chǎng)景下還會(huì)使用這兩種的混合模式。
-
Redis進(jìn)階 - 消息傳遞:發(fā)布訂閱模式詳解
- Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。
-
Redis進(jìn)階 - 事件:Redis事件機(jī)制詳解
- Redis 采用事件驅(qū)動(dòng)機(jī)制來(lái)處理大量的網(wǎng)絡(luò)IO。它并沒(méi)有使用 libevent 或者 libev 這樣的成熟開(kāi)源方案,而是自己實(shí)現(xiàn)一個(gè)非常簡(jiǎn)潔的事件驅(qū)動(dòng)庫(kù) ae_event。
-
Redis進(jìn)階 - 事務(wù):Redis事務(wù)詳解
- Redis 事務(wù)的本質(zhì)是一組命令的集合。事務(wù)支持一次執(zhí)行多個(gè)命令,一個(gè)事務(wù)中所有命令都會(huì)被序列化。在事務(wù)執(zhí)行過(guò)程,會(huì)按照順序串行化執(zhí)行隊(duì)列中的命令,其他客戶端提交的命令請(qǐng)求不會(huì)插入到事務(wù)執(zhí)行命令序列中。
-
Redis進(jìn)階 - 高可用:主從復(fù)制詳解
- 我們知道要避免單點(diǎn)故障,即保證高可用,便需要冗余(副本)方式提供集群服務(wù)。而Redis 提供了主從庫(kù)模式,以保證數(shù)據(jù)副本的一致,主從庫(kù)之間采用的是讀寫(xiě)分離的方式。本文主要闡述Redis的主從復(fù)制。
-
Redis進(jìn)階 - 高可用:哨兵機(jī)制(Redis Sentinel)詳解
- 在上文主從復(fù)制的基礎(chǔ)上,如果注節(jié)點(diǎn)出現(xiàn)故障該怎么辦呢? 在 Redis 主從集群中,哨兵機(jī)制是實(shí)現(xiàn)主從庫(kù)自動(dòng)切換的關(guān)鍵機(jī)制,它有效地解決了主從復(fù)制模式下故障轉(zhuǎn)移的問(wèn)題。
-
Redis進(jìn)階 - 高可拓展:分片技術(shù)(Redis Cluster)詳解
- 前面兩篇文章,主從復(fù)制和哨兵機(jī)制保障了高可用,就讀寫(xiě)分離而言雖然slave節(jié)點(diǎn)來(lái)擴(kuò)展主從的讀并發(fā)能力,但是寫(xiě)能力和存儲(chǔ)能力是無(wú)法進(jìn)行擴(kuò)展的,就只能是master節(jié)點(diǎn)能夠承載的上限。如果面對(duì)海量數(shù)據(jù)那么必然需要構(gòu)建master(主節(jié)點(diǎn)分片)之間的集群,同時(shí)必然需要吸收高可用(主從復(fù)制和哨兵機(jī)制)能力,即每個(gè)master分片節(jié)點(diǎn)還需要有slave節(jié)點(diǎn),這是分布式系統(tǒng)中典型的縱向擴(kuò)展(集群的分片技術(shù))的體現(xiàn);所以在Redis 3.0版本中對(duì)應(yīng)的設(shè)計(jì)就是Redis Cluster。
最后,就是具體的實(shí)踐以及實(shí)踐中遇到的問(wèn)題和解決方法了:在不同版本中有不同特性,所以還需要了解版本;以及性能優(yōu)化,大廠實(shí)踐等。
-
Redis進(jìn)階 - 緩存問(wèn)題:一致性, 穿擊, 穿透, 雪崩, 污染等
- Redis最常用的一個(gè)場(chǎng)景就是作為緩存,本文主要探討作為緩存,在實(shí)踐中可能會(huì)有哪些問(wèn)題?比如一致性, 穿擊, 穿透, 雪崩, 污染等
-
Redis進(jìn)階 - 版本特性: Redis4.0、5.0、6.0特性整理
- 在學(xué)習(xí)Redis知識(shí)體系時(shí),我們難免會(huì)需要查看版本實(shí)現(xiàn)之間的差異,本文主要整理Redis較為新的版本的特性。
-
Redis進(jìn)階 - 運(yùn)維監(jiān)控:Redis的監(jiān)控詳解
- Redis實(shí)戰(zhàn)中包含開(kāi)發(fā),集群 和 運(yùn)維,Redis用的好不好,如何讓它更好,這是運(yùn)維要做的;本文主要在 Redis自身狀態(tài)及命令,可視化監(jiān)控工具,以及Redis監(jiān)控體系等方面幫助你構(gòu)建對(duì)redis運(yùn)維/監(jiān)控體系的認(rèn)知,它是性能優(yōu)化的前提。
-
Redis進(jìn)階 - 性能調(diào)優(yōu):Redis性能調(diào)優(yōu)詳解
- Redis 的性能問(wèn)題,涉及到的知識(shí)點(diǎn)非常廣,幾乎涵蓋了 CPU、內(nèi)存、網(wǎng)絡(luò)、甚至磁盤的方方面面;同時(shí)還需要對(duì)上文中一些基礎(chǔ)或底層有詳細(xì)的了解。針對(duì)Redis的性能調(diào)優(yōu),這里整理分享一篇水滴與銀彈(公眾號(hào))的文章,這篇文章可以幫助你構(gòu)筑Redis性能調(diào)優(yōu)的知識(shí)體系。
-
Redis大廠經(jīng)驗(yàn) - 微博:萬(wàn)億級(jí)日訪問(wèn)量下,Redis在微博的9年優(yōu)化歷程
- 再分享一篇微博使用redis的經(jīng)驗(yàn)的文章,因?yàn)镽edis在微博內(nèi)部分布在各個(gè)應(yīng)用場(chǎng)景,比如像現(xiàn)在春晚必爭(zhēng)的“紅包飛”活動(dòng),還有像粉絲數(shù)、用戶數(shù)、閱讀數(shù)、轉(zhuǎn)評(píng)贊、評(píng)論蓋樓、廣告推薦、負(fù)反饋、音樂(lè)榜單等等都有用到Redis;我們可以通過(guò)大廠使用redis的經(jīng)驗(yàn)來(lái)強(qiáng)化對(duì)redis使用上的認(rèn)知。
學(xué)習(xí)資料
Redis官網(wǎng):http://redis.io/
Redis官方文檔:http://redis.io/documentation
Redis下載:http://redis.io/download
redis英文文檔 https://redis.io/topics/data-types
redis中文文檔 http://www.redis.cn/documentation.html
《redis設(shè)計(jì)與實(shí)現(xiàn) 3.0版本》 http://redisbook.com/index.html
redis菜鳥(niǎo)教程 https://www.runoob.com/redis/redis-tutorial.html
redis源碼解讀 3.2.8版本 https://blog.csdn.net/men_wen/article/details/75668345
除此之外,我還推薦你看下 極客時(shí)間 《Redis核心技術(shù)與實(shí)戰(zhàn)》(作者:蔣德鈞)的相關(guān)內(nèi)容,它是我看到的為數(shù)不多的含有實(shí)戰(zhàn)經(jīng)驗(yàn)比較多的專欄,部分文章中圖片也來(lái)源于這個(gè)系列。
本篇文章由一文多發(fā)平臺(tái)ArtiPub自動(dòng)發(fā)布