天天看點

redis介紹,redis安裝,redis持久化,redis資料類型

Redis是一個開源的使用ANSI C語言編寫、支援網絡、可基于記憶體亦可持久化的日志型、Key-Value資料庫,并提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。

redis是一個key-value存儲系統。和Memcached類似,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩存在記憶體中。差別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步。

Redis 是一個高性能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很友善。

Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複制。存盤可以有意無意的對資料進行寫操作。由于完全實作了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道并接收主伺服器完整的消息釋出記錄。同步對讀取操作的可擴充性和資料備援很有幫助。

Redis官網:

https://redis.io/ Redis特點總結:

  • Redis和Memcached類似,也屬于k-v資料存儲
  • 支援更多value類型,除了和string外,還支援hash、lists(連結清單)、sets(集合)和sorted sets(有序集合)
  • redis使用了兩種檔案格式:全量資料(RDB)和增量請求(aof)。全量資料格式是把記憶體中的資料寫入磁盤,便于下次讀取檔案進行加載。增量請求檔案則是把記憶體中的資料序列化為操作請求,用于讀取檔案進行replay得到資料,這種類似于mysql binlog。
  • redis的存儲分為記憶體存儲、磁盤存儲和log檔案三部分

redis安裝

下載下傳、解包、編譯安裝,素質三連:

[root@localhost ~]# cd /usr/local/src/
[root@localhost /usr/local/src]# wget http://download.redis.io/releases/redis-4.0.1.tar.gz
[root@localhost /usr/local/src]# tar -zxvf redis-4.0.1.tar.gz
[root@localhost /usr/local/src]# cd redis-4.0.1/
[root@localhost /usr/local/src/redis-4.0.1]# make && make install
[root@localhost /usr/local/src/redis-4.0.1]# echo $?
0
[root@localhost /usr/local/src/redis-4.0.1]# redis-   # 按兩下tap鍵,出來以下指令代表安裝成功
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli        redis-sentinel   redis-server     
[root@localhost /usr/local/src/redis-4.0.1]#           

拷貝配置檔案:

[root@localhost /usr/local/src/redis-4.0.1]# cp redis.conf /etc/redis.conf

編輯配置檔案内容:

[root@localhost /usr/local/src/redis-4.0.1]# vim /etc/redis.conf   # 修改如下配置
daemonize yes   # 設定Redis為背景啟動
logfile "/var/log/redis.log"   # 定義日志檔案的存儲路徑
dir /data/redis_data/  # 定義資料存儲檔案的路徑
appendonly yes  # 開啟aof存儲日志           

建立資料存儲檔案的目錄:

mkdir /data/redis_data/

啟動redis服務:

[root@localhost ~]# redis-server /etc/redis.conf 
[root@localhost ~]# ps aux |grep redis
root       6208  0.1  0.4 145244  7524 ?        Ssl  17:12   0:00 redis-server 127.0.0.1:6379
root       6213  0.0  0.0 112668   972 pts/0    S+   17:12   0:00 grep --color=auto redis
[root@localhost ~]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6208/redis-server 1 
[root@localhost ~]#            

檢視redis日志:

[root@localhost ~]# less /var/log/redis.log
6208:M 29 Dec 17:12:21.918 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
6208:M 29 Dec 17:12:21.918 # Server initialized
6208:M 29 Dec 17:12:21.918 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit
_memory=1' for this to take effect.
6208:M 29 Dec 17:12:21.918 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create
 latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hug
epage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be resta
rted after THP is disabled.
6208:M 29 Dec 17:12:21.918 * Ready to accept connections           

可以看到日志檔案中有兩個警告:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.

這個警告意思是背景儲存可能在低記憶體條件下失敗

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis.

意思是“您的核心中啟用了透明的大型頁面(THP)支援。這将導緻Redis的延遲和記憶體使用問題。”

是以我們需要修改一下這兩個核心參數:

[root@localhost ~]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@localhost ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost ~]#           

最後把這兩條指令放到 /etc/rc.local 裡,讓伺服器一啟動就執行這兩條指令:

[root@localhost ~]# vim /etc/rc.local
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled           

redis持久化

Redis提供了兩種持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File),如果關閉持久化,資料就完全存在記憶體中。如果你沒有資料持久化的需求,也完全可以關閉RDB和AOF方式,這樣的話,redis将變成一個純記憶體資料庫,就像memcache一樣。

  • RDB,簡而言之,就是在不同的時間點,将redis存儲的資料生成快照并存儲到磁盤等媒體上。
  • AOF,則是換了一個角度來實作持久化,那就是将redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,隻要把這些寫指令從前到後再重複執行一遍,就可以實作資料恢複了。

