Redis是一個開源,高級的鍵值存儲和一個適用的解決方案,用於構建高性能,可擴展的Web應用程序。php
Redis屬於非關係型數據庫和Memcached相似,redis也是一個key-value型存儲系統。但redis支持的存儲value類型相對更多,包括string(字符串)、list(列表)、set(集合)和zset(有序集合)等。這些數據類型都支持push/pop、add/remove及取交集、並集和差集及更豐富的操做,並且這些操做都是原子性的。爲了保證效率,redis的數據都是緩存在內存中。區別是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在基礎上實現了master-slave(主從)同步。
Redis官方網網站是:http://www.redis.io/ ,以下:css
redis是一個高性能的key-value數據庫。redis的出現、很大程度補償了memcached這類key/value存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。它提供了Python、Ruby、Erlang、PHP客戶端,使用方便。html
關於Redis以往版本中存在的問題官方已經作出解釋
https://redis.io/topics/problemsmysql
redis特色:redis
- 1)支持內存緩存,這個功能至關於memcached
- 2)支持持久化存儲,這個功能至關於memcachedb,ttserver
- 3)數據庫類型更豐富。比其餘key-value庫功能更強
- 4)支持主從集羣、分佈式
- 5)支持隊列等特殊功能
應用:緩存從存取memcached更改存取redis
1.存儲方式:
memecache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小, Redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化(筆者注:有RDB快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就頗有可能服務器頻繁滿載作dump)算法2.數據支持類型:
redis在數據支持上要比memecache多的多。sql3.使用底層模型不一樣
新版本的redis直接本身構建了VM 機制,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。docker4.運行環境不一樣:
redis目前官方只支持Linux 上去行,從而省去了對於其它系統的支持,這樣的話能夠更好的把精力用於本系統環境上的優化,雖而後來微軟有一個小組爲其寫了補丁。可是沒有放到主幹上數據庫總結:對於二者的選擇仍是要看具體的應用場景,若是須要緩存的數據只是key-value這樣簡單的結構時,我在項目裏仍是採用memcache,它也足夠的穩定可靠。若是涉及到存儲,排序等一系列複雜的操做時,毫無疑問選擇redis。vim
redis最佳使用場景是所有數據in-memory redis更多場景最爲memcached的替代品來使用 須要除key/value以外的更多數據類型支持時,使用redis更合適 當存儲的數據不能被剔除時,使用redis更合適
目前Redis支持的鍵值數據類型以下:
String 字符串類型 Hash散列類型 List列表類型 Set集合類型 Zset有序集合類型
[root@luoahong-1 home]# wget –q http://download.redis.io/releases/redis-3.2.8.tar.gz [root@luoahong-1 home]# tar xf redis-3.2.8.tar.gz [root@luoahong-1 home]# cd redis-3.2.8 [root@luoahong-1 redis-3.2.8]# make [root@luoahong-1 redis-3.2.8]# make PREFIX=/usr/local/redis install
成功的標誌:
[root@luoahong-1 ~]# tree /usr/local/redis/bin/ /usr/local/redis/bin/ ├── redis-benchmark #redis性能讀寫測試工具 ├── redis-check-aof #對更新日誌appenonly.aof檢查,相似於mysql binlog ├── redis-check-rdb #用於本地數據庫rdb文件的檢查 ├── redis-cli #redis命令行客戶端操做工具 ├── redis-sentinel -> redis-server └── redis-server #redis服務器daemon啓動程序
3. 配置 redis 爲系統服務
# mkdir -pv /usr/local/redis/{conf,db,log} mkdir: created directory ‘/usr/local/redis/conf’ mkdir: created directory ‘/usr/local/redis/db’ mkdir: created directory ‘/usr/local/redis/log’ # cp -a utils/redis_init_script /etc/init.d/redis # cp -a redis.conf /usr/local/redis/conf/6379.conf
編輯redis啓動腳本
# vim /etc/init.d/redis #!/bin/sh #chkconfig: 2345 80 90 # 添加該行是爲了設置成服務 # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. # chkconfig --add redis # systemctl status redis redis.service Loaded: loaded (/etc/rc.d/init.d/redis) Active: inactive (dead) EXEC=/usr/local/bin/redis-server # 修改成:EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli # 修改成:CLIEXEC=/usr/local/redis/bin/redis-cli CONF="/etc/redis/${REDISPORT}.conf" # 修改成:CONF="/usr/local/redis/conf/${REDISPORT}.conf"
修改 redis 主配置文件
# vim /usr/local/redis/conf/6379.conf daemonize no # 修改成 daemonize yes 設置redis服務後臺啓動 logfile "" # 修改成 logfile "/usr/local/redis/log/redis.log" 設置redis日誌文件 dir ./ # 修改成 dir /usr/local/redis/db/ 設置 rdb 文件存儲目錄
配置環境變量
[root@luoahong-1 ~]# echo "export PATH=/usr/local/redis/bin:$PATH" >>/etc/profile [root@luoahong-1 ~]# . /etc/profile or source /etc/profile
# systemctl daemon-reload # systemctl start redis # systemctl status redis redis.service Loaded: loaded (/etc/rc.d/init.d/redis) Active: active (running) since Wed 2017-08-30 15:04:09 CST; 9s ago CGroup: /system.slice/redis.service └─5199 /usr/local/redis/bin/redis-server 127.0.0.1:6379 Aug 30 15:04:09 localhost.localdomain systemd[1]: Starting redis.service... Aug 30 15:04:09 localhost.localdomain redis[5197]: Starting Redis server... Aug 30 15:04:09 localhost.localdomain systemd[1]: Started redis.service. Aug 30 15:04:16 localhost.localdomain systemd[1]: Started redis.service.
安裝錯誤:
說明:提示說關於分配器allocator, 若是有MALLOC 這個 環境變量, 會有用這個環境變量的 去創建Redis。
並且libc 並非默認的 分配器, 默認的是 jemalloc, 由於 jemalloc 被證實 有更少的 fragmentation problems 比libc
可是若是你又沒有jemalloc 而只有 libc 固然 make 出錯。 因此加這麼一個參數。
解決辦法
make MALLOC=libc
[root@luoahong-1 ~]# redis-server &
注:這個是根據環境變量的配置文件進行啓動,redis須要啓動在後臺
[root@luoahong-1 ~]# redis-server --port 6380 & #這個須要咱們的環境變量下面的conf文件放一個6380的配置文件。只須要修改一下端口就能夠啓動
[root@luoahong-1 ~]# redis-server /usr/local/redis/conf/6389.conf &
經過啓動參數傳遞同名的配置選項會覆蓋文件中相應的參數
[root@luoahong-1 ~]# redis-server /usr/local/redis/conf/6389.conf --loglevel warning &
啓動:
[root@luoahong-1 ~]# mkdir /usr/local/redis/conf #建立配置文件目錄 [root@luoahong-1 ~]# cp -a redis-3.2.8/redis.conf /usr/local/redis/conf/ #拷貝配置文件 [root@luoahong-1 ~]# redis-server /usr/local/redis/conf/redis.conf & #啓動 [1] 4501 [root@luoahong-1 ~]# 4501:M 28 Apr 06:47:05.568 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.8 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 4501 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 4501:M 28 Apr 06:47:05.570 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 4501:M 28 Apr 06:47:05.570 # Server started, Redis version 3.2.8 4501:M 28 Apr 06:47:05.570 # 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. 4501:M 28 Apr 06:47:05.570 # 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_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 4501:M 28 Apr 06:47:05.571 * The server is now ready to accept connections on port 6379
關閉redis
1
2
3
4
5
6
7
|
咱們可使用自帶腳本,或者使用
ps
–ef|
grep
redis 進行
kill
[root@luoahong-1 ~]
# redis-cli shutdown
4867:M 05 Jul 14:33:00.284
# User requested shutdown...
4867:M 05 Jul 14:33:00.284 * Saving the final RDB snapshot before exiting.
4867:M 05 Jul 14:33:00.285 * DB saved on disk
4867:M 05 Jul 14:33:00.286
# Redis is now ready to exit, bye bye...
[1]+ Done redis-server
|
解決啓動報warning信息:
可選值:0、一、2
0 內核將檢查是否有足夠的可用內存供應用進程使用;若是有足夠的可用內存,內存申請容許;不然,內存申請失敗,並把錯誤返回給應用進程。 1 內核容許分配全部的物理內存,而無論當前的內存狀態如何。 2 內核容許分配超過全部物理內存和交換空間總和的內存
三種設置方法:
1
2
3
|
編輯
/etc/sysctl
.conf ,改vm.overcommit_memory=1,而後sysctl -p 生效
sysctl vm.overcommit_memory=1
echo
1 >
/proc/sys/vm/overcommit_memory
|
############### 一、通用 ############### <br>daemonize yes #是否之後臺進程運行 pidfile /var/run/redis/redis-server.pid #pid文件位置 port 6379#監聽端口 bind 127.0.0.1 #綁定地址,如外網須要鏈接,設置0.0.0.0 空格分隔 timeout 300 #鏈接超時時間,單位秒 loglevel notice #日誌級別,分別有: # debug :適用於開發和測試 # verbose :更詳細信息 # notice :適用於生產環境 # warning :只記錄警告或錯誤信息 logfile /var/log/redis/redis-server.log #日誌文件位置 syslog-enabled no #是否將日誌輸出到系統日誌 databases 16#設置數據庫數量,默認數據庫爲0<br> ############### 二、快照方式 ###############<br> save 900 1 #在900s(15m)以後,至少有1個key發生變化,則快照 save 300 10 #在300s(5m)以後,至少有10個key發生變化,則快照 save 60 10000 #在60s(1m)以後,至少有1000個key發生變化,則快照 rdbcompression yes #dump時是否壓縮數據 dir /var/lib/redis #數據庫(dump.rdb)文件存放目錄<br> ############### 三、主從複製 ###############<br> slaveof <masterip> <masterport> #主從複製使用,用於本機redis做爲slave去鏈接主redis masterauth <master-password> #當master設置密碼認證,slave用此選項指定master認證密碼 slave-serve-stale-data yes #當slave與master之間的鏈接斷開或slave正在與master進行數據同步時,若是有slave請求,當設置爲yes時,slave仍然響應請求,此時可能有問題,若是設置no時,slave會返回"SYNC with master in progress"錯誤信息。但INFO和SLAVEOF命令除外。 <br>############### 四、安全 ###############<br> requirepass foobared #配置redis鏈接認證密碼<br> ############### 五、 限制 ###############<br> maxclients 128#設置最大鏈接數,0爲不限制 maxmemory <bytes>#內存清理策略,若是達到此值,將採起如下動做: # volatile-lru :默認策略,只對設置過時時間的key進行LRU算法刪除 # allkeys-lru :刪除不常用的key # volatile-random :隨機刪除即將過時的key # allkeys-random :隨機刪除一個key # volatile-ttl :刪除即將過時的key # noeviction :不過時,寫操做返回報錯 maxmemory-policy volatile-lru#若是達到maxmemory值,採用此策略 maxmemory-samples 3 #默認隨機選擇3個key,從中淘汰最不常常用的<br> ############### 六、附加模式 ###############<br> appendonly no #AOF持久化,是否記錄更新操做日誌,默認redis是異步(快照)把數據寫入本地磁盤 appendfilename appendonly.aof #指定更新日誌文件名 # AOF持久化三種同步策略: # appendfsync always #每次有數據發生變化時都會寫入appendonly.aof # appendfsync everysec #默認方式,每秒同步一次到appendonly.aof # appendfsync no #不一樣步,數據不會持久化 no-appendfsync-on-rewrite no #當AOF日誌文件即將增加到指定百分比時,redis經過調用BGREWRITEAOF是否自動重寫AOF日誌文件。<br> ############### 七、虛擬內存 ###############<br> vm-enabled no #是否啓用虛擬內存機制,虛擬內存機將數據分頁存放,把不多訪問的頁放到swap上,內存佔用多,最好關閉虛擬內存 vm-swap-file /var/lib/redis/redis.swap #虛擬內存文件位置 vm-max-memory 0 #redis使用的最大內存上限,保護redis不會因過多使用物理內存影響性能 vm-page-size 32 #每一個頁面的大小爲32字節 vm-pages 134217728 #設置swap文件中頁面數量 vm-max-threads 4 #訪問swap文件的線程數<br> ############### 八、高級配置 ############### hash-max-zipmap-entries 512 #哈希表中元素(條目)總個數不超過設定數量時,採用線性緊湊格式存儲來節省空間 hash-max-zipmap-value 64 #哈希表中每一個value的長度不超過多少字節時,採用線性緊湊格式存儲來節省空間 list-max-ziplist-entries 512 #list數據類型多少節點如下會採用去指針的緊湊存儲格式 list-max-ziplist-value 64 #list數據類型節點值大小小於多少字節會採用緊湊存儲格式 set-max-intset-entries 512 #set數據類型內部數據若是所有是數值型,且包含多少節點如下會採用緊湊格式存儲 activerehashing yes #是否激活重置哈希
lua腳本
1
2
3
|
lua腳本的最大運行時間是須要被嚴格限制的,要注意單位是毫秒:
lua-
time
-limit 5000
若是此值設置爲0或負數,則既不會有報錯也不會有時間限制。
|
慢日誌
1
2
3
4
5
6
7
8
|
redis慢日誌是指一個系統進行日誌查詢超過了指定的時長。這個時長不包括IO操做,好比與客戶端的交互、發送響應內容等,而僅包括實際執行查詢命令的時間。
針對慢日誌,你能夠設置兩個參數,一個是執行時長,單位是微秒,另外一個是慢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌隊列中被移除。
單位是微秒,即1000000表示一秒。負數則會禁用慢日誌功能,而0則表示強制記錄每個命令。
slowlog-log-slower-than 10000
慢日誌最大長度,能夠隨便填寫數值,沒有上限,但要注意它會消耗內存。你可使用SLOWLOG RESET來重設這個值。
slowlog-max-len 128
|
默認狀況,Redis不是在後臺運行,咱們須要把redis放在後臺運行
1
2
|
vim
/usr/local/redis/etc/redis
.conf
將daemonize的值改成
yes
|
遠程鏈接redis
1
2
3
4
5
6
7
8
9
|
redis-cli –h 127.0.0.1 –p 6379
-h ip地址
-p 端口
鏈接不一樣端口
[root@luoahong-1 ~]
# redis-cli -p 6380
測試客戶端與redis鏈接是否正常
127.0.0.1:6379>
ping
PONG
#redis設置密碼修改配置文件,equirepass foobared去掉註釋,foobared改成本身的密碼。而後重啓。
|
在redis中,使用CONFIG命令獲取.
獲取配置文件內容:
1
2
3
4
|
127.0.0.1:6379> CONFIG GET port
1)
"port"
2)
"6379"
127.0.0.1:6379> CONFIG GET *
#查看redis全部的配置內容
|
驗證密碼是否正確
1
2
3
|
AUTH password
127.0.0.1:6379> AUTH 123456
OK
|
打印字符串
1
2
3
|
ECHO message
127.0.0.1:6379> ECHO 1
"1"
|
關閉當前鏈接
1
|
QUIT
|
切換到指定的數據庫
1
|
SELECT index
|
命令返回值
1.狀態回覆
1
2
3
|
redis 發送
set
命令設置某個鍵的值時,Redis會回覆狀態OK表示設置成功,另外
ping
命令的回覆PONG也是狀態回覆。狀態回覆直接顯示狀態信息
127.0.0.1:6379> PING
PONG
|
2.錯誤回覆
當出現命令不存在或命令格式有錯誤等狀況時Redis會返回錯誤回覆(error reply)錯誤回覆以(error)開頭,並在後面跟上錯誤信息。
1
2
|
127.0.0.1:6379> luoahong
(error) ERR unknown
command
'luoahong'
|
3.整數回覆
Redis雖然沒有整數類型,可是卻提供了一些用於整數操做的命令,如遞增鍵值的INCR命令會以整數形式返回遞增後的鍵值。整數回覆(integer reply)以(integer)開頭,並在後面跟上整數數據
1
2
|
127.0.0.1:6379> INCR foo
(integer) 1
|
4.字符串回覆
字符串回覆(bulk reply)是最多見的一種回覆類型,當請求一個字符串類型鍵值或一個其餘類型鍵中的某個元素時就會獲得一個字符串回覆。字符串回覆以雙引號包裹:
1
2
|
127.0.0.1:6379> GET foo
"1"
|
特殊狀況是當請求的鍵值不存在時會獲得一個空結果,顯示爲(nil) 127.0.0.1:6379> GET luoahong (nil) 127.0.0.1:6379> GET www.luoahong.com (nil)
5.多行字符串回覆
多行字符串回覆(multi-bulk reply)一樣很常見,如當請求一個非字符串類型鍵的元素列表時就會收到多行字符串回覆。多行字符串回覆中的每行字符串都以一個序號開頭
1
2
|
127.0.0.1:6379> KEYS *
1) "foo
|
提示:KEYS命令的做用是獲取數據庫中符合指定規則的鍵名
原文連接