[TOC] Redis概述與安裝使用 Author:SimpleWu Redis簡介 Redis英語全稱:( REmote DIctionary Server ) 遠程字典伺服器。 是完全開源免費的,用C語言編寫的,遵守BSD協議,是一個高性能的(key/value)分散式記憶體資料庫,基於記憶體運行並 ...
目錄
Redis概述與安裝使用
Author:SimpleWu
GitHub-redis
Redis簡介
Redis英語全稱:( REmote DIctionary Server ) 遠程字典伺服器。
是完全開源免費的,用C語言編寫的,遵守BSD協議,是一個高性能的(key/value)分散式記憶體資料庫,基於記憶體運行並支持持久化的NoSQL資料庫,是當前最熱門的NoSql資料庫之一,也被人們稱為數據結構伺服器
Redis通常被稱為數據結構伺服器,因為值(value)可以是 字元串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
- Redis 官網:https://redis.io/
- Redis中文網站:http://www.redis.cn
- Redis 線上測試工具:http://try.redis.io/
什麼是NoSQL?
概念 : NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”-泛指非關係型的資料庫
解析:泛指非關係型的資料庫。隨著互聯網web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心。
傳統單機 MySQL 瓶頸
- 數據量的總大小,一個機器1放不下,單表數據達到500萬時MySQL性能低
- 數據的索引(B + Tree) 一個機器的記憶體放不下時
- 訪問量(讀寫混合)一個實例不能承受
為什麼需要NoSQL
今天我們可以通過第三方平臺(如:Baidu,Google,Facebook等)可以很容易的訪問和抓取數據。用戶的個人信息,社交網路,地理位置,用戶生成的數據和用戶操作日誌已經成倍的增加。我們如果要對這些用戶數據進行挖掘,那SQL資料庫已經不適合這些應用了,
NoSQL資料庫的發展能很好的處理這些大數據。和傳統的關係型資料庫相比,NoSQL具有以下的優勢:
- high performance ,高併發讀寫,動態頁面展示與交互,比如微博點贊評論等操作,實時統計線上人數排行榜等
- huge storage,海量數據的高效存儲和訪問,大型網站的用戶登錄系統
- high scalability && high availability,高可擴展性和高可用性
互聯網的瓶頸
高併發讀寫:
針對短時間內具有高併發的情況,特別是短時間內大量的寫入操作。傳統資料庫針對這種情況就有些力不從心了。
海量數據的高效率存儲和訪問:
現在的數據已經是非常龐大了,一些大型網站每天產生的數據量是相當恐怖的。存儲了這麼多的數據,查詢效率就會受到很大的影響。
高科擴展性和高可用性:
基於傳統資料庫的結構,我們的資料庫表是非常難以橫向擴展的,比如增加一個新的欄位時或者修改某個欄位時,牽一發而動全身。
數據存儲的方式單一:
在資料庫中針對形形色色的數據,我們都只有採用表結構的方式來存儲數據。
No-Sql能幹什麼?
易擴展:
NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性。數據之間無關係,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。
大數據量性能高:
NoSQL資料庫都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀。這得益於它的無關係性,資料庫的結構簡單。
一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的交互頻繁的應用,Cache性能不高。而NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多了
多樣靈活的數據模型:
NoSQL無需事先為要存儲的數據建立欄位,隨時可以存儲自定義的數據格式。而在關係資料庫里,增刪欄位是一件非常麻煩的事情。如果是非常大數據量的表,增加欄位簡直就是一個噩夢
NoSQL資料庫的四大分類
- 鍵值(Key-Value)存儲資料庫
- 文檔型資料庫(bson)
- 列存儲資料庫
- 圖形(Graph)資料庫
對比:
- key-value:內容緩存,主要用於處理大量數據的高訪問負載,也用於一些日誌系統等。優點:查詢速度快。缺點:數據無結構化,通常只被當做字元串或者二進位數據。
- 列存儲:分散式文件系統。優點:查找速度快,可擴展性強,更容易進行分散式擴展。缺點:功能相對局限。
- 文檔型:與key-value類似,不同的是資料庫能夠瞭解value的內容。優點:數據結構要求不嚴格,表結構可變,不需要預先定義表結構。缺點:查詢效率不高,缺乏統一的語法。
- 圖形:社交網路,推薦系統。專註於構建關係圖譜。優點:利用圖形結構相關演算法,來尋求最短路徑。缺點:很多時候需要對整個圖形計算才能得出需要的信息。
Redis能幹嘛?
- 緩存
- 網站訪問統計
- 任務隊列
- 數據過期處理
- 應用排行榜
- 分散式集群架構中的session分離
Redis的特點?
- Redis支持數據的持久化,可以將記憶體中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
- Redis支持數據的備份,即master-slave模式的數據備份。
Redis的安裝
Redis 支持多種平臺,大多數情況下考慮到記憶體會在Linux下搭建Redis伺服器。
下載地址:
Linux版本
http://www.redis.cn/download.html
windowns版本
https://github.com/MicrosoftArchive/redis/releases
Linxu環境下安裝redis
下載:
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget http://download.redis.io/releases/redis-4.0.6.tar.gz
解壓:
[root@localhost src]# tar -zxf redis-4.0.6.tar.gz
[root@localhost src]# ll
total 1688
drwxrwxr-x. 6 root root 4096 Dec 4 2017 redis-4.0.6
-rw-r--r--. 1 root root 1723533 Dec 4 2017 redis-4.0.6.tar.gz
編譯:
[root@localhost redis-4.0.6]# make
# 如果編譯失敗請先下載編譯依賴,編譯成功不需要執行以下命令
yum install wget make gcc tcl
安裝:
# 將redis安裝到/usr/local/redis目錄
[root@localhost redis-4.0.6]# make PREFIX=/usr/local/redis install
# 進入redis安裝目錄
[root@localhost redis-4.0.6]# cd /usr/local/redis/bin/
[root@localhost bin]# ll
total 35432
-rwxr-xr-x. 1 root root 5597214 Aug 30 05:34 redis-benchmark
-rwxr-xr-x. 1 root root 8314825 Aug 30 05:34 redis-check-aof
-rwxr-xr-x. 1 root root 8314825 Aug 30 05:34 redis-check-rdb
-rwxr-xr-x. 1 root root 5736370 Aug 30 05:34 redis-cli
lrwxrwxrwx. 1 root root 12 Aug 30 05:34 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8314825 Aug 30 05:34 redis-server
# 如果出現以上文件說明redis安裝成功了
運行:
[root@localhost bin]# ./redis-server
使用內置的客戶端命令redis-cli進行使用:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379>
修改redis配置文件
# 複製redis.conf文件到/etc目錄
[root@localhost redis-4.0.6]# cp /usr/local/src/redis-4.0.6/redis.conf /etc/redis.conf
# 編輯redis.conf文件
[root@localhost ~]# vim /etc/redis.conf
# 設置redis為後臺啟動進程,將daemonize no 改為 daemonize yes
daemonize yes
# 修改綁定的主機地址,將#bind 127.0.0.1改成自己的ip地址,去掉"#"號
bind 192.168.41.22
關閉redis服務,重新運行
[root@localhost bin]# ./redis-cli shutdown
# 重新啟動redis載入指定的配置文件
[root@localhost bin]# ./redis-server /etc/redis.conf
將redis-server和redis-cli命令加入環境變數
vim /etc/proflie
# 在最後一行加入
export PATH=/usr/local/redis/bin:$PATH
使其立即生效
source /etc/proflie
如果不想手動編輯redis.conf文件可以通過redis提供的服務工具生成這部分可以不執行
[root@localhost ~]# cd /usr/local/src/redis-4.0.6/utils
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
# 啟動redis
[root@localhost utils]# service redis_6379 start
Starting Redis server...
# 查看redis是否啟動
[root@localhost utils]# service redis_6379 status
Redis is running (23804)
# 關閉redis
[root@localhost utils]# service redis_6379 stop
Stopping ...
Redis stopped
windows下安裝Redis
在我們windows下安裝redis可以去微軟github上下載,但是只提供了64位操作系統的。
這裡我們下載 Redis-x64-xxx.zip壓縮包到 任意目錄,解壓後,將文件夾重新命名為 redis。Redis分為伺服器和客戶端兩種,必須啟動伺服器才能使用Redis。
啟動redis服務
啟動方式來到doc界面輸入:
redis-server
啟動後出現這種玩意:
[2900] 20 Nov 15:20:23.629 # Warning: no config file specified, using the defaul
t config. In order to specify a config file use redis-server /path/to/redis.conf
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.100 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 2900
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
[2900] 20 Nov 15:20:23.637 # Server started, Redis version 3.2.100
[2900] 20 Nov 15:20:23.637 * The server is now ready to accept connections on po
rt 6379
其實解壓後我們可以直接運行redis-server.exe也是可以啟動的效果同上。
客戶端連接伺服器
doc界面輸入:
Redis-cli –h host –p port –a password
獲取直接打開redis-cli.exe效果一致。
Redis啟動後的配置
進程相關:單進程模型來處理客戶端的請求。對讀寫等事件的響應是通過對epoll函數的包裝來做到的。Redis的實際處理速度完全依靠主進程的執行效率。
密碼相關:統一密碼管理,16個庫都是同樣密碼,要麼全部連上,要麼一個也連接不上。
Redis索引資料庫索引從0開始
資料庫相關
- 預設16個資料庫,下標從0開始,初始預設使用0號庫,可以通過配置文件修改資料庫預設值。
- select:切換資料庫 如:select 1,則切換到1的資料庫
- dbsize:可查看當前資料庫key的數據
- flushdb:清空當前資料庫
- flushall:清空所有資料庫
- keys:獲取當前資料庫的key,如:keys 獲取所有,key k? 獲取字母以k開始且兩字元的,key k 以k開始的
Redis的五大類型
- String(字元串)
- Hash(哈希)
- List(列表)
- Set(集合)
- Zset(sorted set:有序集合)
Redis string類型
tring是redis最基本的類型,一個key對應一個value。String類型是二進位安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象。string類型是Redis最基本的數據類型,一個redis中字元串value最多可以是512M。
指令 | 描述 |
---|---|
SET key value | 設置指定 key 的值。 |
GET key | 獲取指定 key 的值。 |
STRLEN KEY | 返回 key 所儲存的字元串值的長度。 |
GETRANGE key start end | 返回 key 中字元串值的子字元 |
SETRANGE key offset value | 這個命令的作用是覆蓋key對應的string的一部分,從指定的offset處開始,覆蓋value的長度。 |
GETSET key value | 將給定 key 的值設為 value ,並返回 key 的舊值(old value)。 |
INCR key | 將 key 中儲存的數字值增一。 |
INCRBY key increment | 將 key 所儲存的值加上給定的增量值(increment) 。 |
DECR key | 將 key 中儲存的數字值減一。 |
DECRBY key decrement | key 所儲存的值減去給定的減量值(decrement) 。 |
MGET key1 [key2..] | 獲取所有(一個或多個)給定 key 的值。 |
MSET key value [key value ...] | 同時設置一個或多個 key-value 對。 |
APPEND key value | 如果 key 已經存在並且是一個字元串, APPEND 命令將 value 追加到 key 原來的值的末尾。 |
Redis 哈希(Hash)
Redis Hash:是一個string類型的field和value(以鍵值)的映射表,hash特別適合用於存儲對象。
存儲大小:每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
案例:設置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中
指令 | 描述 |
---|---|
HSET key field value | 將哈希表 key 中的欄位 field 的值設為 value 。 |
HSET key field value | 將哈希表 key 中的欄位 field 的值設為 value 。 |
HGET key field | 獲取存儲在哈希表中指定欄位的值。 |
HMSET key field1 value1 [field2 value2 ] | 同時將多個 field-value (域-值)對設置到哈希表 key 中。 |
HMGET key field1 [field2] | 獲取所有給定欄位的值 |
HGETALL key | 獲取在哈希表中指定 key 的所有欄位和值 |
HDEL key field1 [field2] | 刪除一個或多個哈希表欄位 |
HEXISTS key field | 查看哈希表 key 中,指定的欄位是否存在 |
HKEYS key | 獲取所有哈希表中的欄位 |
HLEN key | 獲取哈希表中欄位的數量 |
HSETNX key field value | 只有在欄位 field 不存在時,設置哈希表欄位的值 |
HVALS key | 獲取哈希表中所有值 |
Redis 列表(List)
Redis列表list:
Redis列表是簡單的字元串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
存儲數據量:
一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)
指令 | 描述 |
---|---|
LPUSH key value1 [value2] | 將一個或多個值插入到列表頭部 |
RPUSH key value1 [value2] | 將一個或多個值插入到列表尾部 |
LRANGE key start stop | 獲取列表指定範圍內的元素 |
LPOP key | 移出並獲取列表的第一個元素 |
RPOP key | 移除並獲取最後一個元素 |
LINDEX key index | 通過索引獲取列表中的元素 |
LLEN key | 獲取列表長度 |
LTRIM key start stop | 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除 |
LREM key | 移除列表元素 |
LSET key index value | 通過索引設置列表元素的值 |
LINSERT key BEFORE|AFTER pivot value | 在列表的元素前或者後插入元素 |
Redis 集合(Set)
Redis 集合-set
Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重覆的數據。
Redis 中 集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。
存儲數據量:
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
指令 | 描述 |
---|---|
SADD key member1 [member2] | 向集合添加一個或多個成員 |
SCARD key | 獲取集合的成員數 |
SMEMBERS key | 返回集合中的所有成員 |
SISMEMBER key member | 判斷 member 元素是否是集合 key 的成員 |
SREM key member1 [member2] | 移除集合中一個或多個成員 |
SRANDMEMBER key [count] | 返回集合中一個或多個隨機數 |
SPOP key | 移除並返回集合中的一個隨機元素 |
SMOVE source destination member | 將 member 元素從 source 集合移動到 destination 集合 |
Redis 有序集合(sorted set)
Redis 有序集合(sorted set):
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重覆的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(score)卻可以重覆。
存儲數量:集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
指令 | 描述 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一個或多個成員,或者更新已存在成員的分數 |
ZRANGE key start stop [WITHSCORES] | 通過索引區間返回有序集合成指定區間內的成員 |
ZRANGEBYSCORE key min max [WITHSCORES][LIMIT] | 通過分數返回有序集合指定區間內的成員 |
ZREM key member [member ...] | 移除有序集合中的一個或多個成員 |
ZREMRANGEBYLEX key min max | 移除有序集合中給定的字典區間的所有成員 |
ZCARD key | 獲取有序集合的成員數 |
ZCOUNT key min max | 計算在有序集合中指定區間分數的成員數 |
ZREVRANK key member | 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序 |
ZSCORE key member | 返回有序集中,成員的分數值 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定區間內的成員,通過索引,分數從高到底 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分數區間內的成員,分數從高到低排序 |
ZSCAN key cursor [MATCH pattern][COUNT count] | 迭代有序集合中的元素(包括元素成員和元素分值) |
各個數據類型的應用場景
類型 | 簡介 | 特性 | 場景 |
---|---|---|---|
String | 二進位安全 | 可以包含任何數據,比如jpg圖片或者序列化的對象,一個鍵最大能存儲512M | |
Hash | 鍵值對集合,即編程語言中的Map類 | 適合存儲對象,並且可以像資料庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字元串反序列化成對象修改完再序列化存回去) | 存儲、讀取、修改用戶屬性 |
List | 鏈表(雙向鏈表) | 增刪快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的時間線) 2,消息隊列 |
Set | 哈希表實現,元素不重覆 | 1、添加、刪除,查找的複雜度都是O(1) 2、為集合提供了求交集、並集、差集等操作 | 1、共同好友 2、利用唯一性,統計訪問網站的所有獨立ip 3、好友推薦時,根據tag求交集,大於某個閾值就可以推薦 |
SortedSet | 將Set中的元素增加一個權重參數score,元素按score有序排列 | 數據插入集合時,已經進行天然排序 | 1、排行榜 2、帶權重的消息隊列 |