rodert單排學習redis入門【黑鐵】

redis入門html

[toc]linux

前言

聲明:參考來源互聯網,有任何爭議能夠留言。站在前人的肩上,咱們才能看的更遠。

本教程純手打,致力於最實用教程,不須要什麼獎勵,只但願多多轉發支持。
歡迎來我公衆號,但願能夠結識你,也能夠催更,微信搜索:JavaPubgit

有任何問題均可以來談談 !github

微信公衆號

本篇主要是 Redis 的入門,涉及一些基礎命令和常見場景。

redis是目前最熱的緩存組件之一,若是你還不懂,那就開始,入門到實戰redis

本文主要是 <font color=#159957 face="黑體">Redis</font> 入門知識,介紹 Redis 特性、使用場景、安裝和數據類型。

中文官網:http://www.redis.cn/sql

1.NoSql(not only sql)

指非關係型數據庫,不支持sql語句,nosql中存儲的數據是KV形式數據庫

常見的NoSQL產品有:Mongodb、Redis、Hbase hadoop、Cassandra hadoop。windows

2.Redis入門

這是一些redis介紹,作一些簡單瞭解便可。

<font color=#159957 face="黑體">Redis</font>(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工做由VMware主持。從2013年5月開始,<font color=#159957 face="黑體">Redis</font> 的開發由Pivotal贊助。數組

redis 是一個 <font color=#159957 face="黑體">key-value</font> 存儲系統。和 Memcached 相似,它支持存儲的 value 類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,<font color=#159957 face="黑體">Redis</font> 支持各類不一樣方式的排序。與 <font color=#159957 face="黑體">memcached</font> 同樣,爲了保證效率,數據都是緩存在內存中。區別的是 <font color=#159957 face="黑體">Redis</font> 會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了 <font color=#159957 face="黑體">master-slave</font>(主從)同步。緩存

<font color=#159957 face="黑體">Redis</font> 是一個高性能的key-value數據庫。 <font color=#159957 face="黑體">Redis</font> 的出現,很大程度補償了<font color=#159957 face="黑體">memcached</font>這類key/value存儲的不足,在部 分場合能夠對關係數據庫起到很好的補充做用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
<font color=#159957 face="黑體">Redis</font> 支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得 <font color=#159957 face="黑體">Redis</font> 可執行單層樹複製。存盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。

<font color=#159957 face="黑體">Redis</font> 的官網地址,很是好記,是redis.io。(域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地),Vmware在資助着 <font color=#159957 face="黑體">Redis</font> 項目的開發和維護。

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.特性

  1. <font color=#159957 face="黑體">Redis </font>與其餘 <font color=#159957 face="黑體">key-value</font> 緩存產品有如下三個特色:
  2. <font color=#159957 face="黑體">Redis </font>支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。
  3. <font color=#159957 face="黑體">Redis </font>不只僅支持簡單的 <font color=#159957 face="黑體">key-value</font>類型的數據,同時還提供 <font color=#159957 face="黑體">list,set,zset,hash </font>等數據結構的存儲。
  4. <font color=#159957 face="黑體">Redis </font>支持數據的備份,即 <font color=#159957 face="黑體">master-slave</font> 模式的數據備份。

3.3.優點

  • 性能極高 – <font color=#159957 face="黑體">Redis </font>能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數據類型 – <font color=#159957 face="黑體">Redis </font>支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。
  • 原子 – <font color=#159957 face="黑體">Redis </font>的全部操做都是原子性的,同時<font color=#159957 face="黑體">Redis </font>還支持對幾個操做全並後的原子性執行。
  • 豐富的特性 – <font color=#159957 face="黑體">Redis </font>還支持 publish/subscribe, 通知, key 過時等等特性。

4.Redis使用場景

目前在互聯網公司, <font color=#159957 face="黑體">Redis </font> 使用很是普遍,我平常工做中,會用它作爬蟲採集系統中隊列使用,還有在後臺管理系統中作分佈式,存儲 token 使用。

一、<font color=#159957 face="黑體">緩存</font>

