Redis數據庫(一)

1. Redis簡介

  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

2. Redis應用場景

  1> 登陸會話存儲:存儲在redis中,與memcached相比,數據不會丟失。redis

  2> 排行版/計數器:好比一些秀場類的項目,常常會有一些前多少名的主播排名。還有一些文章閱讀量的技術,或者新浪微博的點贊數等。sql

  3>做爲消息隊列:好比celery就是使用redis做爲中間人。數據庫

  4> 當前在線人數:仍是以前的秀場例子,會顯示當前系統有多少在線人數。vim

  5> 一些經常使用的數據緩存:好比咱們的BBS論壇,板塊不會常常變化的,可是每次訪問首頁都要從mysql中獲取,能夠在redis中緩存起來,不用每次請求數據庫。緩存

  6> 把前200篇文章緩存或者評論緩存:通常用戶瀏覽網站,只會瀏覽前面一部分文章或者評論,那麼能夠把前面200篇文章和對應的評論緩存起來。用戶訪問超過的,就訪問數據庫,而且之後文章超過200篇,則把以前的文章刪除。

  7> 好友關係:微博的好友關係使用redis實現。

  8> 發佈和訂閱功能:能夠用來作聊天軟件。

  

   簡而言之,Redis能夠把內存數據同步到磁盤,便可以將數據持久化。

3. Redis的持久化(數據庫備份)

redis持久化會在磁盤上依賴兩個文件

  數據文件:rdb

  日誌文件:aof

 

redis實現持久化兩種機制

  RDB:週期的將內存中的數據備份到磁盤

  AOF:藉助於一個日誌文件,這個文件會記錄每次操做

4. Redis中的數據類型

  字符類型

  列表類型

  有序集合類型

  無序集合類型

  哈希表類型

5. Redis和memcached的比較

 

memcached

redis

類型

純內存數據庫

內存磁盤同步數據庫

數據類型

在定義value時就要固定數據類型

不須要

虛擬內存

不支持

支持

過時策略

支持

支持

存儲數據安全

不支持

能夠將數據同步到dump.rdb中

災難恢復

不支持

能夠將磁盤中的數據恢復到內存中

分佈式

支持

主從同步

訂閱與發佈

不支持

支持

 

6.Redis的使用

6.1 下載安裝

  直接使用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     *:*    

6.2 Redis的配置文件 

[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可避免啓動時出現的大堆文件

6.3鏈接數據庫

[root@localhost reids]# redis-cli -p 6379 -h 192.168.16.4
192.168.16.4:6379>

6.4  切換數據庫

  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>

6.5  添加 

  格式: 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"

6.6 刪除

  格式:del key

192.168.16.4:6379> del username
(integer) 1
192.168.16.4:6379> keys *
1) "username2"

6.7 設置過時時間

  格式: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"

6.8  查看過時時間

  格式: 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

6.9  列表操做(list)  

在列表左邊添加元素(相似於彈匣裝彈)。

  格式: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"

6.10  set集合的操做

集合中的元素不可重複,自動去重

  添加元素

  格式: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"

6.11  hash,哈希操做

  哈希能夠理解爲表的嵌套,表中含有表。

 

添加新值

  格式: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

6.12 對事務的操做

  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"

6.13  訂閱與發佈

訂閱某個頻道的消息

  格式: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的訂閱與分佈是一種異步操做

相關文章
相關標籤/搜索