其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重新開機的話,則會優先采用AOF方式來進行資料恢複,這是因為AOF方式的資料恢複完整度更高。有一點要注意的是:由于AOF會記錄全部的指令,沒有去做優化的話指令就會随着日積月累越積越多,甚至達到上百G,而且那些資料已經過期的也會被記錄着,是以最好是定時就去删除一些過期的資料的寫入指令,以達到優化的目的。

以下是Redis持久化相關參數,在 /etc/redis.conf 裡可以修改這些參數,一般預設即可:

  • save 900 1 #表示每15分鐘(900秒)且至少有1個key改變,就觸發一次持久化
  • save 300 10 #表示每5分鐘(300秒)且至少有10個key改變,就觸發一次持久化
  • save 60 10000 #表示每60秒至少有10000個key改變,就觸發一次持久
  • save "" #這樣可以禁用rdb持久化
  • appendonly yes #如果是yes,則開啟aof持久化
  • appendfilename “appendonly.aof” # 指定aof檔案名字
  • appendfsync everysec #指定fsync()調用模式,有三種no(不調用fsync),always(每次寫都會調用fsync),everysec(每秒鐘調用一次fsync)。第一種最快,第二種資料最安全,但性能會差一些,第三種為這種方案,預設為第三種。

redis資料類型

1.string類型:

string為最簡單的類型,與Memcached一樣的類型,一個key對應一個value,其支援的操作與Memcached的操作類似,它的功能更豐富。設定可以存二進制的對象。

進入redis指令行的指令如下:

[root@localhost ~]# redis-cli

127.0.0.1:6379>

string類型使用示例:

[root@localhost ~]# redis-cli
127.0.0.1:6379> set mykey "hello world"  # 使用雙引号來表示這個value是string類型的
OK
127.0.0.1:6379> get mykey  # 得到鍵的值
"hello world"
127.0.0.1:6379> mset k1 1 k2 2 k3 3  # 使用mset可以設定多個鍵/值
OK
127.0.0.1:6379> mget k1 k2 k3   # 相對的使用mget可以得到多個鍵的值
1) "1"
2) "2"
3) "3"
127.0.0.1:6379>           

提示:在redis指令行中也可以使用tap鍵來補全指令,而且redis的指令并不區分大小寫,和mysql一樣。

2.list類型:

list是一個連結清單結構,主要功能是push、pop、擷取一個範圍的所有值等等,如果有學習過程式設計語言的話就會很好了解這種資料類型。操作中key了解為連結清單的名字。使用 list 結構,我們可以輕松地實作最新消息排行等功能(比如新浪微網誌的 TimeLine )。list 的另一個應用就是消息隊列,可以利用 list 的 push操作,将任務存在 list 中,然後工作線程再用pop操作将任務取出進行執行。這個連結清單和堆棧一樣,存在先進後出,後進先出的概念。

list類型使用示例:

127.0.0.1:6379> lpush list1 "hello world"  # list1是連結清單的名字,可以把它當做是一個集合或數組
(integer) 1
127.0.0.1:6379> lpush list1 "data"   # 連結清單中可以存儲多個元素
(integer) 2
127.0.0.1:6379> lpush list1 "emmmm..."
(integer) 3
127.0.0.1:6379> lrange list1 0 -1  # lrange可以顯示連結清單的值域,0表示一個元素,-1表示最後一個元素,結合起來就是第一個到最後一個的範圍,是以通過這兩個下标或者說索引,就可以顯示對外連結表中的全部資料
1) "emmmm..."  # 因為有堆棧的先進後出概念,是以"hello world"會在排在最後面顯示
2) "data"
3) "hello world"
127.0.0.1:6379> lrange list1 0 2  # 因為下标是從0開始,而連結清單中的元素隻有三個,是以0-2這個範圍就可以顯示對外連結表中的全部資料
1) "emmmm..."
2) "data"
3) "hello world"
127.0.0.1:6379> lrange list1 0 1  # 同理0-1就隻能顯示兩個元素
1) "emmmm..."
2) "data"
127.0.0.1:6379> lpop list1    # lpop是拿對外連結表中的元素,注意是拿出,拿出之後連結清單中就不會有這個元素了
"emmmm..."
127.0.0.1:6379> lrange list1 0 -1  # 元素被拿出後,就不會再存儲在連結清單中
1) "data"
2) "hello world"
127.0.0.1:6379>           

3.set類型:

