Redis筆記基礎(chǔ)篇:6分鐘看完Redis的八種數(shù)據(jù)類型

目錄

  • 一、常識補(bǔ)充
  • 二、安裝
  • 三、啟動redis
  • 四、常用基礎(chǔ)命令
  • 五、Redis五大基本數(shù)據(jù)類型
    • 5.1、String
    • 5.2、Hash
    • 5.3、List
    • 5.4、Set
    • 5.5、Zset
  • 六、三大特殊數(shù)據(jù)類型
    • 6.1、geospatial
    • 6.2、Hyperloglog
    • 6.3、Bitmap

一、常識補(bǔ)充

redis簡介(Remote dictionary Server 遠(yuǎn)程字典服務(wù)器):

Redis是開源免費(fèi)的,由C語言編寫的,一個(gè)高性能的(key/value)分布式內(nèi)存數(shù)據(jù)庫,基于內(nèi)存運(yùn)行,并支持持久化的Nosql數(shù)據(jù)庫, 也被稱為" 數(shù)據(jù)結(jié)構(gòu)服務(wù)器 "。

提前劇透,redis關(guān)于key-value的三大特點(diǎn):

  1. redis是支持持久化的!我們可以控制數(shù)據(jù)何時(shí)、用何種方式保存到磁盤中,每次重啟再次加載該文件,可以完成數(shù)據(jù)恢復(fù)。
  2. redis不單單支持簡單的key-value數(shù)據(jù)類型,同時(shí)還可以提供list、set、hash、zset等數(shù)據(jù)類型的存儲
  3. 支持?jǐn)?shù)據(jù)的備份。mater-slave模式,即,當(dāng)下時(shí)髦的主從復(fù)制讀寫分離。

應(yīng)用場景:

  • 內(nèi)存存儲的持久化: 雖然redis是單線程實(shí)現(xiàn)的,但是支持異步將數(shù)據(jù)持久化到硬盤上,同時(shí)不影響繼續(xù)服務(wù)。
  • 發(fā)布訂閱
  • 定時(shí)器、計(jì)時(shí)器: 我們可以把這個(gè)特性用到發(fā)短信的服務(wù)中,每次發(fā)送完短信后,就進(jìn)入倒計(jì)時(shí)。在指定的時(shí)間內(nèi)拒絕發(fā)送第二次,可以有效的緩解短信服務(wù)的壓力,節(jié)流。
  • 取出最新的N個(gè)數(shù)據(jù)的操作: 比如新浪微博的評論系統(tǒng),他要展示最新的10條評論,就是把最新的10條評論的id放到redis的list里面。

二、安裝

去官網(wǎng)下載壓縮包:redis.io/download

安裝依賴、編譯、安裝:

1[root@instance-lynj0v9k-19 redis-5.0.9]# yum install gcc-c++
2[root@instance-lynj0v9k-19 redis-5.0.9]# make
3[root@instance-lynj0v9k-19 redis-5.0.9]# make install

我們自己安裝的程序默認(rèn)都在 /usr/local/bin目錄下

三、啟動redis

將redis的配置文件拷貝到/usr/local/bin目錄下,之后使用這個(gè)配置文件啟動。

修改配置文件,讓redis后臺啟動。

1daemonize no # 修改成 yes

指定配置文件,啟動redis。

1redis-server /絕對路徑/redis.conf

使用redis-client連接redis。

1redis-cli -h 地址 -p 端口號

退出

 1# 關(guān)閉redis-server
 2127.0.0.1:16379> shutdown
 3
 4# 退出redis-cli
 5not connected> exit
 6
 7# 重新嘗試連接,因?yàn)閞edis-server被關(guān)閉了,所以會被拒絕
 8[root@instance-lynj0v9k-19 bin]# redis-cli -p 16379
 9Could not connect to Redis at 127.0.0.1:16379: Connection refused
10not connected> exit
11
12# 查看redis-server是否還在
13[root@instance-lynj0v9k-19 bin]# netstat -luntp | grep 16379
14[root@instance-lynj0v9k-19 bin]#