緩存如今幾乎是全部中大型網站都在用的必殺技,合理的利用緩存不只可以提高網站訪問速度,還能大大下降數據庫的壓力。<font color=#159957 face="黑體">Redis </font> 提供了鍵過時功能,也提供了靈活的鍵淘汰策略,因此,如今 <font color=#159957 face="黑體">Redis </font> 用在緩存的場合很是多。

二、<font color=#159957 face="黑體">排行榜</font>

不少網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。<font color=#159957 face="黑體">Redis </font> 提供的有序集合數據類構能實現各類複雜的排行榜應用。

三、<font color=#159957 face="黑體">計數器</font>

什麼是計數器,如電商網站商品的瀏覽量、視頻網站視頻的播放數等。爲了保證數據實時效,每次瀏覽都得給+1,併發量高時若是每次都請求數據庫操做無疑是種挑戰和壓力。<font color=#159957 face="黑體">Redis </font> 提供的 <font color=#159957 face="黑體">incr</font> 命令來實現計數器功能,內存操做,性能很是好,很是適用於這些計數場景。

四、<font color=#159957 face="黑體">分佈式會話</font>

集羣模式下,在應用很少的狀況下通常使用容器自帶的 session 複製功能就能知足,當應用增多相對複雜的系統中,通常都會搭建以 Redis 等內存數據庫爲中心的 session 服務,session 再也不由容器管理,而是由 session 服務及內存數據庫管理。

五、<font color=#159957 face="黑體">分佈式鎖</font>

在不少互聯網公司中都使用了分佈式技術,分佈式技術帶來的技術挑戰是對同一個資源的併發訪問,如全局ID、減庫存、秒殺等場景,併發量不大的場景可使用數據庫的悲觀鎖、樂觀鎖來實現,但在併發量高的場合中,利用數據庫鎖來控制資源的併發訪問是不太理想的,大大影響了數據庫的性能。能夠利用 Redis 的setnx功能來編寫分佈式的鎖,若是設置返回1說明獲取鎖成功,不然獲取鎖失敗,實際應用中要考慮的細節要更多。

六、<font color=#159957 face="黑體">社交網絡</font>

點贊、踩、關注/被關注、共同好友等是社交網站的基本功能,社交網站的訪問量一般來講比較大,並且傳統的關係數據庫類型不適合存儲這種類型的數據,Redis提供的哈希、集合等數據結構能很方便的的實現這些功能。

七、<font color=#159957 face="黑體">最新列表</font>

Redis列表結構,LPUSH能夠在列表頭部插入一個內容ID做爲關鍵字,LTRIM可用來限制列表的數量,這樣列表永遠爲N個ID,無需查詢最新的列表,直接根據ID去到對應的內容頁便可。

八、<font color=#159957 face="黑體">消息系統</font>

消息隊列是大型網站必用中間件,如ActiveMQ、RabbitMQ、Kafka 等流行的消息隊列中間件,主要用於業務解耦、流量削峯及異步處理實時性低的業務。Redis 提供了發佈/訂閱及阻塞隊列功能,能實現一個簡單的消息隊列系統。另外,這個不能和專業的消息中間件相比。

5.安裝

5.1.單機安裝

5.1.1.windows下

redis 開源在 github 上

  • 下載,解壓
下載地址: https://github.com/tporadowsk...

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」,這沒有什麼問題,但後者更易閱讀,而且由此增長的空間消耗相對於<font color=#159957 face="黑體">key object</font><font color=#159957 face="黑體">value object</font>自己來講很小。固然,沒人阻止您必定要用更短的鍵值節省一丁點兒空間。
  • 最好堅持一種模式。例如:」object-type:uid:field」就是個不錯的注意,像這樣」user:1000:password」。我喜歡對多單詞的字段名中加上一個點,就像這樣:」comment:q1234:reply.to」。

6.2.字符串(strings)

二進制安全的字符串

字符串方式是redis最簡單的數據類型,redis就像一個能夠持久化的memcached服務器。

  • 基本的操做方式<font color=#159957 face="黑體">get 和 set </font>方式