set是集合,和我們數學中的集合概念相似,對集合的操作有添加删除元素,有對多個集合求交并差等操作。操作中key了解為集合的名字。比如在微網誌應用中,可以将一個使用者所有的關注人存在一個集合中,将其所有粉絲存在一個集合。因為 Redis 非常人性化的為集合提供了求交集、并集、差集等操作,那麼就可以非常友善的實作如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的指令選擇将結果傳回給用戶端或者是存集到一個新的集合中。

set類型使用示例:

127.0.0.1:6379> sadd set1 a  # 添加一個集合,集合的名稱是set1,a是該集合的元素
(integer) 1
127.0.0.1:6379> sadd set1 b  # 添加一個元素b到set1集合中,注意是添加,不會覆寫原有的元素
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set1 d e f g h  # 可以一次添加多個元素
(integer) 5
127.0.0.1:6379> SMEMBERS set1  # 顯示set1裡的全部元素
1) "f"
2) "c"
3) "h"
4) "d"
5) "b"
6) "g"
7) "e"
8) "a"
127.0.0.1:6379>           

以上介紹set時,提到了該類型與數學中的集合概念類似,也可以求交集、差集、并集等。

下面示例示範如何求并集,求并集就是去掉兩個集合中相同的元素,簡單來說就是去重:

127.0.0.1:6379> sadd set2 a b c 1 2 3  # 添加一個集合,該集合中有與set1集合相同的元素
(integer) 6
127.0.0.1:6379> SUNION set1 set2  # 使用SUNION指令求兩個集合中的并集
 1) "a"
 2) "1"
 3) "2"
 4) "h"
 5) "3"
 6) "f"
 7) "c"
 8) "d"
 9) "b"
10) "g"
11) "e"
127.0.0.1:6379>           

求交集示例:

求交集就是把兩個集合中相同的元素列印出來

127.0.0.1:6379> SINTER set1 set2  # 使用SINTER指令求兩個集合中的交集
1) "c"
2) "a"
3) "b"
127.0.0.1:6379>           

求差集示例:

求差集就是列印集合A中有的元素,而集合B中沒有的元素

127.0.0.1:6379> SDIFF set1 set2
1) "f"
2) "g"
3) "d"
4) "h"
5) "e"
127.0.0.1:6379>           

删除元素示例:

127.0.0.1:6379> SREM set1 a  # 删除set集合中的元素a
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "f"
2) "c"
3) "h"
4) "d"
5) "b"
6) "g"
7) "e"
127.0.0.1:6379> SREM set1 b c d e  # 可以删除多個元素
(integer) 4
127.0.0.1:6379> SMEMBERS set1
1) "f"
2) "h"
3) "g"
127.0.0.1:6379>           

4.sort set類型:

sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素能夠按 score 進行有序排列,比如一個存儲全班同學成績的 Sorted Sets,其集合 value 可以是同學的學号,而 score 就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序

sorted set類型使用示例:

127.0.0.1:6379> zadd set3 12 "twelve" # 添加一個名稱為set3的一個有序集合,名稱後面跟的是權重參數score,"twelve"則是元素
(integer) 1
127.0.0.1:6379> zadd set3 1 "one"
(integer) 1
127.0.0.1:6379> zadd set3 5 "five five2"
(integer) 1
127.0.0.1:6379> ZRANGE set3 0 -1  # 可以看到列印出來的結果有按照權重參數排序
1) "one"
2) "five five2"
3) "twelve"
127.0.0.1:6379> ZREVRANGE set3 0 -1  # ZREVRANGE 指令可以進行倒序排序
1) "twelve"
2) "five five2"
3) "one"
127.0.0.1:6379>           

5.hash類型:

在 Memcached 中,我們會經常将一些結構化的資訊打包成 hashmap,這是一種鍵/值對結構的集合,在用戶端序列化後存儲為一個字元串的值(一般是 JSON 格式),比如使用者的昵稱、年齡、性别、積分等。

hash類型使用示例:

127.0.0.1:6379> HSET hash1 name zero  # 添加一個名稱為hash1的hash集合,name是鍵,zero是值
(integer) 1
127.0.0.1:6379> HSET hash1 age 30
(integer) 1
127.0.0.1:6379> HSET hash1 job it
(integer) 1
127.0.0.1:6379> HGET hash1 name  # 按鍵來拿值
"zero"
127.0.0.1:6379> HGET hash1 age
"30"
127.0.0.1:6379> HGET hash1 job
"it"
127.0.0.1:6379> HGETALL hash1  # 列印集合中所有的元素,奇數行是key,偶數行是value
1) "name"
2) "zero"
3) "age"
4) "30"
5) "job"
6) "it"
127.0.0.1:6379>           

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/2056737,如需轉載請自行聯系原作者