redis入門
歡迎大家前來白嫖PDF。下圖回覆:666
本教程致力於最實用教程,個別圖片粘貼有丟失,還有來領取原版。
文章目錄
前言
聲明:參考來源互聯網,有任何爭議可以留言。站在前人的肩上,我們才能看的更遠。
本教程純手打,致力於最實用教程,不需要什麼獎勵,只希望多多轉發支持。
歡迎來我公衆號,希望可以結識你,也可以催更,微信搜索:JavaPub
有任何問題都可以來談談 !
本篇主要是 Redis 的入門,涉及一些基礎命令和常見場景。
redis是目前最熱的緩存組件之一,如果你還不懂,那就開始,入門到實戰
本文主要是 Redis 入門知識,介紹 Redis 特性、使用場景、安裝和數據類型。
中文官網:http://www.redis.cn/
1.NoSql(not only sql)
指非關係型數據庫,不支持sql語句,nosql中存儲的數據是KV形式
常見的NoSQL產品有:Mongodb、Redis、Hbase hadoop、Cassandra hadoop。
2.Redis入門
這是一些redis介紹,做一些簡單瞭解即可。
Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis 的開發由Pivotal贊助。
redis 是一個 key-value 存儲系統。和 Memcached 類似,它支持存儲的 value 類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis 支持各種不同方式的排序。與 memcached 一樣,爲了保證效率,數據都是緩存在內存中。區別的是 Redis 會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了 master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 Redis 的出現,很大程度補償了**memcached**這類key/value存儲的不足,在部 分場合可以對關係數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
Redis 支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得 Redis 可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。
Redis 的官網地址,非常好記,是redis.io。(域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地),Vmware在資助着 Redis 項目的開發和維護。
3.Redis特性
3.1.性能
下面是官方的bench-mark數據:
測試完成了 50 個併發執行 100000 個請求。
設置和獲取的值是一個 256 字節字符串。
Linux box 是運行 Linux 2.6 , 這是 X3320 Xeon 2.5 ghz。
文本執行使用 loopback 接口(127.0.0.1)。
結果:讀的速度是 110000次/s ,寫的速度是 81000次/s 。
3.2.特性
- **Redis **與其他 key-value 緩存產品有以下三個特點:
- **Redis **支持數據的持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。
- **Redis **不僅僅支持簡單的 **key-value**類型的數據,同時還提供 **list,set,zset,hash **等數據結構的存儲。
- **Redis **支持數據的備份,即 master-slave 模式的數據備份。
3.3.優勢
- 性能極高 – **Redis **能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數據類型 – **Redis **支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子 – **Redis 的所有操作都是原子性的,同時Redis **還支持對幾個操作全並後的原子性執行。
- 豐富的特性 – **Redis **還支持 publish/subscribe, 通知, key 過期等等特性。
4.Redis使用場景
目前在互聯網公司, Redis 使用非常廣泛,我日常工作中,會用它做爬蟲採集系統中隊列使用,還有在後臺管理系統中做分佈式,存儲 token 使用。
1、緩存
緩存現在幾乎是所有中大型網站都在用的必殺技,合理的利用緩存不僅能夠提升網站訪問速度,還能大大降低數據庫的壓力。Redis 提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在 Redis 用在緩存的場合非常多。
2、排行榜
很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis 提供的有序集合數據類構能實現各種複雜的排行榜應用。
3、計數器
什麼是計數器,如電商網站商品的瀏覽量、視頻網站視頻的播放數等。爲了保證數據實時效,每次瀏覽都得給+1,併發量高時如果每次都請求數據庫操作無疑是種挑戰和壓力。Redis 提供的 incr 命令來實現計數器功能,內存操作,性能非常好,非常適用於這些計數場景。
4、分佈式會話
集羣模式下,在應用不多的情況下一般使用容器自帶的 session 複製功能就能滿足,當應用增多相對複雜的系統中,一般都會搭建以 Redis 等內存數據庫爲中心的 session 服務,session 不再由容器管理,而是由 session 服務及內存數據庫管理。
5、分佈式鎖
在很多互聯網公司中都使用了分佈式技術,分佈式技術帶來的技術挑戰是對同一個資源的併發訪問,如全局ID、減庫存、秒殺等場景,併發量不大的場景可以使用數據庫的悲觀鎖、樂觀鎖來實現,但在併發量高的場合中,利用數據庫鎖來控制資源的併發訪問是不太理想的,大大影響了數據庫的性能。可以利用 Redis 的setnx功能來編寫分佈式的鎖,如果設置返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。
6、社交網絡
點贊、踩、關注/被關注、共同好友等是社交網站的基本功能,社交網站的訪問量通常來說比較大,而且傳統的關係數據庫類型不適合存儲這種類型的數據,Redis提供的哈希、集合等數據結構能很方便的的實現這些功能。
7、最新列表
Redis列表結構,LPUSH可以在列表頭部插入一個內容ID作爲關鍵字,LTRIM可用來限制列表的數量,這樣列表永遠爲N個ID,無需查詢最新的列表,直接根據ID去到對應的內容頁即可。
8、消息系統
消息隊列是大型網站必用中間件,如ActiveMQ、RabbitMQ、Kafka 等流行的消息隊列中間件,主要用於業務解耦、流量削峯及異步處理實時性低的業務。Redis 提供了發佈/訂閱及阻塞隊列功能,能實現一個簡單的消息隊列系統。另外,這個不能和專業的消息中間件相比。
5.安裝
5.1.單機安裝
5.1.1.windows下
redis 開源在 github 上
- 下載,解壓
下載地址:https://github.com/tporadowski/redis/releases
Redis 支持 32 位和 64 位。這個需要根據你係統平臺的實際情況選擇,這裏我們下載 Redis-x64-xxx.zip壓縮包到 C 盤,解壓後,將文件夾重新命名爲 redis。
- 運行
解壓後,打開 cmd 窗口,cd 切換到 redis根目錄下。
redis-server.exe redis.windows.conf
- 客戶端連接
不要關閉原 cmd 窗口,新打開一個 cmd 窗口,切換到 redis 根目錄
redis-cli.exe -h 127.0.0.1 -p 6379
6379 是 redis 默認端口,我們可以在配置中修改
- 測試
設置 key 值
set myKey abc
取出 key 值
get myKey
5.1.2.linux下
linux 和 windows 下類似,啓動方式參考上文
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
6.五類數據結構
6.0.說明
類型中會涉及到很多的 Redis 操作命令,一定耐心看完,優化的基礎是要了解。
6.1.介紹
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。
redis是非常優秀的緩存工具,熟練使用redis,可以讓我們的開發進一步。
對於下面操作,可以通過 redis-cli 工具連接使用
6.2.Redis keys
關於key的幾條規則,一定不要以爲它們不重要,瞭解一些對你排查問題至關重要。
Redis key 值是二進制安全的,這意味着可以用任何二進制序列作爲key值,從形如”foo”的簡單字符串到一個 JPEG 文件的內容都可以。空字符串也是有效 key 值。
關於key的幾條規則:
- 太長的鍵值不是個好主意,例如1024字節的鍵值就不是個好主意,不僅因爲消耗內存,而且在數據中查找這類鍵值的計算成本很高。
- 太短的鍵值通常也不是好主意,如果你要用”u:1000:pwd”來代替”user:1000:password”,這沒有什麼問題,但後者更易閱讀,並且由此增加的空間消耗相對於**key object和value object**本身來說很小。當然,沒人阻止您一定要用更短的鍵值節省一丁點兒空間。
- 最好堅持一種模式。例如:”object-type:uid:field”就是個不錯的注意,像這樣”user:1000:password”。我喜歡對多單詞的字段名中加上一個點,就像這樣:”comment:q1234:reply.to”。
6.2.字符串(strings)
二進制安全的字符串
字符串方式是redis最簡單的數據類型,redis就像一個可以持久化的memcached服務器。
- 基本的操作方式**get 和 set **方式
> set mykey somevalue
OK
> get mykey
"somevalue"
例如:當key存在時,set會失敗。值的長度不能超過512MB。
- 一個有趣的操作,原子遞增,
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152
INCR 命令將字符串解析成整型,將其加一,再將結果保存成新的字符串,類似的命令還有 INCRBY , DECR 和 DECRBY 。
還有一個有趣的命令, GETSET 命令:設置新值,返回原值。這個操作有什麼用?在我們需要保證原子性操作時
MSET 和 MGET 是批量操作
> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"
MGET 命令返回由值組成的數組。
- 修改和查詢存在操作
exists:判斷鍵是否存在,del:刪除指定鍵
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0
TYPE 命令返回key對應的存儲類型
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none
- Redis超時
對 key 設置**超時**。精度可以使用毫秒或秒。
> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)
使用了 EXPIRE 來設置超時時間(也可以再次調用這個命令來改變超時時間,使用 PERSIST 命令去除超時時間 )。我們也可以在創建值的時候設置超時時間:
> set key 100 ex 10
OK
> ttl key
(integer) 9
TTL 命令用來查看key對應的值剩餘存活時間。
6.3.列表(Lists)
值得注意的:Redis lists 基於 Linked Lists 實現。
**Redis 列表**是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
- Redis Lists 入門
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
從右邊(尾部)插入倆個元素,左邊(頭部)插入一個元素,**LRANGE **打印所有(0,-1)元素。
- **Redis Lists**常用指令
BLPOP key1 [key2 ] timeout
移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
BRPOP key1 [key2 ] timeout
移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
BRPOPLPUSH source destination timeout
從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
LINDEX key index
通過索引獲取列表中的元素
LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者後插入元素
說明:Redis Linsert 命令用於在列表的元素前或者後插入元素。當指定元素不存在於列表中時,不執行任何操作。當列表不存在時,被視爲空列表,不執行任何操作。如果 key 不是列表類型,返回一個錯誤。
實例:
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
redis>
LLEN key
獲取列表長度
LPOP key
移出並獲取列表的第一個元素
LPUSH key value1 [value2]
將一個或多個值插入到列表頭部
LPUSHX key value
將一個值插入到已存在的列表頭部
LRANGE key start stop
獲取列表指定範圍內的元素
LREM key count value
移除列表元素
count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數量爲 COUNT 。
count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數量爲 COUNT 的絕對值。
count = 0 : 移除表中所有與 VALUE 相等的值。
LSET key index value
通過索引設置列表元素的值
LTRIM key start stop
對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
注意:下標從0開始
RPOP key
移除列表的最後一個元素,返回值爲移除的元素。
RPOPLPUSH source destination
移除列表的最後一個元素,並將該元素添加到另一個列表並返回。
RPUSH key value1 [value2]
在列表中添加一個或多個值
RPUSHX key value
爲已存在的列表添加值
6.4.哈希(Hash)
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
序號 命令及描述
1 HDEL key field1 [field2]
刪除一個或多個哈希表字段
2 HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3 HGET key field
獲取存儲在哈希表中指定字段的值。
4 HGETALL key
獲取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment
爲哈希表 key 中的指定字段的整數值加上增量 increment 。
6 HINCRBYFLOAT key field increment
爲哈希表 key 中的指定字段的浮點數值加上增量 increment 。
7 HKEYS key
獲取所有哈希表中的字段
8 HLEN key
獲取哈希表中字段的數量
9 HMGET key field1 [field2]
獲取所有給定字段的值
10 HMSET key field1 value1 [field2 value2 ]
同時將多個 field-value (域-值)對設置到哈希表 key 中。
11 HSET key field value
將哈希表 key 中的字段 field 的值設爲 value 。
12 HSETNX key field value
只有在字段 field 不存在時,設置哈希表字段的值。
13 HVALS key
獲取哈希表中所有值。
14 HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對。
參考:https://www.runoob.com/redis/redis-hashes.html
6.5.集合(Set)
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據。
Redis 中**集合 **是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。
序號 命令及描述
1 SADD key member1 [member2]
向集合添加一個或多個成員
2 SCARD key
獲取集合的成員數
3 SDIFF key1 [key2]
返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2]
返回給定所有集合的差集並存儲在 destination 中
5 SINTER key1 [key2]
返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2]
返回給定所有集合的交集並存儲在 destination 中
7 SISMEMBER key member
判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key
返回集合中的所有成員
9 SMOVE source destination member
將 member 元素從 source 集合移動到 destination 集合
10 SPOP key
移除並返回集合中的一個隨機元素
11 SRANDMEMBER key [count]
返回集合中一個或多個隨機數
12 SREM key member1 [member2]
移除集合中一個或多個成員
13 SUNION key1 [key2]
返回所有給定集合的並集
14 SUNIONSTORE destination key1 [key2]
所有給定集合的並集存儲在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
參考:https://www.runoob.com/redis/redis-sets.html
6.6.有序集合(sorted set)
- Redis **有序集合 和集合 **一樣也是 string 類型元素的集合,且不允許重複的成員。
- 不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來爲集合中的成員進行從小到大的排序。
- 有序集合的成員是唯一的,但分數(score)卻可以重複。
- 集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。 集合中最大的成員數爲 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
序號 命令及描述
1 ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key
獲取有序集合的成員數
3 ZCOUNT key min max
計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member
有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max
在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES]
通過索引區間返回有序集合指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count]
通過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通過分數返回有序集合指定區間內的成員
10 ZRANK key member
返回有序集合中指定成員的索引
11 ZREM key member [member ...]
移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max
移除有序集合中給定的字典區間的所有成員
13 ZREMRANGEBYRANK key start stop
移除有序集合中給定的排名區間的所有成員
14 ZREMRANGEBYSCORE key min max
移除有序集合中給定的分數區間的所有成員
15 ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定區間內的成員,通過索引,分數從高到低
16 ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member
返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member
返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成員和元素分值)
7.Redis常用
如果你讀到在這裏,相信你對 Redis 已經有了一定了解,入門就先簡單學到這裏,下篇一起上**青銅**。
後面的篇章,還將繼續介紹 Redis 的一些高級用法,緩存擊穿、緩存雪崩,源碼分析等。看後不忘三連,還有需要更多技術博文可以留言催更。