Redis是非關係型數據庫(nosql),數據保存在內存中,安全性低,但讀取速度快。java
Redis主要存儲變化較快且數據不是特別重要的數據。python
Redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。mysql
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合能夠對關係數據庫起到很好的補充做用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。c++
簡而言之redis是屬於非關係型數據庫,存儲結構是:key-value,內存-磁盤的存儲方式。golang
1> 登陸會話存儲:存儲在redis中,與memcached相比,數據不會丟失。redis
2> 排行版/計數器:好比一些秀場類的項目,常常會有一些前多少名的主播排名。還有一些文章閱讀量的技術,或者新浪微博的點贊數等。sql
3>做爲消息隊列:好比celery就是使用redis做爲中間人。數據庫
4> 當前在線人數:仍是以前的秀場例子,會顯示當前系統有多少在線人數。vim
5> 一些經常使用的數據緩存:好比咱們的BBS論壇,板塊不會常常變化的,可是每次訪問首頁都要從mysql中獲取,能夠在redis中緩存起來,不用每次請求數據庫。緩存
6> 把前200篇文章緩存或者評論緩存:通常用戶瀏覽網站,只會瀏覽前面一部分文章或者評論,那麼能夠把前面200篇文章和對應的評論緩存起來。用戶訪問超過的,就訪問數據庫,而且之後文章超過200篇,則把以前的文章刪除。
7> 好友關係:微博的好友關係使用redis實現。
8> 發佈和訂閱功能:能夠用來作聊天軟件。
簡而言之,Redis能夠把內存數據同步到磁盤,便可以將數據持久化。
redis持久化會在磁盤上依賴兩個文件
數據文件:rdb
日誌文件:aof
redis實現持久化兩種機制
RDB:週期的將內存中的數據備份到磁盤
AOF:藉助於一個日誌文件,這個文件會記錄每次操做
字符類型
列表類型
有序集合類型
無序集合類型
哈希表類型
memcached |
redis |
|
類型 |
純內存數據庫 |
內存磁盤同步數據庫 |
數據類型 |
在定義value時就要固定數據類型 |
不須要 |
虛擬內存 |
不支持 |
支持 |
過時策略 |
支持 |
支持 |
存儲數據安全 |
不支持 |
能夠將數據同步到dump.rdb中 |
災難恢復 |
不支持 |
能夠將磁盤中的數據恢復到內存中 |
分佈式 |
支持 |
主從同步 |
訂閱與發佈 |
不支持 |
支持 |
直接使用yum安裝的Redis版本是3.2的,最新版的安裝能夠從官網下載安裝包進行解壓編譯安裝。
1> 下載安裝包,解壓
[root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz [root@localhost ~]# tar -xf redis-5.0.0.tar.gz [root@localhost ~]# ls redis-5.0.0.tar.gz redis-5.0.0
2> 下載編譯環境
[root@localhost ~]# yum install gcc gcc-c++ -y
3> 編譯安裝
[root@localhost ~]# cd redis-5.0.0 [root@localhost redis-5.0.0]# make …….. make[1]: Leaving directory `/root/redis-5.0.0/src'
4> 將啓動文件拷貝到環境變量
[root@localhost redis-5.0.0]# ls 00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests BUGS deps MANIFESTO runtest sentinel.conf utils CONTRIBUTING INSTALL README.md runtest-cluster src [root@localhost ~]# mv redis-5.0.0 /usr/local/redis #移動安裝文件 [root@localhost ~]# cd /usr/local/reids/ [root@localhost reids]# cp src/redis-server /usr/bin/ [root@localhost reids]# cp src/redis-cli /usr/bin/
5> 啓動Redis數據庫服務
yum安裝的直接用命令systemctl restart redis,編譯安裝的使用配置文件啓動,一個主機上能夠運行多個Redis實例。
通常來講,第三方軟件安裝在/usr/local或者/opt下。
Redis依賴配置文件redis.conf啓動。
[root@localhost reids]# redis-server redis.conf #一大堆文件# [root@localhost reids]# ss -tnl LISTEN 0 128 192.168.16.4:6379 *:*
[root@localhost redis-5.0.0]# vim redis.conf ……. # dbid is a number between 0 and 'databases'-1 databases 16 #在Redis數據庫當中數據庫以數字形式管理,默認最多有16個數據庫,此處上限能夠更改 ……. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bind 192.168.16.4 #bind後面的地址應該改成主機地址而不是默認的迴環地址,在客戶端基於該ip進行登陸。 ….. # If port 0 is specified Redis will not listen on a TCP socket. port 6379 #默認端口號6379 …… # Note that Redis will write a pid file in /var/run/redis.pid when daemonized. daemonize yes #守護進程,默認是no,改成yes可避免啓動時出現的大堆文件
[root@localhost reids]# redis-cli -p 6379 -h 192.168.16.4 192.168.16.4:6379>
Redis數據庫以數字形式管理,默認爲0,默認數據庫範圍0-15,與mariadb的use切換數據庫不一樣,Redis直接用select+數字進行數據庫切換。同時Redis數據庫在輸入命令後會進行人性化的命令提示。
192.168.16.4:6379> select 9 OK 192.168.16.4:6379[9]> select 0 OK 192.168.16.4:6379>
格式: set key value (關鍵字 值)
將字符串的value關聯到key,若是能夠已經持有其餘值沒set命令就覆寫舊值,無視其類型。而且默認的過時時間是永久,即永遠不會過時。
#添加用戶 192.168.16.4:6379> set username zxj OK #查看添加的內容 192.168.16.4:6379> get username "zxj" #查看全部的key值 192.168.16.4:6379> set username2 wrl OK 192.168.16.4:6379> keys * 1) "username" 2) "username"
格式:del key
192.168.16.4:6379> del username (integer) 1 192.168.16.4:6379> keys * 1) "username2"
格式:set key value EX timeout
192.168.16.4:6379> set username zxj ex 30 #設置過時時間爲30秒,30秒後到期過時,ex:expiration EX seconds|PX milliseconds ok 192.168.16.4:6379> keys * 1) "username2" 2) "username" 192.168.16.4:6379> keys * 1) "username2"
格式: TTL key
192.168.16.4:6379> set username3 zxcv ex 60 OK 192.168.16.4:6379> ttl username3 (integer) 51 192.168.16.4:6379> ttl username3 (integer) 21
在列表左邊添加元素(相似於彈匣裝彈)。
格式:lpush key value
192.168.16.4:6379> lpush language python c++ java #value值能夠爲多個 (integer) 3
查看列表中的元素
格式:lrange key start stop,左邊第一位爲0, 右邊第一位爲-1;
192.168.16.4:6379> lrange language 0 -1 #查看列表中的全部元素 1) "java" 2) "c++" 3) "python" 192.168.16.4:6379> lrange language 0 1 1) "java" 2) "c++" 192.168.16.4:6379> lrange language -2 -1 1) "c++" 2) "python"
在列表右邊添加元素(正常添加)
格式:rpush key value
192.168.16.4:6379> lrange language 0 -1 1) "java" 2) "c++" 3) "python" 4) "jinjia2"
移除列表中的元素
移除並返回列表key的頭元素
格式:lpop key
192.168.16.4:6379> lpop language "java"
移除並返回列表的尾元素
格式:rpop key
192.168.16.4:6379> rpop language "jinjia2"
#pop操做後表中元素 192.168.16.4:6379> lrange language 0 -1 1) "c++" 2) "python"
指定返回第幾個元素
格式:lindex key index
192.168.16.4:6379> lrange language 0 -1 1) "jingjia2" 2) "c++" 3) "c" 4) "java" 5) "paython" 6) "golang" 7) "c++" 8) "python" 192.168.16.4:6379> lindex language 1 "c++" 192.168.16.4:6379> lindex language 2 "c" 192.168.16.4:6379> lindex language 4 "paython" 192.168.16.4:6379> lindex language 0 "jingjia2"
獲取列表中的元素個數(查看長度)
格式:llen key
192.168.16.4:6379> llen language (integer) 8
刪除指定的元素
格式:lrem key count value (刪除count個value)
根據參數 count 的值,移除列表中與參數 value 相等的元素。count的值能夠是如下幾種:
count > 0:從表頭開始向表尾搜索,移除與value相等的元素,數量爲count。
count < 0:從表尾開始向表頭搜索,移除與 value相等的元素,數量爲count的絕對值。
count = 0:移除表中全部與value 相等的值。
192.168.16.4:6379> rpush language python python python python (integer) 12 192.168.16.4:6379> lrange language 0 -1 1) "jingjia2" 2) "c++" 3) "c" 4) "java" 5) "paython" 6) "golang" 7) "c++" 8) "python" 9) "python" 10) "python" 11) "python" 12) "python 192.168.16.4:6379> lrem language 3 python #刪除三個Python (integer) 3 192.168.16.4:6379> lrange language 0 -1 1) "jingjia2" 2) "c++" 3) "c" 4) "java" 5) "paython" 6) "golang" 7) "c++" 8) "python" 9) "python"
集合中的元素不可重複,自動去重
添加元素
格式:sadd see value1 ….
192.168.16.4:6379> sadd lan python java c c++ python python java (integer) 4 #自動去重
查看集元素
格式:smembers set
192.168.16.4:6379> SMEMBERS lan 1) "c" 2) "java" 3) "python" 4) "c++"
刪除集合元素
格式:srem set member
192.168.16.4:6379> SREM lan java (integer) 1 192.168.16.4:6379> SMEMBERS lan 1) "python" 2) "c++" 3) "c"
查看集合中的元素個數
格式:scard set
192.168.16.4:6379> SCARD lan (integer) 3
獲取多個集合的交集
格式:sinter set1 set2
192.168.16.4:6379> SMEMBERS lan 1) "python" 2) "c++" 3) "c" 4) "xiaowu" 5) "java" 192.168.16.4:6379> SMEMBERS lan1 1) "dupu" 2) "liwang" 3) "nihao" 4) "java" 5) "xiaowu" 192.168.16.4:6379> SINTER lan1 lan 1) "java" 2) "xiaowu" 192.168.16.4:6379> SINTER lan lan1 1) "xiaowu" 2) "java"
獲取多個集合的並集
格式:sunion set1 set2
192.168.16.4:6379> SUNION lan lan1 1) "c++" 2) "c" 3) "dupu" 4) "liwang" 5) "nihao" 6) "xiaowu" 7) "java" 8) "python"
哈希能夠理解爲表的嵌套,表中含有表。
添加新值
格式:hset key filed value
192.168.16.4:6379> HSET zxj age 23 (integer) 1 192.168.16.4:6379> HSET zxj high 150 (integer) 1 192.168.16.4:6379> HSET zxj gender women (integer) 1
取出哈希表中filed對應的值
格式:hget key filed
192.168.16.4:6379> HGET zxj gender "women"
刪除哈希表中filed對應的值
格式:hdel key filed
192.168.16.4:6379> HDEL zxj gender (integer) 1 192.168.16.4:6379> hget zxj gender (nil)
獲取哈希表中全部的filed和value
格式:hgetall key
192.168.16.4:6379> hgetall zxj 1) "age" 2) "23" 3) "high" 4) "150"
獲取哈希表中全部的filed
格式:hkeys key
192.168.16.4:6379> hkeys zxj 1) "age" 2) "high"
獲取哈希表中全部的value
格式:hvals key
192.168.16.4:6379> hvals zxj 1) "23" 2) "150"
判斷哈希表中是否存在某個filed
格式:hexists key filed
192.168.16.4:6379> hexists zxj gender (integer) 0 192.168.16.4:6379> hexists zxj age (integer) 1
獲取哈希表中總的鍵值對
格式:hlen key
192.168.16.4:6379> hlen zxj (integer) 2
Redis事務能夠一次執行多個命令,事務具備如下特徵:
隔離操做:事務中的全部命令都會序列化、按順序地執行,不會被其餘命令打擾。
原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。
開啓事務:multi
提交:exec
取消事務:discard
#在一個窗口開啓事務 192.168.16.4:6379> MULTI OK #建立兩條數據 192.168.16.4:6379> set friendone zxj QUEUED 192.168.16.4:6379> set friendtwo wrl QUEUED #此時還沒有提交,在打開一個窗口進行查看,因爲隔離性,並無添加兩條數據 [root@localhost ~]# redis-cli -p 6379 -h 192.168.16.4 192.168.16.4:6379> keys * (empty list or set) #返回窗口提交 192.168.16.4:6379> exec 1) OK 2) OK #再去另一個窗口查看 192.168.16.4:6379> keys * 1) "friendone" 2) "friendtwo"
訂閱某個頻道的消息
格式:subscribe channel
#在窗口以訂閱頻道88.7(頻道值隨便設置) 192.168.16.4:6379> SUBSCRIBE 88.7 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "88.7" 3) (integer) 1 #光標一直懸浮停留準備接收信息
給某個頻道發佈消息
格式:publish channel message 從某個頻道發佈信息
#在窗口2 發佈信息 192.168.16.4:6379> PUBLISH 88.7 westlife (integer) 1 192.168.16.4:6379> PUBLISH 88.7 "westlife's songs are very populary between 90s" (integer) 1 #在窗口1查看訂閱的頻道 1) "message" 2) "88.7" 3) "westlife" 1) "message" 2) "88.7" 3) "westlife's songs are very populary between 90s"
Redis的訂閱與分佈是一種異步操做