安裝:
yum install gcc-c++
yum install -y tcl
wget http://download.redis.io/releases/redis-3.2.3.tar.gz
tar xzf redis-3.2.3.tar.gz
cd redis-3.2.3
make
make install
拷貝配置文件
mkdir -p /etc/redis
cp redis.conf/etc/redis
vi /etc/redis/redis.conf//根據(jù)需要修改,如: daemonize yes (no-->yes)讓server以守護進程在后臺執(zhí)行挠唆。
redis-server /etc/redis/redis.conf //根據(jù)指定的配置文件啟動处窥,redis-server 根據(jù)默認配置文件啟動
ps -ef | grep redis //查看是否啟動
redis-cli // 啟動客戶端,遠程:$ redis-cli -h host -p port -a password
127.0.0.1:6379> ping
PONG
啟動成功
參數(shù):
在cli端查看配置參數(shù)
* 號是查看所有參數(shù)玄组。
有些參數(shù)在運行后不可以修改滔驾。
daemonize no 默認情況下,redis不是在后臺運行的俄讹,如果需要在后臺運行哆致,把該項的值更改為yes
daemonize yes
當redis在后臺運行的時候,Redis默認會把pid文件放在/var/run/redis.pid患膛,你可以配置到其他地址摊阀。當運行多個redis服務時,需要指定不同的pid文件和端口
pidfile /var/run/redis.pid
指定redis運行的端口,默認是6379
port 6379
指定redis只接收來自于該IP地址的請求胞此,如果不進行設置臣咖,那么將處理所有請求。
bind的是redis所在服務器網(wǎng)卡的ip豌鹤。也就是說亡哄,如果你的redis服務器有兩張網(wǎng)卡,一張是ip-1,另一張是ip-2布疙,如果你bind ip-1.那么只有請求ip-1的請求會被受理蚊惯。例如在IP為128.199.173.52的機器上設置了 bind 128.199.173.52,在另一臺機器上可以通過redis-cli -h 128.199.173.52 -p 6379 -a password 訪問灵临。
bind 127.0.0.1
設置客戶端連接時的超時時間截型,單位為秒。當客戶端在這段時間內沒有發(fā)出任何指令儒溉,那么關閉該連接
0是關閉此設置
timeout 0
指定日志記錄級別
Redis總共支持四個級別:debug宦焦、verbose、notice顿涣、warning波闹,默認為verbose
debug 記錄很多信息,用于開發(fā)和測試
varbose 有用的信息涛碑,不像debug會記錄那么多
notice 普通的verbose精堕,常用于生產(chǎn)環(huán)境
warning 只有非常重要或者嚴重的信息會記錄到日志
loglevel debug
配置log文件地址
默認值為stdout,標準輸出蒲障,若后臺模式會輸出到/dev/null
logfile stdout
logfile /var/log/redis/redis.log
可用數(shù)據(jù)庫數(shù)
默認值為16歹篓,默認數(shù)據(jù)庫為0,數(shù)據(jù)庫范圍在0-(database-1)之間
databases 16
保存數(shù)據(jù)到磁盤揉阎,格式如下:
save <seconds> <changes>
指出在多長時間內庄撮,有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件rdb毙籽。
相當于條件觸發(fā)抓取快照洞斯,這個可以多個條件配合
比如默認配置文件中的設置,就設置了三個條件
save 900 1 900秒內至少有1個key被改變
save 300 10 300秒內至少有300個key被改變
save 60 10000 60秒內至少有10000個key被改變
save 900 1
save 300 10
save 60 10000
存儲至本地數(shù)據(jù)庫時(持久化到rdb文件)是否壓縮數(shù)據(jù)坑赡,默認為yes
rdbcompression yes
本地持久化數(shù)據(jù)庫文件名巡扇,默認值為dump.rdb
dbfilename dump.rdb
工作目錄
數(shù)據(jù)庫鏡像備份的文件放置的路徑。
這里的路徑跟文件名要分開配置是因為redis在進行備份時垮衷,先會將當前數(shù)據(jù)庫的狀態(tài)寫入到一個臨時文件中厅翔,等備份完成時,
再把該該臨時文件替換為上面所指定的文件搀突,而這里的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中刀闷。
AOF文件也會存放在這個目錄下面
注意這里必須指定一個目錄而不是文件
dir ./
主從復制. 設置該數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫.
設置當本機為slav服務時,設置master服務的IP地址及端口,在Redis啟動時甸昏,它會自動從master進行數(shù)據(jù)同步
slaveof <masterip> <masterport>
當master服務設置了密碼保護時(用requirepass制定的密碼)
slav服務連接master的密碼(在slave端配置)
masterauth <master-password>
當從庫同主機失去連接或者復制正在進行顽分,從機庫有兩種運行方式:
- 如果slave-serve-stale-data設置為yes(默認設置),從庫會繼續(xù)相應客戶端的請求
- 如果slave-serve-stale-data是指為no施蜜,出去INFO和SLAVOF命令之外的任何請求都會返回一個
錯誤"SYNC with master in progress"
slave-serve-stale-data yes
從庫會按照一個時間間隔向主庫發(fā)送PINGs.可以通過repl-ping-slave-period設置這個時間間隔卒蘸,默認是10秒
repl-ping-slave-period 10
repl-timeout 設置主庫批量數(shù)據(jù)傳輸時間或者ping回復時間間隔,默認值是60秒
一定要確保repl-timeout大于repl-ping-slave-period
repl-timeout 60
設置客戶端連接后進行任何其他指定前需要使用的密碼翻默。
警告:因為redis速度相當快缸沃,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒鐘進行150K次的密碼嘗試修械,這意味著你需要指定非常非常強大的密碼來防止暴力破解
requirepass password
設置同一時間最大客戶端連接數(shù)趾牧,默認無限制,Redis可以同時打開的客戶端連接數(shù)為Redis進程可以打開的最大文件描述符數(shù)肯污,
如果設置 maxclients 0翘单,表示不作限制。
當客戶端連接數(shù)到達限制時蹦渣,Redis會關閉新的連接并向客戶端返回max number of clients reached錯誤信息
maxclients 0
指定Redis最大內存限制哄芜,Redis在啟動時會把數(shù)據(jù)加載到內存中,達到最大內存后柬唯,Redis會先嘗試清除已到期或即將到期的Key
Redis同時也會移除空的list對象
當此方法處理后认臊,仍然到達最大內存設置,將無法再進行寫入操作权逗,但仍然可以進行讀取操作
注意:Redis新的vm機制美尸,會把Key存放內存冤议,Value會存放在swap區(qū)
maxmemory的設置比較適合于把redis當作于類似memcached的緩存來使用斟薇,而不適合當做一個真實的DB。
當把Redis當做一個真實的數(shù)據(jù)庫使用的時候恕酸,內存使用將是一個很大的開銷
maxmemory <bytes>
當內存達到最大值的時候Redis會選擇刪除哪些數(shù)據(jù)堪滨?有五種方式可供選擇
volatile-lru -> 利用LRU算法移除設置過過期時間的key (LRU:最近使用 Least Recently Used )
allkeys-lru -> 利用LRU算法移除任何key
volatile-random -> 移除設置過過期時間的隨機key
allkeys->random -> 隨機key
volatile-ttl -> 移除即將過期的key(minor TTL)
noeviction -> 不移除任何可以,只是返回一個寫錯誤
注意:對于上面的策略蕊温,如果沒有合適的key可以移除袱箱,當寫的時候Redis會返回一個錯誤
寫命令包括: set setnx setex append
incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
getset mset msetnx exec sort
默認是:
maxmemory-policy volatile-lru
LRU 和 minimal TTL 算法都不是精準的算法,但是相對精確的算法(為了節(jié)省內存)义矛,隨意你可以選擇樣本大小進行檢測发笔。
Redis默認的灰選擇3個樣本進行檢測,你可以通過maxmemory-samples進行設置
maxmemory-samples 3
默認情況下凉翻,redis會在后臺異步的把數(shù)據(jù)庫鏡像備份到磁盤了讨,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發(fā)生諸如拉閘限電前计、拔插頭等狀況胞谭,那么將造成比較大范圍的數(shù)據(jù)丟失。
所以redis提供了另外一種更加高效的數(shù)據(jù)庫備份及災難恢復方式男杈。
開啟append only模式之后丈屹,redis會把所接收到的每一次寫操作請求都追加到appendonly.aof文件中,當redis重新啟動時伶棒,會從該文件恢復出之前的狀態(tài)旺垒。
但是這樣會造成appendonly.aof文件過大,所以redis還支持了BGREWRITEAOF指令苞冯,對appendonly.aof 進行重新整理袖牙。
你可以同時開啟asynchronous dumps 和 AOF
appendonly no
AOF文件名稱 (默認: "appendonly.aof")
appendfilename appendonly.aof
Redis支持三種同步AOF文件的策略:
no: 不進行同步,系統(tǒng)去操作 . Faster.
always: always表示每次有寫操作都進行同步. Slow, Safest.
everysec: 表示對寫操作進行累積舅锄,每秒同步一次. Compromise.
默認是"everysec"鞭达,按照速度和安全折中這是最好的。
如果想讓Redis能更高效的運行皇忿,你也可以設置為"no"畴蹭,讓操作系統(tǒng)決定什么時候去執(zhí)行
或者相反想讓數(shù)據(jù)更安全你也可以設置為"always"
如果不確定就用 "everysec".
appendfsync everysec
AOF策略設置為always或者everysec時,后臺處理進程(后臺保存或者AOF日志重寫)會執(zhí)行大量的I/O操作
在某些Linux配置中會阻止過長的fsync()請求鳍烁。注意現(xiàn)在沒有任何修復叨襟,即使fsync在另外一個線程進行處理
為了減緩這個問題,可以設置下面這個參數(shù)no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
AOF 自動重寫
當AOF文件增長到一定大小的時候Redis能夠調用 BGREWRITEAOF 對日志文件進行重寫
它是這樣工作的:Redis會記住上次進行些日志后文件的大小(如果從開機以來還沒進行過重寫幔荒,那日子大小在開機的時候確定)
基礎大小會同現(xiàn)在的大小進行比較糊闽。如果現(xiàn)在的大小比基礎大小大制定的百分比,重寫功能將啟動
同時需要指定一個最小大小用于AOF重寫爹梁,這個用于阻止即使文件很小但是增長幅度很大也去重寫AOF文件的情況
設置 percentage 為0就關閉這個特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
當hash中包含超過指定元素個數(shù)并且最大的元素沒有超過臨界時右犹,
hash將以一種特殊的編碼方式(大大減少內存使用)來存儲,這里可以設置這兩個臨界值
Redis Hash對應Value內部實際就是一個HashMap姚垃,實際這里會有2種不同實現(xiàn)念链,
這個Hash的成員比較少時Redis為了節(jié)省內存會采用類似一維數(shù)組的方式來緊湊存儲,而不會采用真正的HashMap結構积糯,對應的value redisObject的encoding為zipmap,
如果Hash中字段的數(shù)量小于參數(shù)值掂墓,Redis將對該Key的Hash Value采用特殊編碼。
hash-max-zipmap-entries 64
如果Hash中各個字段的最大長度不超過512字節(jié)看成,Redis也將對該Key的Hash Value采用特殊編碼方式君编。
hash-max-zipmap-value 512
list數(shù)據(jù)類型多少節(jié)點以下會采用去指針的緊湊存儲格式。
list數(shù)據(jù)類型節(jié)點值大小小于多少字節(jié)會采用緊湊存儲格式川慌。
list-max-ziplist-entries 512
list-max-ziplist-value 64
set數(shù)據(jù)類型內部數(shù)據(jù)如果全部是數(shù)值型吃嘿,且包含多少節(jié)點以下會采用緊湊格式存儲偿荷。
set-max-intset-entries 512
zsort數(shù)據(jù)類型多少節(jié)點以下會采用去指針的緊湊存儲格式。
zsort數(shù)據(jù)類型節(jié)點值大小小于多少字節(jié)會采用緊湊存儲格式唠椭。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash跳纳,可以降低內存的使用
當你的使用場景中,有非常嚴格的實時性需要贪嫂,不能夠接受Redis時不時的對請求有2毫秒的延遲的話寺庄,把這項配置為no。
如果沒有這么嚴格的實時性要求,可以設置為yes,以便能夠盡可能快的釋放內存
activerehashing yes
指定包含其它的配置文件贱纠,可以在同一主機上多個Redis實例之間使用同一份配置文件媳溺,而同時各個實例又擁有自己的特定配置文件
include /path/to/local.conf
include /path/to/other.conf
數(shù)據(jù)類型:
string
string類型是Redis最基本的數(shù)據(jù)類型偏陪,一個鍵最大能存儲512MB。
get key(根據(jù)k得到v),set key value(設置kv)。
incr(v加1)贞岭,decr(v減1),incrby(v和參數(shù)做加法)搓侄,decrby(v和參數(shù)做減法)瞄桨。
setnx key value(k不存在才設置),setn key value xx(k存在才設置)讶踪。
mset(插入多個kv)芯侥,mget(獲取多個k的v)。
getset(得到原來的v乳讥,插入新v)柱查,append(在原v上追加),strlen(v的長度)云石。
incrbyfloat(v與浮點相加)唉工,getrange(v的字符范圍),setrange(更改v的部分字符)留晚。
hash
hset (設置hash屬性)酵紫,hget(得到hash屬性)告嘲,hdel(刪除哈希屬性)错维,hgetall(得到hash類型的v,不能用get)橄唬。
hexists(判斷hash屬性存在)赋焕,hlen(hash屬性個數(shù))
hmset,hmget(批量設置仰楚,取出hash的屬性)
hincrby(hash屬性的加法)
hgetall(得到所有hash的kv)隆判,hvals(得到所有hash的v)犬庇,hkeys(得到所有hash的k)
list
lpush/lpop棧。lpush/rpop隊列侨嘀。
rpush:從右側插入list
linsert:在某值的前或后插入
lpop:從左側彈出
lrange:取出list指定下標范圍的值
lrem key count value:刪除count個和value一樣的值臭挽。count>0從左到右。count<0咬腕,從右到左欢峰。count=0,刪除所有涨共。
ltrim key start end: 根據(jù)索引范圍修剪表纽帖。
lindex key index:根據(jù)索引取出值。
llen key:得到list的長度举反。
lset key index value:根據(jù)索引設值懊直。
set
sadd打標簽。spop/srandmember得到隨機值火鼻。sinter社交關系室囊。
sadd key value:想集合中插入,已存在則失敗魁索。
srem key value:刪除集合中的指定value波俄。
scard key:返回集合大小。
sismember key value:是否存在value蛾默,1為存在懦铺。
spop key count:隨機刪除集合中的count個value。
smember key:返回集合的所有數(shù)據(jù)支鸡。
srandmember key count:隨機返回count個集合中的數(shù)據(jù)冬念。
sdiff set set:差集。
sinter set set:交集牧挣。
sunion set set:并集急前。
sorted set
zadd key score value:插入有序集合,可以是多對瀑构。
zscore key value:得到分數(shù)裆针。
zincrby key score value:分數(shù)加法。
zcard key:得到集合的元素個數(shù)寺晌。
zrank key value:驗證value是否存在世吨。
zrange key start end withscores:根據(jù)索引取出集合的元素。
zrem key value:根據(jù)value刪除元素呻征。
zrangebyscore key minscore maxscore withscores:取出范圍內的元素耘婚。
zcount key minscore maxscore:統(tǒng)計范圍內的個數(shù)。
zremrangebyrank key startend:根據(jù)升序刪除指定索引的元素
其他鍵值操作:
type key:返回value的類型陆赋。
del key:刪除對應的鍵值對沐祷。
exist key:鍵值是否存在嚷闭。
rename key newkey:重新命名key,原key必須存在赖临。
expire key num:設置時效胞锰。
ttl key:查看剩余時效。沒有時效為-1兢榨,過期為-2胜蛉。
dbsize:鍵值對的數(shù)量。
keys *:查看所有key色乾。和smenbers一樣是長命令誊册,盡量不用。
select num:選擇數(shù)據(jù)庫(0-15)暖璧,默認使用0庫案怯。不建議使用多庫,建議采用多實例澎办。
scan cursor :cursor設為0表示重新開始迭代嘲碱。的返回值是一個包含兩個元素的數(shù)組, 第一個數(shù)組元素是用于進行下一次迭代的新游標局蚀, 而第二個數(shù)組元素則是一個數(shù)組包含了所有被迭代的元素麦锯。當服務器向用戶返回值為 0 的游標時, 表示迭代已結束琅绅。
scan cursor count num:用戶可以通過增量式迭代命令提供的COUNT選項來指定每次迭代返回元素個數(shù)的上限扶欣。
scan cursor match pattern:匹配工作是在命令從數(shù)據(jù)集中取出元素后進行的, 所以或許會在多次執(zhí)行中都不返回任何元素千扶。
要點:
啟動服務端:redis-server /etc/redis/redis.conf
啟動客戶端:redis-cli -h 128.199.173.52 -p 6379 & redis-cli -h 128.199.173.52 -p 6379 -a password
退出客戶端:exit
關閉服務端:shutdown
綁定IP:bind的是redis所在服務器網(wǎng)卡的ip
設置密碼:requirepass password
string
set key value
get key value
mset key1 value1 key2 value2
mget key1 key2
incr key
decr key
append key value
hash
hset user:1 age 25
hget user:1 age
hdel user:1 age(如果最后一個屬性被刪除料祠,user:1也被刪除)
hgetall user:1
hmset user:1 age 25 name aaa
hmget user:1 age name
list
lpush key value
rpush key value
lpop key value
rpop key value
lrange key 0 -1
lindex key 5
lset key index value
llen key
刪除指定下標的數(shù)據(jù)
lset ListKey index "deleted"
lrem ListKey 0 "deleted"
set
sadd key value
srem key value
scard key 返回集合大小
sismember key value 是否存在value,1為存在
smember key 返回集合的所有數(shù)據(jù)
sorted set
zadd key score value
zscore key value 得到分數(shù)
zincrby key score value 分數(shù)加法
zcard key 得到集合的元素個數(shù)
zrange key start end withscores 根據(jù)索引取出集合的元素
zrem key value 根據(jù)value刪除元素