> 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

<font color=#159957 face="黑體">INCR </font> 命令將字符串解析成整型,將其加一,再將結果保存成新的字符串,相似的命令還有 <font color=#159957 face="黑體">INCRBY</font> , <font color=#159957 face="黑體">DECR</font><font color=#159957 face="黑體">DECRBY</font>

還有一個有趣的命令, <font color=#159957 face="黑體">GETSET</font> 命令:設置新值,返回原值。這個操做有什麼用?在咱們須要保證原子性操做時

MSET 和 MGET 是批量操做

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

<font color=#159957 face="黑體">MGET</font> 命令返回由值組成的數組。

  • 修改和查詢存在操做
<font color=#159957 face="黑體">exists</font>:判斷鍵是否存在, <font color=#159957 face="黑體">del</font>:刪除指定鍵
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0
<font color=#159957 face="黑體">TYPE</font> 命令返回key對應的存儲類型
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none
  • Redis超時

key 設置<font color=#159957 face="黑體">超時</font>。精度可使用毫秒或秒。

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

使用了 <font color=#159957 face="黑體">EXPIRE</font> 來設置超時時間(也能夠再次調用這個命令來改變超時時間,使用 <font color=#159957 face="黑體">PERSIST</font> 命令去除超時時間 )。咱們也能夠在建立值的時候設置超時時間:

> set key 100 ex 10
OK
> ttl key
(integer) 9

<font color=#159957 face="黑體">TTL</font> 命令用來查看key對應的值剩餘存活時間。

6.3.列表(Lists)

值得注意的: <font color=#159957 face="黑體">Redis lists</font> 基於 <font color=#159957 face="黑體">Linked Lists</font> 實現。

<font color=#159957 face="黑體">Redis 列表</font>是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)

一個列表最多能夠包含 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"

從右邊(尾部)插入倆個元素,左邊(頭部)插入一個元素,<font color=#159957 face="黑體">LRANGE </font>打印全部(0,-1)元素。

  • <font color=#159957 face="黑體">Redis Lists</font>經常使用指令
BLPOP key1 [key2 ] timeout
移出並獲取列表的第一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。

BRPOP key1 [key2 ] timeout
移出並獲取列表的最後一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。

BRPOPLPUSH source destination timeout
從列表中彈出一個值,將彈出的元素插入到另一個列表中並返回它; 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。

LINDEX key index
經過索引獲取列表中的元素

LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者後插入元素

說明:<font color=#159957 face="黑體">Redis Linsert</font> 命令用於在列表的元素前或者後插入元素。當指定元素不存在於列表中時,不執行任何操做。當列表不存在時,被視爲空列表,不執行任何操做。若是 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)

<font color=#159957 face="黑體">Redis hash </font> 是一個 <font color=#159957 face="黑體">string </font>類型的 <font color=#159957 face="黑體">field </font><font color=#159957 face="黑體">value </font> 的映射表, <font color=#159957 face="黑體">hash </font> 特別適合用於存儲對象。

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/...

6.5.集合(Set)

Redis 的 <font color=#159957 face="黑體">Set </font><font color=#159957 face="黑體">String </font> 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。

Redis 中<font color=#159957 face="黑體">集合 </font>是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 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/...

6.6.有序集合(sorted set)

  1. Redis <font color=#159957>有序集合 </font><font color=#159957>集合 </font>同樣也是 string 類型元素的集合,且不容許重複的成員。
  2. 不一樣的是每一個元素都會關聯一個 double 類型的分數。redis 正是經過分數來爲集合中的成員進行從小到大的排序。
  3. 有序集合的成員是惟一的,但分數(score)卻能夠重複。
  4. 集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是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 已經有了必定了解,入門就先簡單學到這裏,下篇一塊兒上 <font color=#159957 face="黑體">青銅</font>
後面的篇章,還將繼續介紹 Redis 的一些高級用法,緩存擊穿、緩存雪崩,源碼分析等。看後不忘三連,還有須要更多技術博文能夠留言催更。
相關文章
相關標籤/搜索