四、常用基礎(chǔ)命令

 1# redis默認(rèn)存在16個(gè)數(shù)據(jù)庫,默認(rèn)一開始使用的是第0個(gè)
 2[root@instance-lynj0v9k-19 bin]# cat redis.conf | grep  'databases'
 3databases 16
 4
 5# 切換數(shù)據(jù)庫
 6127.0.0.1:16379> select 2
 7OK
 8127.0.0.1:16379[2]>
 9
10# 查看數(shù)據(jù)庫容量
11127.0.0.1:16379[2]> DBSIZE
12(integer) 0
13
14# 查看所有的key
15127.0.0.1:16379[2]> keys *
16(empty list or set)
17
18# 清空當(dāng)前數(shù)據(jù)庫中的值
19127.0.0.1:16379[2]> flushdb
20OK
21
22# 清空所有庫
23127.0.0.1:16379[2]> flushall
24OK

數(shù)據(jù)庫的相關(guān)命令 指令
關(guān)閉redis shutdown
選擇數(shù)據(jù)庫 select 庫索引
查看當(dāng)前數(shù)據(jù)庫中key的數(shù)量 Dbsize
清空當(dāng)前庫 Flushdb
通殺所有庫 Flushall
key常用命令 指令
查看所有key keys *
判斷某個(gè)key是否存在 exists key
把key移動到別的庫 move key db
為key 設(shè)定過期時(shí)間 expire key 秒鐘
查看還有多少秒過期 ttl key
查看當(dāng)前key是什么類型的 type key

五、Redis五大基本數(shù)據(jù)類型

5.1、String

等同于java中的,Map<String,String>

  • string 是redis里面的最基本的數(shù)據(jù)類型,一個(gè)key對應(yīng)一個(gè)value。
  • string 是二進(jìn)制安全的,意味著:就算我們通過加密算法把圖片或者序列化的對象set給redis,它幫我們安全的存儲。
  • string的最大內(nèi)存值 512M

常用命令:

常用命令 命令
添加一對kv set key value
添加多對kv(可覆蓋) mset key value key value….
添加多對kv(不可覆蓋,只要有一個(gè)已存在,全部取消) msetnx key value key value….
獲取 get value
獲取多對kv mget key key…
刪除 del key
在末尾追加 append key value
查詢v的長度 strlen key
給數(shù)值類型的v加/減1 incr/decr key
給數(shù)值類型增加/減少指定大小的值 incrby/decrby key value
獲取v的長度 getrange key
在指定位置添加指定值(中間默認(rèn)用空格補(bǔ)全) setrange key offset value
添加指定生命周期的kv setex key seconds value
如果不存在則添加 setnx key value
獲取舊值,設(shè)置新值 setget key value

5.2、Hash

等同于java中的:Map<String,Map<String,String>>

  • redis的hash是一個(gè)鍵值對的集合 Map(string, Object)。
  • redis的hash是一個(gè)string類型的field和value的映射表,特別適合存儲對象。

同樣hash相關(guān)的指令以 h 開頭

作用 命令
添加單個(gè) hset key field value
獲取單個(gè) hget key field
一次性添加多個(gè)鍵值 hmset key field1 value1 field2 value2 …
一次性獲取多個(gè) hmget
獲取所有鍵值 hgetall key
刪除 hdel
獲取鍵值對的個(gè)數(shù) hlen
檢查是否包含某個(gè)字段 hget key field
查看所有key hkeys
給某個(gè)數(shù)值類型(否則報(bào)錯(cuò))的值增加指定整數(shù)值 hincrby key field increment
給某個(gè)數(shù)字類型值,增加指定浮點(diǎn)類型值 hincrbyfloat key field increment
如果不存在則添加 hsetnx

5.3、list

等同于java中的Map<String,List>

redis的list是一個(gè)簡單的字符串類型的列表,從功能上看, 它就像是棧和隊(duì)列結(jié)婚后的產(chǎn)物 首先: 它會按照我們插入的順序排序,然后我們可以從他的頭部添加/獲取元素,也可以從它的尾部添加/獲取元素, (底層實(shí)際上是個(gè)鏈表)

list中有比較容易混淆的左右之分,我是把整個(gè)list看成一個(gè)兩邊相同的管子,如果是L開頭的操作,就想象用左手把這個(gè)管子豎起來(我取名字叫左壓棧),如果是R開頭,就想象是右手把這個(gè)管子豎起來,這樣就不會混淆取出來的值到底是誰。

