Redis数据存储解决方案
http://www.tuicool.com/articles/77nUZn
1、背景
1.1 Redis簡(jiǎn)介
官方網(wǎng)站:?http://redis.io/?,Redis是REmote DIctionary Server的縮寫。
Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。從2010年3月15日起,Redis的開(kāi)發(fā)工作由VMware主持。它跟 memcached 類似,不過(guò)數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類型很豐富。它在保持鍵值數(shù)據(jù)庫(kù)簡(jiǎn)單快捷特點(diǎn)的同時(shí),又吸收了部分關(guān)系數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)。從而使它的位置處于關(guān)系數(shù)據(jù)庫(kù)和鍵值數(shù)據(jù)庫(kù)之間。Redis不僅能保存Strings類型的數(shù)據(jù),還能保存Lists類型(有序)和Sets類型(無(wú)序)的數(shù)據(jù),而且還能完成排序(SORT)等高級(jí)功能,在實(shí)現(xiàn)INCR,SETNX等功能的時(shí)候,保證了其操作的原子性,除此以外,還支持主從復(fù)制等功能。Redis可以被看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器。
Redis的所有數(shù)據(jù)都是保存在內(nèi)存中,然后不定期的通過(guò)異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數(shù)據(jù)變化都寫入到一個(gè)append only file(aof)里面(這稱為“全持久化模式”)。
1.2 瓶頸
當(dāng)前卡布西游項(xiàng)目,數(shù)據(jù)存儲(chǔ)采用MySQL,主游戲庫(kù)共分為20個(gè)庫(kù),分布在5臺(tái)機(jī)器上,每個(gè)庫(kù)數(shù)據(jù)量約為10G,各機(jī)器均采用RAID5加速磁盤訪問(wèn);當(dāng)同時(shí)在線人數(shù)達(dá)到5W時(shí),DB磁盤IO壓力很大,導(dǎo)致游戲卡,在線人數(shù)再上不去了。而Redis數(shù)據(jù)讀寫都是直接操作內(nèi)存,可有效解決這一瓶頸。
1.3 解決方案概述
將部分?jǐn)?shù)據(jù)壓縮導(dǎo)入到redis后,總數(shù)據(jù)量約15G(轉(zhuǎn)換成redis數(shù)據(jù)類型數(shù)據(jù)量),一主一從模型,共兩組。一臺(tái)機(jī)器內(nèi)存32G,開(kāi)20個(gè)實(shí)例,共40個(gè)實(shí)例;預(yù)估每個(gè)實(shí)例最多存儲(chǔ)2G數(shù)據(jù)(現(xiàn)在沒(méi)這么多)。多實(shí)例方便做持久化。
主庫(kù)不做AOF,也不做快照,只在每晚12點(diǎn)計(jì)劃任務(wù)做一次快照并轉(zhuǎn)移到異地。從庫(kù)開(kāi)啟AOF并1秒落地。
主庫(kù)每5分鐘插入一個(gè)時(shí)間點(diǎn)(crontab實(shí)現(xiàn)),方便從庫(kù)AOF記錄時(shí)間點(diǎn),用于定點(diǎn)還原。
2、安裝配置
2.1 硬件配置
Dell R410? 32G內(nèi)存;兩個(gè)CPU,每個(gè)CPU 4個(gè)核心;300G硬盤
2.2 安裝
a)安裝TCMalloc庫(kù)
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz ? tar zxf libunwind-0.99-alpha.tar.gz ? cd libunwind-0.99-alpha/ ? CFLAGS=-fPIC ./configure ? make CFLAGS=-fPIC ? make CFLAGS=-fPIC installb)安裝google-perftools:
wget http://google-perftools.googlecode.com/files/google-perftools-1.8.2.tar.gztar zxf google-perftools-1.7.tar.gz ? cd google-perftools-1.7/ ? ./configure ? make ? make install ? echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf ? /sbin/ldconfig?
c)安裝redis
wget http://redis.googlecode.com/files/redis-2.2.14.tar.gztar xzvf redis-2.2.14.tar.gz ? cd redis-2.2.14 ? make USE_TCMALLOC=yes?
//make之后會(huì)在 src目錄下產(chǎn)生redis-server ?redis-cli ?redis-benchmark ?redis-check-dump
將其拷貝到/usr/local/redis/bin目錄下,將配置文件redis.conf拷貝到/usr/local/redis/etc目錄
//統(tǒng)一建立目錄,方便管理
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/var
mkdir -p /data/redis-data
# mkdir -p /data/redis-data/redis60{01,02,03,04,05,06,07,08,09,10}
檢查tcmalloc是否生效
# lsof -n | grep tcmalloc
出現(xiàn)以下信息說(shuō)明生效
redis-ser 13768?? root? mem?????? REG??????? 8,5? 1616491???? 788696 /usr/local/lib/libtcmalloc.so.0.1.0
//裝完后,可能libtcmalloc沒(méi)有注冊(cè),沒(méi)有上面信息,在mysqld_safe文件里加一條:
export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
//再重啟mysql(線上操作謹(jǐn)慎!!!)(使用tmalloc,內(nèi)存分配效率更高)
2.3 配置
//當(dāng)前規(guī)劃一共開(kāi)40個(gè)實(shí)例,每臺(tái)機(jī)器20個(gè)實(shí)例,下面以實(shí)例01為例:
//配置文件名: redis6001.conf ~ redis6040.conf
daemonize yespidfile /var/run/redis6001.pidport 6001 ? timeout 300 ? loglevel debug ? logfile /usr/local/redis/var/debug6001.log ? syslog-enabled yes ? databases 16 ? rdbcompression yes ? dbfilename redis6001.rdb ? dir /data/redis-data/redis6001 ? slave-serve-stale-data yes ? requirepass My#redis appendonly no ? no-appendfsync-on-rewrite no ? vm-enabled no ? hash-max-zipmap-entries 512 ? hash-max-zipmap-value 64 ? list-max-ziplist-entries 512 ? list-max-ziplist-value 64 ? set-max-intset-entries 512 ? activerehashing yes?
3、主從同步備份及相關(guān)腳本
3.1 主從同步目的目標(biāo)
主從的主要目的:數(shù)據(jù)持久化,災(zāi)難恢復(fù),冗余。主庫(kù)不落地,減少消耗。
3.2 主從配置
從庫(kù)安裝配置同主庫(kù)一致,主庫(kù)無(wú)需任何改動(dòng)(允許從庫(kù)訪問(wèn)),從庫(kù)需增加兩個(gè)地方配置:slaveof + AOF
slaveof 192.168.3.180 6301
masterauth My#redis
appendonly yes
appendfilename appendonly01.aof
appendfsync everysec
?
//配置文件名: slave6001.conf ~ slave6040.conf
daemonize yespidfile /var/run/slave6001.pid ? port 6001 ? timeout 300 ? loglevel debug ? logfile /usr/local/redis/var/debug6001.log ? syslog-enabled yes ? databases 16 ? rdbcompression yes ? dbfilename slave6001.rdb ? dir /data/redis-data/slave6001 ? slaveof 192.168.0.139 6001 ? masterauth My#redis slave-serve-stale-data yes ? requirepass My#redis appendonly yes ? appendfilename slave6001.aof ? appendfsync everysec ? no-appendfsync-on-rewrite no ? vm-enabled no ? vm-swap-file /tmp/redis.swap ? vm-max-memory 0 ? vm-page-size 32 ? vm-pages 134217728 ? vm-max-threads 4 ? hash-max-zipmap-entries 512 ? hash-max-zipmap-value 64 ? list-max-ziplist-entries 512 ? list-max-ziplist-value 64 ? set-max-intset-entries 512 ? activerehashing yes3.3 備份
備份策略:主庫(kù)每晚12點(diǎn)串行給每個(gè)實(shí)例做一次快照(bgsave);從庫(kù)每晚12點(diǎn)串行對(duì)AOF文件打包備份(tar),打包備份后做一次AOF文件壓縮(bgrewriteaof)。每天的數(shù)據(jù)起始點(diǎn)是前一天晚上rewriteaof后的數(shù)據(jù)。
主庫(kù)每晚12點(diǎn)串行給每個(gè)實(shí)例做一次快照(bgsave)。主庫(kù)備份腳本(redis_bgsave.sh)
#!/bin/bash
#date=`date +%y%m%d_%H%M%S`
REDISPASSWORD=My#redis
for PORT in `seq 6001 6020`
do
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p $PORT -a $REDISPASSWORD bgsave
sleep 10
done
date >> /usr/local/redis/var/bgsave.log
從庫(kù)每晚12點(diǎn)串行拷貝每個(gè)實(shí)例的AOF到其他目錄并對(duì)其打包,壓縮包要有異地備份,之后再壓縮AOF(bgrewriteaof)。
從庫(kù)備份AOF并bgrewriteaof腳本(redis_backup.sh :對(duì)單個(gè)實(shí)例)
#!/bin/sh
## FD:File Dir
## RD:Runing Dir
## 第一個(gè)參數(shù)為redis實(shí)例名
if [ $# -ne 1 ]; then
echo “Usage:$0? redis_name”
exit
fi
CURDATE=`date +%Y%m%d`
CURHOUR=`date +%Y%m%d_%H`
CURTIME=`date +%Y%m%d_%H%M%S`
REDISPASSWORD=My#redis
REDISNAME=$1
PORT=`echo $REDISNAME | cut -c6-9`
LOGFILE=/data/logs/redisbak/redis_allbak_${CURDATE}.log
if [ "${REDISNAME}" = "" ]; then
echo “redis name Error!”
exit 1
else
if [ ! -d "/data/redis-data/${REDISNAME}" ]; then
echo “redis name Error!”
exit 1
fi
fi
DDIR=/data/backup/redis/$CURHOUR
mkdir -p ${DDIR}
RDIR=/data/redis-data/$REDISNAME
cd ${RDIR}
tar -zcf $DDIR/${REDISNAME}_${CURTIME}.tar.gz $REDISNAME.aof
if [ $? != 0 ]; then
echo “tar error $REDISNAME.aof” >> $LOGFILE
#exit 1
fi
sleep 5
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p $PORT -a $REDISPASSWORD bgrewriteaof
sleep 5
###? delete old backup data dir? ###
#/bin/rm -rf `date -d -7day +”%Y%m%d”`
find /data/backup/redis/ -mtime +7 | xargs rm -rf
echo “Backup $REDISNAME ok at $CURTIME !” >> $LOGFILE
從庫(kù)對(duì)所有實(shí)例備份(/data/sh/redis_allbak.sh)
#!/bin/sh
CURDATE=`date +%Y%m%d`
LOGFILE=/data/logs/redisbak/redis_allbak_${CURDATE}.log
for PORT in `seq 6001 6020`
do
/data/sh/redis_backup.sh slave${PORT} && echo “slave${PORT} ok `date +%Y%m%d_%H%M%S`” >> $LOGFILE 2>&1 || echo “slave${PORT} backup error” >> $LOGFILE 2>&1
done
?
4、操作注意事項(xiàng)
1. 若主庫(kù)掛了,不能直接開(kāi)啟主庫(kù)程序。若直接開(kāi)啟主庫(kù)程序?qū)?huì)沖掉從庫(kù)的AOF文件,這樣將導(dǎo)致只能恢復(fù)到前一天晚上12的備份。
2. 程序在跑時(shí),不能重啟網(wǎng)絡(luò)(程序是通過(guò)網(wǎng)絡(luò)接口的端口進(jìn)行讀寫的)。網(wǎng)絡(luò)中斷將導(dǎo)致中斷期間數(shù)據(jù)丟失。
3. 確定配置文件全部正確才啟動(dòng)(尤其不能有數(shù)據(jù)文件名相同),否則會(huì)沖掉原來(lái)的文件,可能造成無(wú)法恢復(fù)的損失。
?
5、災(zāi)難恢復(fù)
5.1 主庫(kù)故障,快速恢復(fù)到最近狀態(tài)
描述:主庫(kù)掛了(redis程序掛了/機(jī)器宕機(jī)了),從庫(kù)正常,恢復(fù)到主庫(kù)掛掉的時(shí)間點(diǎn):去從庫(kù)手動(dòng)做一次快照,拷貝快照到主庫(kù)相應(yīng)目錄,啟動(dòng),OK。
在從庫(kù)做一次快照,轉(zhuǎn)移快照文件到其他目錄,將快照文件目錄拷貝到主庫(kù)相應(yīng)目錄,啟動(dòng)主庫(kù),OK!
( /data/sh/redis_bgsave_cp.sh )
#!/bin/bash
REDISPASSWORD=My#redis
for PORT in `seq 6001 6020`
do
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p $PORT -a $REDISPASSWORD bgsave
sleep 5
done
sleep 15
for PORT in `seq 6001 6020`
do
SDIR=/data/redis-data/slave${PORT}/
DDIR=/data/redis_recovery/redis-data/
mkdir -p $DDIR/redis${PORT}/
cd $SDIR
cp -rf slave${PORT}.rdb $DDIR/redis${PORT}/redis${PORT}.rdb
#sleep 1
done
在主庫(kù)將原來(lái)數(shù)據(jù)目錄重命名。
從從庫(kù)拷貝快照文件到主庫(kù)。
啟動(dòng)主庫(kù)。
5.2 恢復(fù)到當(dāng)天12點(diǎn)狀態(tài)
注意備份數(shù)據(jù)(當(dāng)前狀態(tài)AOF+正常退出快照)!
停止redis。
解壓AOF(/data/sh/redis_untar.sh)
#!/bin/bash
DAY=20111102
SDIR=/data/backup/redis/20111102_00/
cd $SDIR
for PORT in `seq 6001 6020`
do
tar -zxf slave${PORT}_$DAY_*.tar.gz
sleep 2
done
切割A(yù)OF(/data/sh/redis_sed.sh)
#!/bin/bash
DDIR=/data/redis_recovery/
TAG=”TAG111101_1200″
for PORT in `seq 6001 6020`
do
SDIR=/data/backup/redis/20111102_00/
SAOF=${SDIR}/slave${PORT}.aof
line=`sed -n “/$TAG/=” $SAOF`
num=$[$line + 3]
mkdir -p ${DDIR}/slave${PORT}/
sed “${num},\$d” $SAOF > ${DDIR}/slave${PORT}/slave${PORT}.aof
done
將原來(lái)數(shù)據(jù)目錄重命名。
將切割出來(lái)的AOF目錄重命名為配置文件的數(shù)據(jù)目錄。(注釋主從同步配置項(xiàng))。
啟動(dòng)從庫(kù)。
做快照,拷貝到主庫(kù),啟動(dòng)主庫(kù)(同5.1)。
5.3 恢復(fù)到兩天或幾天前12點(diǎn)狀態(tài)
從庫(kù)每晚備份要備份AOF未bgrewriteaof之前的數(shù)據(jù),可根據(jù)當(dāng)天晚上12點(diǎn)備份,沒(méi)有bfrewriteaof之前的AOF文件來(lái)進(jìn)行恢復(fù),方法同5.2。
?
6、監(jiān)控
6.1 Nagios監(jiān)控
# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6301 -a My#redis info
used_memory_human:1.49G
master_link_status:down????????????????????????? up/down
db0:keys=2079581,expires=0
//監(jiān)控進(jìn)程數(shù)(每臺(tái)機(jī)器redis實(shí)例數(shù))
define service{
use???????????????????????? local-service
host_name?????????????????? 119.147.163.xxx
servicegroups???????????????? procs
service_description????????? ???redis_20
check_command?????????????????? check_nrpe!check_procs\!20:20\!20:25\!redis-server
}
//監(jiān)控主從同步狀態(tài)(獲取從庫(kù)master_link_status與keys的值)
//status=down直接嚴(yán)重警告,keys相差10警告,keys相差100嚴(yán)重警告
define service{
use??????????????????? ?? local-service
#??????? hostgroup_name??????? ?? kabuxiyou
host_name?????????????? 119.147.161.xxx
servicegroups????????????????????????????? redis
service_description???? ??????? redis_239
check_command????????? check_nrpe!check_redis_slave\!192.168.0.139\!6379\!127.0.0.1\!6380
}
//監(jiān)控實(shí)例內(nèi)存使用大小,1.8G警告,2G嚴(yán)重警告
define service{
use??????????? ???????????????????? local-service
#??????? hostgroup_name???????? kabuxiyou
host_name?????????????? 119.147.161.xxx
servicegroups????????????????????????????? redis
service_description?????????????????? redis_mem_22
check_command??????????????????????? check_nrpe!check_redis_mem\!127.0.0.1\!6381
}
?
7、資料
7.1 參考資料
Redis入門手冊(cè)(zh_v1.0).pdf
http://www.infoq.com/cn/articles/tq-why-choose-redis
//?為什么使用 Redis及其產(chǎn)品定位
http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage
//?Redis內(nèi)存使用優(yōu)化與存儲(chǔ)
http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster
//?Redis復(fù)制與可擴(kuò)展集群搭建
http://blog.prosight.me/index.php/2011/08/802
//?Redis中7種集合類型應(yīng)用場(chǎng)景
7.2 版本
最新穩(wěn)定版:
wget http://redis.googlecode.com/files/redis-2.2.14.tar.gz ? ?// 2011.10.1
wget http://redis.googlecode.com/files/redis-2.4.2.tar.gz ? ?// 2011.11.15
wget http://redis.googlecode.com/files/redis-2.4.10.tar.gz ? ?// 2012.04.16
?
8、卡布西游Redis分布
8.1 服務(wù)器分布
服務(wù)器分布:??????????????????????????????????????????????????????? 實(shí)例名:???????????????????????????????????? 端口:
… … …
8.2 mysql轉(zhuǎn)redis規(guī)則
1.Key命名規(guī)則
Key采用字母+數(shù)字的形式 避免多個(gè)應(yīng)用使用同一個(gè)key的時(shí)候互相覆蓋,主項(xiàng)目中的key采用GJ#[UID] 例:GJ12345678
2.字段命名規(guī)則
主項(xiàng)目中的key內(nèi)包含多個(gè)字段 代表多個(gè)應(yīng)用 目前給每個(gè)應(yīng)用預(yù)留的字段取值范圍為100(實(shí)際使用中字段不應(yīng)該超過(guò)10個(gè)左右不然使用哈希的意義不大了)。
當(dāng)前的預(yù)留字段劃分:
100~199為成就相關(guān)(當(dāng)前使用150、151 對(duì)應(yīng)MySQL的achieve_user表的history與current字段)
200~299為妖怪相關(guān)(當(dāng)前使用200 對(duì)應(yīng)MySQL的spirit_store表 實(shí)際應(yīng)用時(shí)應(yīng)該會(huì)再多2個(gè)字段 對(duì)應(yīng)MySQL的spiritmaster與spirit表)
3.實(shí)例劃分規(guī)則
預(yù)計(jì)將劃分40個(gè)實(shí)例 玩家數(shù)據(jù)根據(jù)玩家的UID取模來(lái)分配到不同的實(shí)例中(是否再分庫(kù)未確定)
4.其他使用Redis劃分規(guī)則
目前莊園也有部分?jǐn)?shù)據(jù)使用redis 不過(guò)數(shù)據(jù)是放在一個(gè)單獨(dú)的redis實(shí)例中(119.147.164.24)
根據(jù)應(yīng)用不同使用不同的庫(kù)和key值 Key命名規(guī)則為[應(yīng)用名]-[UID] 例: GrowTimes-12345678 / StolenList-12345678
?
9、相關(guān)測(cè)試數(shù)據(jù)
//測(cè)試數(shù)據(jù)跟存儲(chǔ)的數(shù)據(jù)以及機(jī)器硬件配置等有關(guān),具體環(huán)境可能不太一樣,僅做參考。
9.1 啟動(dòng)關(guān)閉
啟動(dòng):1.6G AOF文件,132M RDB,啟動(dòng)時(shí)間107s,產(chǎn)生debug.log 128M,使用內(nèi)存1.71G。
2G數(shù)據(jù),啟動(dòng)約2分鐘,主從同步約2分鐘(內(nèi)網(wǎng))。
關(guān)閉:shutdown時(shí)間很短,一般1~2s,shutdown之前必須做save,save時(shí)間跟數(shù)據(jù)量有關(guān),一般幾秒。
9.2 數(shù)據(jù)量大小
簡(jiǎn)單set(set a 1),3萬(wàn)條約1M AOF,300K RDB;12萬(wàn)條約4M AOF,1M RDB。
set一條記錄,AOF會(huì)記錄些什么:
redis> set yuwei wangjiancheng
*3
$3
set
$5
yuwei
$3
wangjiancheng
9.3 備份打包
純文本AOF:
tar -zcf *.tar.gz *????????????? 1.9G / 20s / 16M /
tar -jcf *.tar.bz2 *???????????? 1.9G / 150s / 5.3M /
當(dāng)前線上使用redis,數(shù)據(jù)導(dǎo)入是二進(jìn)制流格式(AOF文件為數(shù)據(jù)文件,非文本文件),而且導(dǎo)入前已經(jīng)過(guò)一次壓縮,所以壓縮比例很低。
9.4 其他測(cè)試
實(shí)例配置文件中的數(shù)據(jù)目錄不存在,實(shí)例無(wú)法啟動(dòng)。
AOF邊寫邊打包(tar),不會(huì)造成數(shù)據(jù)損壞,tar只是讀文件。
Redis運(yùn)行過(guò)程中刪除數(shù)據(jù)目錄,不能bgsave,不能寫AOF,從庫(kù)能同步;從建目錄也不能bgsave,不能寫AOF。
Bgsave是放后臺(tái)去執(zhí)行的,所以bgsave;shutdown連寫在一起會(huì)出問(wèn)題,bgsave還未執(zhí)行完就已經(jīng)shutdown了。改用save。
主庫(kù)實(shí)例重啟后,從庫(kù)會(huì)重新”全同步”一次,保存數(shù)據(jù)與主庫(kù)一致。
網(wǎng)絡(luò)閃斷不會(huì)造成主從數(shù)據(jù)丟失,網(wǎng)絡(luò)恢復(fù)后可以續(xù)傳。
A實(shí)例快照文件,放B實(shí)例數(shù)據(jù)目錄啟動(dòng)(文件名改成B實(shí)例數(shù)據(jù)文件),OK!
執(zhí)行rewriteaof/ bgrewriteaof后,reidis根據(jù)內(nèi)存數(shù)據(jù),重新建立AOF,AOF重新排列順序。
?
10、客戶端連接redis
10.1 PHP
安裝phpredis:
phpredis軟件包地址(試了N個(gè)版本 只有這1個(gè)能在我們的定制系統(tǒng)環(huán)境裝上 蛋疼)
http://ftp.nluug.nl/pub/NetBSD/packages/distfiles/php-redis/nicolasff-phpredis-2.1.3-0-g43bc590.tar.gz
cd /dist/src
tar xzf ../dist/nicolasff-phpredis-2.1.3-0-g43bc590.tar.gz
cd nicolasff-phpredis-43bc590
/usr/local/php/bin/phpize
## 如果PHP是安裝的RPM包,需要安裝php-devel
./configure –with-php-config=/usr/local/php/bin/php-config
make && make install
配置php.ini
vi /usr/local/php/lib/php.ini?
加入:?
extension = “redis.so”
重啟 fastcgi 生效 /root/fastcgi_restart?
# php -m??? //查看是否有redis,檢查是否安裝成功。
Redis擴(kuò)展測(cè)試
測(cè)試代碼:
| <?php$redis?=?new?Redis();$redis->connect(’127.0.0.1′,6379);$redis->set(‘test’,'hello?world!’);echo?$redis->get(‘test’); ?> ? |
返回 hello world !表示成功
## 密碼
$redis->auth(‘My#redis’);
## Error:
configure: error: invalid value of canonical build
## ./configure
./configure –with-php-config=/usr/local/php/bin/php-config
10.2 C++
antirez-hiredis-3cc6a7f.tar.gz?????????????????? 340 KB
這個(gè)是官方的庫(kù),里面有個(gè)例子
跑這個(gè),帶參數(shù) ./hiredis-test
例子應(yīng)該是test.c
?
轉(zhuǎn)載于:https://www.cnblogs.com/fvsfvs123/p/4319240.html
總結(jié)
以上是生活随笔為你收集整理的Redis数据存储解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 菜鸟读jQuery 2.0.3 源码分析
- 下一篇: Gearman + Nodejs + M