redis php操作日志,php-redis笔记
php-redis筆記
介紹
REmote DIctionary Server(Redis) 是一個(gè)由Salvatore Sanfilippo寫的key-value存儲(chǔ)系統(tǒng)。
Redis是一個(gè)開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹?value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
Redis 簡介
Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
* Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
* Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
* Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
Redis 優(yōu)勢
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value存儲(chǔ)有什么不同?
* Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)他們的原子性操作,這是一個(gè)不同于其他數(shù)據(jù)庫的進(jìn)化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對(duì)程序員透明,無需進(jìn)行額外的抽象。
* Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個(gè)優(yōu)點(diǎn)是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。同時(shí),在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問。
Table of contents
數(shù)據(jù)結(jié)構(gòu)
String: 字符串]
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
Redis安裝
1. 下載并解壓
首先從Redis官網(wǎng)下載Redis并解壓,樓主使用的版本是4.0.2。依次執(zhí)行如下命令:
cd /usr/local/
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
tar -zxvf redis-4.0.2.tar.gz
如果沒有安裝gcc依賴包,則安裝對(duì)應(yīng)依賴包
yum install -y gcc-c++ tcl
2. 編譯并安裝
下載并解壓完畢后,則對(duì)源碼包進(jìn)行編譯安裝,樓主的Redis安裝路徑為/usr/local/redis,同學(xué)們可以自行修改語句:make install PREFIX=你想要安裝的路徑
cd /usr/local/redis-4.0.2/
make install PREFIX=/usr/local/redis
復(fù)制Redis相關(guān)命令到/usr/sbin目錄下,這樣就可以直接執(zhí)行這些命令,不用寫全路徑
cd /usr/local/redis/bin/
sudo cp redis-cli redis-server redis-sentinel /usr/sbin/
3. 建立Redis配置文件
安裝完成之后將 Redis 配置文件拷貝到系統(tǒng)配置目錄/etc/下,redis.conf 是 Redis 的配置文件,redis.conf 在 Redis 源碼目錄,port默認(rèn) 6379。
cp /usr/local/redis-4.0.2/redis.conf /etc/
Redis配置文件主要參數(shù)解析參考
daemonize no #redis進(jìn)程是否以守護(hù)進(jìn)程的方式運(yùn)行,yes為是,no為否(不以守護(hù)進(jìn)程的方式運(yùn)行會(huì)占用一個(gè)終端)
pidfile /var/run/redis.pid #指定redis進(jìn)程的PID文件存放位置
port 6379 #redis進(jìn)程的端口號(hào)
bind 127.0.0.1 #綁定的主機(jī)地址
timeout 300 #客戶端閑置多長時(shí)間后關(guān)閉連接,默認(rèn)此參數(shù)為0即關(guān)閉此功能
loglevel verbose #redis日志級(jí)別,可用的級(jí)別有debug.verbose.notice.warning
logfile stdout #log文件輸出位置,如果進(jìn)程以守護(hù)進(jìn)程的方式運(yùn)行,此處又將輸出文件設(shè)置為stdout的話,就會(huì)將日志信息輸出到/dev/null里面去了
databases 16 #設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)為0可以使用select 命令在連接上指定數(shù)據(jù)庫id
save #指定在多少時(shí)間內(nèi)刷新次數(shù)達(dá)到多少的時(shí)候會(huì)將數(shù)據(jù)同步到數(shù)據(jù)文件;
rdbcompression yes #指定存儲(chǔ)至本地?cái)?shù)據(jù)庫時(shí)是否壓縮文件,默認(rèn)為yes即啟用存儲(chǔ);
dbfilename dump.db #指定本地?cái)?shù)據(jù)庫文件名
dir ./ #指定本地?cái)?shù)據(jù)問就按存放位置;
slaveof #指定當(dāng)本機(jī)為slave服務(wù)時(shí),設(shè)置master服務(wù)的IP地址及端口,在redis啟動(dòng)的時(shí)候他會(huì)自動(dòng)跟master進(jìn)行數(shù)據(jù)同步
masterauth #當(dāng)master設(shè)置了密碼保護(hù)時(shí),slave服務(wù)連接master的密碼;
requirepass footbared #設(shè)置redis連接密碼,如果配置了連接密碼,客戶端在連接redis是需要通過AUTH命令提供密碼,默認(rèn)關(guān)閉
maxclients 128 #設(shè)置同一時(shí)間最大客戶連接數(shù),默認(rèn)無限制;redis可以同時(shí)連接的客戶端數(shù)為redis程序可以打開的最大文件描述符,如果設(shè)置 maxclients 0,表示不作限制。當(dāng)客戶端連接數(shù)到達(dá)限制時(shí),Redis會(huì)關(guān)閉新的連接并向客戶端返回max number of clients reached錯(cuò)誤信息
maxmemory #指定Redis最大內(nèi)存限制,Redis在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,Redis會(huì)先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理 后,仍然到達(dá)最大內(nèi)存設(shè)置,將無法再進(jìn)行寫入操作,但仍然可以進(jìn)行讀取操作。Redis新的vm機(jī)制,會(huì)把Key存放內(nèi)存,Value會(huì)存放在swap區(qū)
appendonly no #指定是否在每次更新操作后進(jìn)行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)?redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)為no
appendfilename appendonly.aof #指定跟新日志文件名默認(rèn)為appendonly.aof
appendfsync everysec #指定更新日志的條件,有三個(gè)可選參數(shù)no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(快),always:表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全), everysec:表示每秒同步一次(折衷,默認(rèn)值);
3.1 設(shè)置后端啟動(dòng):
由于Redis默認(rèn)是前端啟動(dòng),必須保持在當(dāng)前的窗口中,如果使用ctrl + c退出,那么Redis也就退出,不建議使用。
vi /etc/redis.conf
修改Redis配置文件把舊值daemonize no 改為 新值daemonize yes
3.2 設(shè)置訪問:
Redis默認(rèn)只允許本機(jī)訪問,可是有時(shí)候我們也需要 Redis 被遠(yuǎn)程訪問。
vi /etc/redis.conf
找到 bind 那行配置,默認(rèn)是: # bind 127.0.0.1
去掉#注釋并改為: bind 0.0.0.0 此設(shè)置會(huì)變成允許所有遠(yuǎn)程訪問。如果想指定限制訪問,可設(shè)置對(duì)應(yīng)的IP。
3.3 配置Redis日志記錄:
找到logfile那行配置,默認(rèn)是:logfile "",改為logfile /var/log/redis_6379.log
3.4 設(shè)置 Redis 請(qǐng)求密碼:
vi /etc/redis.conf
找到默認(rèn)是被注釋的這一行:# requirepass foobared
去掉注釋,把 foobared 改為你想要設(shè)置的密碼,比如我打算設(shè)置為:123456,所以我改為:requirepass "123456"
修改之后重啟下服務(wù)
有了密碼之后,進(jìn)入客戶端,就得這樣訪問:redis-cli -h 127.0.0.1 -p 6379 -a 123456
####4. Redis常用操作
4.1 啟動(dòng)
/usr/local/redis/bin/redis-server /etc/redis.conf
4.2 關(guān)閉
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
4.3 查看是否啟動(dòng)
ps -ef | grep redis
4.4 進(jìn)入客戶端
redis-cli
4.5 關(guān)閉客戶端
redis-cli shutdown
4.6 設(shè)置開機(jī)自動(dòng)啟動(dòng)配置
echo "/usr/local/redis/bin/redis-server /etc/redis.conf" >> /etc/rc.local
4.7 開放防火墻端口
添加規(guī)則:iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
保存規(guī)則:service iptables save
重啟 iptables:service iptables restart
5. 將Redis注冊為系統(tǒng)服務(wù)
在/etc/init.d目錄下添加Redis服務(wù)的啟動(dòng),暫停和重啟腳本:
vi /etc/init.d/redis
腳本內(nèi)容如下:
#!/bin/sh
#
# redis - this script starts and stops the redis-server daemon
#
# chkconfig: - 85 15
# description: Redis is a persistent key-value database
# processname: redis-server
# config: /usr/local/redis/bin/redis-server
# config: /etc/redis.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
redis="/usr/local/redis/bin/redis-server"
prog=$(basename $redis)
REDIS_CONF_FILE="/etc/redis.conf"
[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis
lockfile=/var/lock/subsys/redis
start() {
[ -x $redis ] || exit 5
[ -f $REDIS_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $redis $REDIS_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
stop
start
}
reload() {
echo -n $"Reloading $prog: "
killproc $redis -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart| reload|orce-reload}"
exit 2
esac
賦予腳本權(quán)限
chmod 755 /etc/init.d/redis
啟動(dòng)、停止和重啟:
service redis start
service redis stop
service redis restart
Redis主從
1. redis-server說明
172.16.2.185:6379 主
172.16.2.181:6379 從
2. Redis主從架構(gòu)配置
編輯從機(jī)的 Redis 配置文件,找到 210 行(大概),默認(rèn)這一行應(yīng)該是注釋的:
slaveof
我們需要去掉該注釋,并且填寫我們自己的主機(jī)的 IP 和 端口,比如:slaveof 172.16.2.185 6379,如果主機(jī)設(shè)置了密碼,還需要找到masterauth 這一行,去掉注釋,改為masterauth 主機(jī)密碼。
配置完成后重啟從機(jī)Redis 服務(wù)
重啟完之后,進(jìn)入主機(jī)的 redis-cli 狀態(tài)下redis-cli -h 127.0.0.1 -p 6379 -a 123456,輸入:INFO replication
可以查詢到當(dāng)前主機(jī)的 Redis處于什么角色,有哪些從機(jī)已經(jīng)連上主機(jī)。
主機(jī)信息172.16.2.185
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.2.181,port=6379,state=online,offset=28,lag=1
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
從機(jī)信息172.16.2.181
# Replication
role:slave
master_host:172.16.2.185
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:210
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
此時(shí)已經(jīng)完成了主從配置,我們可以測試下:
我們進(jìn)入主機(jī)的 redis-cli 狀態(tài),然后 set 某個(gè)值,比如:set myblog YouMeek.com
我們切換進(jìn)入從機(jī)的 redis-cli 的狀態(tài)下,獲取剛剛設(shè)置的值看是否存在:get myblog,此時(shí),我們可以發(fā)現(xiàn)是可以獲取到值的。
3. Redis主從架構(gòu)總結(jié)
需要注意的是:從庫不具備寫入數(shù)據(jù)能力,不然會(huì)報(bào)錯(cuò)。 從庫只有只讀能力。
主從架構(gòu)的優(yōu)點(diǎn):除了減少主庫連接的壓力,還有可以關(guān)掉主庫的持久化功能,把持久化的功能交給從庫進(jìn)行處理。
第一個(gè)從庫配置的信息是連上主庫,后面的第二個(gè)從庫配置的連接信息是連上第一個(gè)從庫, 假如還有第三個(gè)從庫的話,我們可以把第三個(gè)從庫的配置信息連上第二個(gè)從庫上,以此類推。
PHP使用Redis
連接到 redis 服務(wù)
//連接本地的 Redis 服務(wù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//查看服務(wù)是否運(yùn)行
echo "Server is running: " . $redis->ping();
?>
執(zhí)行腳本,輸出結(jié)果為:
Connection to server sucessfully
Server is running: PONG
Redis PHP String(字符串) 實(shí)例
//連接本地的 Redis 服務(wù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//設(shè)置 redis 字符串?dāng)?shù)據(jù)
$redis->set("tutorial-name", "Redis tutorial");
// 獲取存儲(chǔ)的數(shù)據(jù)并輸出
echo "Stored string in redis:: " . $redis->get("tutorial-name");
?>
執(zhí)行腳本,輸出結(jié)果為:
Connection to server sucessfully
Stored string in redis:: Redis tutorial
Redis PHP List(列表) 實(shí)例
//連接本地的 Redis 服務(wù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//存儲(chǔ)數(shù)據(jù)到列表中 將一個(gè)或多個(gè)值插入到列表頭部
$redis->lpush("tutorial-list", "Redis");
$redis->lpush("tutorial-list", "Mongodb");
$redis->lpush("tutorial-list", "Mysql");
// 獲取存儲(chǔ)的數(shù)據(jù)并輸出
//Redis Lrange 返回列表中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量 START 和 END 指定。
//其中 0 表示列表的第一個(gè)元素, 1 表示列表的第二個(gè)元素,以此類推。
//你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個(gè)元素, -2 表示列表的倒數(shù)第二個(gè)元素,以此類推。
$arList = $redis->lrange("tutorial-list", 0 ,5);
echo "Stored string in redis";
print_r($arList);
?>
執(zhí)行腳本,輸出結(jié)果為:
Connection to server sucessfully
Stored string in redis
Mysql
Mongodb
Redis
Redis PHP Keys 實(shí)例
//連接本地的 Redis 服務(wù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
// 獲取數(shù)據(jù)并輸出
$arList = $redis->keys("*");
echo "Stored keys in redis:: ";
print_r($arList);
?>
執(zhí)行腳本,輸出結(jié)果為:
Connection to server sucessfully
Stored string in redis::
tutorial-name
tutorial-list
總結(jié)
以上是生活随笔為你收集整理的redis php操作日志,php-redis笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通策医疗股票股价 做什么能否长期持有
- 下一篇: 海关副处级?