list相關(guān)的指令,開頭全部是 l,表示list

常用命令 命令
左壓棧 lpush key v1 v2 v3 v4…
右壓棧 rpush key v1 v2 …
查看里面的元素 lrange key start offset
左彈棧 lpop key
右彈棧 rpop key
按照索引查找 lindex key index
查看長度 llen key
刪除幾個(gè)幾 lrem key 數(shù)量 value
指定開始和結(jié)束的位置截取,再賦值給key ltrim key start offset
右出棧左壓棧,把resoure的左后一個(gè),壓倒dest的第一個(gè) rpoplpush resource destination
重置指定索引的值 lset key index value
在指定元素前/后插入指定元素 linsert key before/after 值1 值2

性能總結(jié):

他是一個(gè)字符串鏈表,left、right都可以插入添加。

  • 如果鍵不存在,創(chuàng)建新的鏈表。
  • 如果鍵已經(jīng)存在,新增內(nèi)容。
  • 值全部移除,key消失。
  • 由于是鏈表,所以它對頭和尾操作的效率都極高。但是假如是對中間元素的操作,效率就可憐了。

5.4、Set

等同于java中的Map<String,Set>

第一眼看到set,有沒有想起來,它不允許有重復(fù)的元素? 沒錯(cuò),它的底層由hashTable實(shí)現(xiàn)的,天生去重。

Set的所有指令,全部以 s 開頭。

常用命令 命令
添加值 sadd key values
查看值 smembers key
檢查集合是否有值 sismember key value
查看set集合里面的元素個(gè)數(shù) scard key
刪除集合中的指定元素 srem key value
隨機(jī)彈出某個(gè)元素 srandmember key
隨機(jī)出棧 spop key
把key1中的某個(gè)值賦值給key2 smove SourceSet destSet member
數(shù)學(xué)集合類 命令
差集 sdiff
交集 sinte
并集 sunion

5.5、Zset

(sorted set: 有序集合)sort_set:可排序的set

  • 首先: 它同樣具有set的特性,去重!
  • 其次: 每一個(gè)元素的value之前會關(guān)聯(lián)上一個(gè)double類型的分?jǐn)?shù)。 redis會按照分?jǐn)?shù)的成員,從小到大進(jìn)行排序.(分?jǐn)?shù)可以重復(fù)) 據(jù)說:我們平時(shí)玩的游戲得分排行榜就是它搞的。

set的值是 k1 v1 k2 v2
zset的值 K1 score v1 k2 score v2

六、三大特殊數(shù)據(jù)類型

6.1、geospatial

官網(wǎng)地址:redis.io/commands/ge…

可以用來推算兩地之間的距離,方圓半徑內(nèi)的人。

關(guān)于經(jīng)度緯度的限制:www.redis.net.cn/order/3685.…

 1# 添加三個(gè)城市
 2127.0.0.1:16379[2]> geoadd china:city 116.40  39.99 beijing
 3(integer) 1
 4127.0.0.1:16379[2]> geoadd china:city 117.190 39.1255 tianjin
 5(integer) 1
 6127.0.0.1:16379[2]> geoadd china:city 120.36955 36.094 qingdao
 7(integer) 1
 8127.0.0.1:16379[2]>
 9
