目錄html
redis入門(一)
redis入門(二)
redis入門(三)linux
Redis是什麼?
redis是一種基於鍵值對(key-value)的NoSQL數據庫。Redis會將全部數據都存放在內存中,因此它的讀寫性能很是驚人。不只如此,Redis還能夠將內存的數據利用快照和日誌的形式保存到硬盤上,這樣在發生相似斷電或者機器故障的時候,內存中的數據不會「丟失」。Redis還提供了鍵過時、發佈訂閱、事務、流水線、Lua腳本等附加功能。git
咱們爲何選擇redis?github
官方給出的讀寫速度能夠達到10W/s,如下是我本機雙核四線程低壓i7上測試的對字符串的讀寫速度。redis
C:\Users\Dm_ca> redis-benchmark -n 100000 -t set,get -q -a test1 SET: 11993.28 requests per second GET: 57603.69 requests per second
若使用redis管道技術能夠獲得更高的讀寫速度shell
C:\Users\Dm_ca> redis-benchmark -n 100000 -t set,get -q -a test1 -P 2 SET: 19466.62 requests per second GET: 133155.80 requests per second
Redis 管道技術能夠在服務端未響應時,客戶端能夠繼續向服務端發送請求,並最終一次性讀取全部服務端的響應。數據庫
下表是谷歌公司給出的各層級硬件執行速度,內存的響應速度是100ns,redis將數據所有從內存加載能夠更快的讀寫數據。
ubuntu
早期版本代碼在2W行左右,3.0添加了集羣等特性增值5W行。相比其餘NoSQL數據庫來講代碼量少得多。windows
支持發佈訂閱、持久化、集羣及管道等其餘經常使用的功能。後端
2008年,Redis的做者Salvatore Sanfilippo在開發一個叫LLOOGG的網站時,須要實現一個高性能的隊列功能,最開始是使用MySQL來實現的,但後來發現不管怎麼優化SQL語句都不能使網站的性能提升上去,因而他決定本身作一個專屬於LLOOGG的數據庫,這個就是Redis的前身。後來,Salvatore Sanfilippo將Redis1.0的源碼開放到GitHub上,可能連他本身都沒想到,Redis後來如此受歡迎。
Redis借鑑了Linux操做系統對於版本號的命名規則:版本號第二位若是是奇數,則爲非穩定版本(例如2.七、2.九、3.1),若是是偶數,則爲穩定版本(例如2.六、2.八、3.0、3.2)。當前奇數版本就是下一個穩定版本的開發版本。
config set
命令設置maxclients。configre write
命令能夠將config set
持久化到Redis配置文件中。config set
設置maxmemory時候能夠設置不一樣的單位單位(以前只能是字節)更多細節能夠查看Redis版本歷史介紹
redis編譯後,有許多可執行文件,咱們先了解一下各個文件的用途。在windows版本和官方redis版的文件都是差很少的。
可執行文件 | 做用 |
---|---|
redis-server | 啓動redis服務 |
redis-cli | redis命令行客戶端 |
redis-benchmark | redis基準測試工具 |
redis-check-aof | redis AOF持久化文件檢測和修復工具 |
redis-check-dump | redis RDB持久化文件檢測和修復工具 |
redis-sentinel | 啓動redis哨兵服務 |
windows版本是沒有redis-sentinel,在啓動的時候能夠經過
--sentinel
參數以哨兵模式啓動。
下載
Redis官方並不支持Windows操做系統,可是Redis做爲一款優秀的開源技術吸引到了微軟的注意,微軟的開源技術組在GitHub上維護一個Redis的分支。
目前在windows版本最新的redis是3.2.100,能夠到這裏下載
下載的壓縮文件內容以下圖所示。
windows版本的redis能夠以2種方式運行,一種是經過cmd命令框啓動redis服務進程。另外一種是將redis安裝爲windows服務,並以windows服務運行。
.config
是redis配置文件。在服務安裝的時候咱們能夠指定配置文件,若沒有指定,則使用redis默認配置。
直接啓動
經過redis-server 配置名
能夠直接啓動redis服務。
安裝服務
生產環境建議將redis安裝爲windows服務,避免cmd框不當心被關掉。
打開cmd窗口,經過redis-server --service-install 配置文件路徑 --service-name 服務名
安裝服務。如redis-server --service-install redis.windows-service.conf --service-name redis-test
若配置格式沒有問題,安裝成功後再windows服務中則會有名爲redis-test
的服務。
安裝windows服務時必須指定配置文件
若沒有指定服務名,則使用Redis做爲默認的服務名稱。
啓動服務
經過redis-server --service-start --service-name 服務名
啓動指定的redis服務。
中止服務
經過redis-server --service-stop --service-name 服務名
中止指定的redis服務。
卸載
經過redis-server --service-install --service-name 服務名
卸載Redis服務。卸載服務前須要先中止服務。
下載
在Linux安裝軟件一般有兩種方法,第一種是經過各個操做系統的軟件管理軟件進行安裝,例如CentOS有yum管理工具,Ubuntu有 apt。可是因爲Redis的更新速度相對較快,而這些管理工具不必定能更新到最新的版本,同時Redis的安裝自己不是很複雜,因此一推薦使用第二種方式:源碼的方式進行安裝,整個安裝只需如下四步便可完成。
1) 下載Redis指定版本的源碼壓縮包到當前目錄。
2) 解壓縮Redis源碼壓縮包。
3) 編譯(編譯以前確保操做系統已經安裝gcc)。
4) 安裝。
wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar xzf redis-5.0.5.tar.gz cd redis-5.0.5 make
編譯
我本機是在windows的Linux子系統上運行,安裝的是Ubuntu,windows商店中的ubuntu是最小化安裝,所以許多必要的開發包都是沒有的,好比make
,所以須要安裝make
,而編譯redis源碼還要依賴gcc
,所以確保本身本地的linux已經安裝了gcc
和make
.
在ubuntu下可使用sudo apt-get install build-essential
安裝gcc相關的包,使用sudo apt-get install make
安裝make包。
若都安裝完成,則能夠在redis目錄下經過make
命令進行源碼編譯
啓動
經過src/redis-server
啓動redis-server,經過src/redis-server 配置名
以指定的配置文件啓動。若直接啓動默認之前臺服務進程執行,將會阻塞命令行。修改配置文件daemonize no
改成daemonize yes
以守護進程的方式執行。
守護進程(Daemon Process),也就是一般說的 Daemon 進程(精靈進程),是 Linux 中的後臺服務進程。它是一個生存期較長的進程,一般獨立於控制終端而且週期性地執行某種任務或等待處理某些發生的事件。
能夠經過修改配置文件中的port
修改綁定指定端口
客戶端鏈接
經過src/redis-cli
鏈接redis服務,經過src/redis-server -v
或src/redis-cli -v
能夠查看redis的版本號。
redis能夠保存string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。在後面的版本逐步又添加了Bitmaps(位圖)、HyperLogLog、GEO(地理信息定位)等數據結構。
經過type
命令能夠查看當前鍵的數據類型。
127.0.0.1:26379> type key1 string
經過type
返回的僅僅是對外的數據結構,實際上每種數據結構都有本身底層的內部編碼實現,並且是多種實現。
redis經過構建簡單動態字符串、鏈表、壓縮列表、整數集合、哈希表(字典)、跳躍表等內部編碼構造出進行組合實現了各類數據結構,經過這種方式 ,Redis會在合適的場景選擇合適的內部編碼。從而優化不一樣場景下的使用效率。
若是一個字符串對象保存的是整數值,而且這個整數值能夠用long類型來表示,須要注意的是long或double類型表示的浮點數在Redis中也是做爲字符串值來保存的。若是咱們要保存一個浮點數到字符串對象裏面,那麼程序會先將這個浮點數轉換成字符串值,而後再保存轉換所得的字符串值。
embstr編碼是專門用於保存短字符串的一種優化編碼方式,embstr編碼經過調用一次內存分配函數來分配一塊連續的空間,而raw編碼會調用兩次內存分配函數。同理釋放embstr編碼的字符串只須要調用一次內存釋放函數來分配一塊連續的空間,而釋放raw編碼的字符串會調用兩次內存釋放函數。
embstr編碼的字符串對象其實是隻讀的。當咱們對embstr編碼的字符串對象執行任何修改命令時,程序會先將對象的編碼從embstr轉換成raw,而後再執行修改命令。由於這個緣由,embstr編碼的字符串對象在執行修改命令以後,總會變成一個raw編碼的字符串對象。
跳躍表(skiplist)是一種有序數據結構,它經過在每一個節點中維持多個指向其餘節點的指針,從而達到快速訪問節點的目的。
查看全部鍵:keys *
127.0.0.1:26379> set key1 1 OK 127.0.0.1:26379> set key2 2 OK 127.0.0.1:26379> set key3 3 OK 127.0.0.1:26379> set key22 22 OK 127.0.0.1:26379> keys * 1) "key22" 2) "key3" 2) "key2" 3) "key1"
該命令還支持模糊查詢
shell 127.0.0.1:26379> keys *2* 1) "key22" 2) "key2"
鍵總數:dbsize
127.0.0.1:26379> dbsize (integer) 3
檢查鍵是否存在:exists key
,能夠傳入多個key,返回存在key的個數
127.0.0.1:26379> exists key1 (integer) 1 127.0.0.1:26379> exists key4 (integer) 0 127.0.0.1:26379> exists key1 key2 (integer) 2
刪除鍵:del key
,能夠同時刪除多個key,返回成功刪除key的數量
127.0.0.1:26379> del key1 key2 (integer) 2
鍵過時:expire key seconds
127.0.0.1:26379> expire key3 2 (integer) 1
查詢鍵剩餘過時時間:ttl key
。大於等於0則是鍵剩餘的過時時間,-1表示未設置過時時間。
127.0.0.1:26379> ttl key3 (integer) 2 127.0.0.1:26379> ttl key1 (integer) -1
查詢redis服務狀態:info [section]
。能夠經過info
查詢redis全部信息,或者經過info section
查詢指定的部分信息。
127.0.0.1:26379> info # Server redis_version:5.0.6 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:6f31570182dc95d9 redis_mode:standalone ... # Keyspace db0:keys=3,expires=0,avg_ttl=0 127.0.0.1:26379> info keyspace # Keyspace db0:keys=3,expires=0,avg_ttl=
字符串類型是Redis最基礎的數據結構。首先鍵都是字符串類型,並且其餘幾種數據結構都是在字符串類型基礎上構建的,因此字符串類型能爲其餘四種數據結構的學習奠基基礎。字符串類型的值實際能夠是字符串(簡單的字符串、複雜的字符串(例如JSON、XML))、數字(整數、浮點數),甚至是二進制(圖片、音頻、視頻),可是值最大不能超過512MB。
set key value [ex seconds] [px milliseconds] [nx| xx]
因爲nx和xx的特性,只有一個客戶端能設置成功,所以能夠作爲分佈式鎖的一種實現。
get key
mset key value [key value ...]
mget key [key ...]
字符串類型的內部編碼有3種:
raw:大於44個字節的字符串。
redis3.0之前是以39個字符爲邊界,因爲redis3.0對embstr性能作了優化致使長度邊界發生變化。詳情能夠看Redis的embstr與raw編碼方式再也不以39字節爲界了!
緩存
與關係型數據庫不一樣的是,Redis沒有命令空間,並且也沒有對鍵名有強制要求(除了不能使用一些特殊字符)。但設計合理的鍵名,有利於防止鍵衝突和項目的可維護性,比較推薦的方式是使用
業務名:對象名:id:[屬性]
做爲鍵名(也能夠不是分號)。例如數據庫名爲vs,用戶表名爲user,那麼對應的鍵能夠用vs:user:1
,vs:user:1:name
來表示,若是當前Redis只被一個業務使用,甚至能夠去掉vs:
。若是鍵名比較長,例如user:{uid}:friends:messages:{mid}
,能夠在能描述鍵含義的前提下適當減小鍵的長度,例如變爲u:{uid}:fr:m:{mid}
,從而減小因爲鍵過長的內存浪費。
計數
經過incr key
對計數進行累加,可用於播放量,訪問量等場景。
限速
經過set 和 incr組合使用實現1分鐘內最多發送5條短信。
127.0.0.1:26379> set 182XXXXXXXX 1 ex 60 nx OK 127.0.0.1:26379> set 182XXXXXXXX 1 ex 60 nx (nil) 127.0.0.1:26379> incr 182XXXXXXXX (integer) 2
能夠看到經過nx參數只有在不存在的時候纔會設置成功。
分佈式鎖
能夠經過set加nx或xx參數實現分佈式鎖。關於Redis實現分佈式鎖能夠參考Distributed locks with Redis
列表(list)類型是用來存儲多個有序的字符串,一個列表最多能夠存儲2^32^-1個元素。在Redis中,能夠對列表兩端插入(push)和彈出(pop),還能夠獲取指定範圍的元素列表、獲取指定索引下標的元素等。列表是有序的,且能夠插入重複數據。
rpush key value [value ...]
lpush key value [value ...]
rpop key
lpop key
blpop key [key ...] timeout
從右側阻塞彈出:brpop key [key ...] timeout
當使用阻塞彈出時,若列表爲空,則將會阻塞指定的時間,若傳遞的timeout爲0,會一致阻塞;若個客戶端同時阻塞時,有數據插入列表時,先阻塞的先能夠獲取到值。
lrange key start end
lindex key index
llen key
修改指定索引下標的元素:lset key index newValue
列表類型的內部編碼有兩種:
list-max-ziplist-entries
配置(默認512個),同時列表中每一個元素的值都小於list-max-ziplist-value
配置時(默認64字節),Redis會選用ziplist來做爲列表的內部實現來減小內存的使用。linkedlist(鏈表):當列表類型沒法知足ziplist的條件時,Redis會使用linkedlist做爲列表的內部實現。
Redis3.2版本提供了quicklist內部編碼,簡單地說它是以一個ziplist爲節點的linkedlist,它結合了ziplist和linkedlist二者的優點,爲列表類型提供了一種更爲優秀的內部編碼實現
在Redis中,哈希類型是指鍵值自己又是一個鍵值對結構,形如value={{field1,value1},...{fieldN,valueN}}
。
hset key field value
hget key field
hdel key field [field ...]
hlen key
hmget key field [field ...]
hmset key field value [field value ...]
hexists key field
hexists key field
哈希類型的內部編碼有兩種:
hash-max-ziplist-entries
配置(默認512個)、同時全部值都小於hash-max-ziplist-value
配置(默認64字節)時,Redis會使用ziplist做爲哈希的內部實現,ziplist使用更加緊湊的結構實現多個元素的連續存儲,因此在節省內存方面比hashtable更加優秀。緩存關係型數據庫的用戶信息
關係型數據庫保存方式
hash類型保存方式
須要注意的是,關係型數據庫是結構化的,每一列都要爲其設置值(即便未空也可能包括NULL或特殊的標識表示NULL),而NOSQL則是稀疏的,有字段的才須要設置值。所以關係型數據庫須要佔用更大的內存空間。
Redis不適合去模擬複雜的查詢關係。
集合(set)類型也是用來保存多個的字符串元素,但和列表類型不同的是,集合中不容許有重複元素,而且集合中的元素是無序的,不能經過索引下標獲取元素。
sadd key element [element ...]
刪除元素:srem key element [element ...]
添加和刪除能夠對多個元素進行操做,返回的是執行成功的數量。
scard key
hlen key
sismember key element
還有一些集合的操做這裏不作具體講解
集合類型的內部編碼有兩種:
set-max-intset-entries
配置(默認512個)時,Redis會選用intset來做爲集合的內部實現,從而減小內存的使用。保存去重後的用戶信息,好比IP白名單等
有序集合它保留了集合不能有重複成員的特性,但不一樣的是,有序集合中的元素能夠排序。可是它和列表使用索引下標做爲排序依據不一樣的是,它給每一個元素設置一個分數(score)做爲排序的依據。有序集合提供了獲取指定分數和元素範圍查詢、計算成員排名等功能,合理的利用有序集合,能幫助咱們在實際開發中解決不少問題。
有序集合在集合基礎上多了一個分值,並經過分支排序。
zadd key score member [score member ...]
。Redis3.2爲zadd命令添加了nx、xx、ch、incr四個選項:
zcard key
zrem key member [member ...]
zincrby key increment member
zrange key start end [withscores]
或zrevrange key start end [withscores]
zrangebyscore key min max [withscores] [limit offset count]
或zrevrangebyscore key max min [withscores] [limit offset count]
zcount key min max
zremrangebyrank key start end
zremrangebyscore key min max
有序集合類型的內部編碼有兩種:
zset-max-ziplist-entries
配置(默認128個),同時每一個元素的值都小於zset-max-ziplist-value
配置(默認64字節)時,Redis會用ziplist來做爲有序集合的內部實現,ziplist能夠有效減小內存的使用。根據某個信息排序,好比一些排行榜功能,外賣的根據距離或綜合評分排序等。
本節簡單介紹了redis歷史。同時介紹了redis的安裝部署的相關知識,最後介紹了開發經常使用的一些API和使用場景。
本文地址:http://www.javashuo.com/article/p-oicoxmss-kw.html 做者博客:傑哥很忙 歡迎轉載,請在明顯位置給出出處及連接