目錄
- 一、常識補(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):
- redis是支持持久化的!我們可以控制數(shù)據(jù)何時(shí)、用何種方式保存到磁盤中,每次重啟再次加載該文件,可以完成數(shù)據(jù)恢復(fù)。
- redis不單單支持簡單的key-value數(shù)據(jù)類型,同時(shí)還可以提供list、set、hash、zset等數(shù)據(jù)類型的存儲
- 支持?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