10# 獲取指定key的經(jīng)度和緯度
11127.0.0.1:16379[2]> geopos china:city beijing
121) 1) "116.39999896287918091"
13   2) "39.99000043587556519"
14127.0.0.1:16379[2]>
15
16# 獲取兩個(gè)給定位置的距離
17127.0.0.1:16379[2]> geodist china:city beijing qingdao # 默認(rèn)單位為米
18"555465.2188"
19127.0.0.1:16379[2]> geodist china:city beijing qingdao km
20"555.4652"
21127.0.0.1:16379[2]> geodist china:city beijing qingdao m
22"555465.2188"
23127.0.0.1:16379[2]> geodist china:city beijing qingdao mi # 英里
24"345.1509"
25127.0.0.1:16379[2]> geodist china:city beijing qingdao ft # 英尺
26"1822392.4503"
27
28# 查找附近的人
29# 以給定的經(jīng)緯度為中心,找出某一半徑內(nèi)的元素
30127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km # 半徑為200km
311) "tianjin"
322) "beijing"
33127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km withdist # 指定顯示距離
341) 1) "tianjin"
35   2) "0.0001"
362) 1) "beijing"
37   2) "117.6221"
38127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km count 2 # 指定顯示2個(gè)結(jié)果
391) 1) "tianjin"
40   2) "0.0001"
412) 1) "beijing"
42   2) "117.6221"
43
44# 以指定的members為依據(jù),找到它指定范圍內(nèi)的元素
45127.0.0.1:16379[2]> GEORADIUSBYMEMBER china:city beijing 120 km
461) "beijing"
472) "tianjin"
48
49# 返回一個(gè)或者多個(gè)位置的11位長度的hash串表示
50127.0.0.1:16379[2]> geohash china:city beijing
511) "wx4g2xzyss0"
52127.0.0.1:16379[2]> geohash china:city beijing tianjin
531) "wx4g2xzyss0"
542) "wwgqddx4sc0"
55
56# geo底層使用 zset 實(shí)現(xiàn)
57127.0.0.1:16379[2]> ZRANGE china:city 0 -1
581) "qingdao"
592) "tianjin"
603) "beijing"
61
62# 可以通過zrem刪除 geo添加的key中的member
63127.0.0.1:16379[2]> ZREM china:city beijing
64(integer) 1
65127.0.0.1:16379[2]> ZRANGE china:city 0 -1
661) "qingdao"
672) "tianjin"

6.2、Hyperloglog

一般我們使用Hyperloglog做基數(shù)統(tǒng)計(jì)。

什么是基數(shù)?就是一個(gè)集合中不重復(fù)的數(shù)的個(gè)數(shù)。

集合A:{1,3,5,7,9,7}

集合B:{1,3,5,7,9}

AB集合的基數(shù)都是5

應(yīng)用:統(tǒng)計(jì)網(wǎng)站的訪問量(一個(gè)人訪問網(wǎng)站很多次仍然算作一次)。

優(yōu)點(diǎn):占用的內(nèi)存是固定的,找2^64次方個(gè)數(shù)的基數(shù),只需要12KB內(nèi)存。

缺點(diǎn):有0.81%的錯(cuò)誤率,可以忽略不計(jì)

 1# PFCOUNT 計(jì)算出來的數(shù)量就是Set的基數(shù)
 2127.0.0.1:16379[2]> PFADD key4 q w e r q
 3(integer) 1
 4127.0.0.1:16379[2]> PFCOUNT key4
 5(integer) 4
 6
 7# 添加key1和key對應(yīng)的多個(gè)值
 8127.0.0.1:16379[2]> PFADD key1 q w e r
 9(integer) 1
10
11# 統(tǒng)計(jì)key下有多少個(gè)值
12127.0.0.1:16379[2]> PFCOUNT key1
13(integer) 4
14
15# 添加key2和key對應(yīng)的多個(gè)值
16127.0.0.1:16379[2]> PFADD key2 a s d f
17(integer) 1
18
19# 合并多個(gè)key成為一個(gè)key
20127.0.0.1:16379[2]> PFMERGE key3 key1 key2
21OK
22127.0.0.1:16379[2]> PFCOUNT key3
23(integer) 8

6.3、Bitmap

比如使用bitmap記錄用戶從1號到3號到登陸信息

 1# key為sign表示登陸
 2127.0.0.1:16379[2]> SETBIT sign 1 0 # 第一天沒有登陸
 3(integer) 0
 4127.0.0.1:16379[2]> SETBIT sign 2 0
 5(integer) 0
 6127.0.0.1:16379[2]> SETBIT sign 3 1 # 第三天登陸了
 7(integer) 0
 8
 9# 獲取指定某位的值
10127.0.0.1:16379[2]> GETBIT sign 3
11(integer) 1
12
13# 統(tǒng)計(jì)用戶這三天登陸了幾次,就是統(tǒng)計(jì)key下有多少位1
14127.0.0.1:16379[2]> GETBIT sign 3
15(integer) 1
16127.0.0.1:16379[2]> bitcount sign
17(integer) 1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容