定義:
Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets,sorted sets, bitmaps and hyperloglogs.
下載:
安裝
tar -zxvf解壓完make、make install一下



配置
redis.conf
#是否以后台進程執行
daemonize
yes
#指定后台進程的pid文件寫入位置
pidfile
/var/run/redis
.pid
#監聽端口,默覺得6379
port 6379
#僅僅接受下面綁定的IP請求,沒有表示接受全部請求
bind 127.0.0.1
設置unix套接字,默覺得空,及不通過unix套接字來監聽
# unixsocket /tmp/redis.sock
# unixsocketperm 755
#client空暇多長時間,關閉鏈接。
timeout 5
# TCP keepalive.
# 假設是非零值。當失去鏈接時。會使用SO_KEEPALIVE發送TCP ACKs 到client。
# 這個參數有兩個作用:
# 1.檢測斷點。
# 2.從網絡中間設備來看,就是保持鏈接
# 在Linux上,設定的時間就是發送ACKs的周期。
# 注意:達到雙倍的設定時間才會關閉鏈接。在其它內核上,周期依賴於內核設置。
# 一個比較合理的值為60s
tcp-keepalive 0
# 指定日志級別,下面記錄信息依次遞減
# debug用於開發/測試
# verbose沒debug那么具體
# notice適用於生產線# warning僅僅記錄很重要的信息
loglevel notice
#日志文件名,假設為stdout則輸出到標准輸出端,假設是以后台進程執行則不產生日志
logfile
/data/logs/redis/redis
.log
# 要想啟用系統日志記錄器,設置一下選項為yes
# syslog-enabled no
# 指明syslog身份
# syslog-ident redis
# 指明syslog設備。必須是一個用戶或者是local0 ~ local7之中的一個
# syslog-facility local0
#設置數據庫數目。第一個數據庫編號為:0
databases 16
##############快照#################
#在什么條件下保存數據庫到磁盤,條件能夠有非常多個,滿足不論什么一個條件都會進行快照
#在900秒之內有一次key的變化
save 900 1
#在300秒之內,有10個key的變化
save 300 10
#在60秒之內有10000個key變化
save 60 10000
#當持久化失敗的時候,是否繼續提供服務
stop-writes-on-bgsave-error
yes
#當寫入磁盤時。是否使用LZF算法壓縮數據,默覺得yes
rdbcompression
yes
#是否加入CRC64校驗到每一個文件末尾--花費時間保證安全
rdbchecksum
yes
#磁盤上數據庫的保存名稱
dbfilename dump.rdb
# Redis工作文件夾。以上數據庫保存文件和AOF日志都會寫入此文件夾
dir
/data/redis
##############同步#################
#主從復制。當本機是slave時配置
# slaveof <masterip> <masterport>
#當主機須要password驗證時候配置
# masterauth <master-password>
# 當slave和master丟失鏈接,或正處於同步過程中。是否響應client請求
# 設置為yes表示響應
# 設置為no,直接返回"SYNC with master in progress"(正在和主server同步中)
slave-serve-stale-data
yes
# 設置slave是否為僅僅讀。
# 注意:即使slave設置為僅僅讀,也不能令其暴露在不受信任的網絡環境中
slave-
read
-only
yes
# 設置slave給master發送ping的時間間隔。秒
# repl-ping-slave-period 10
# 設置傳輸數據I/O,主機數據、ping響應超時時間,默認60s
# 這個時間一定要比repl-ping-slave-period大,否則會不斷檢測到超時
# repl-timeout 60
# 是否在SYNC后slave socket上禁用TCP_NODELAY?
# 假設你設置為yes。Redis會使用少量TCP報文和少量帶寬發送數據給slave。
# 可是這樣會在slave端出現延遲。
# 假設你設置為no,那么在slave端延遲就會降低可是同步帶寬要添加。
# 默認我們是為低延遲優化的。
# 可是假設流量特別大或者主從server相距比較遠。設置為yes比較合理。
repl-disable-tcp-nodelay no
# 設置slave優先級。默覺得100
# 當主server不能正確工作的時候,數字低的首先被提升為主server,可是0是禁用選擇
slave-priority 100
##############安全#################
# 設置client連接password,由於Redis響應速度能夠達到每秒100w次,所以password要特別復雜
# requirepass foobared
# 命令又一次命名。或者禁用。
# 重命名命令為空字符串能夠禁用一些危急命令比方:FLUSHALL刪除全部數據
# 須要注意的是,寫入AOF文件或傳送給slave的命令別名或許會引起一些問題
# rename-command CONFIG ""
##############限制#################
# 設置最多鏈接client數量。默覺得10000。
# 實際能夠接受的請求數目為設置值減去32,這32是Redis為內部文件描寫敘述符保留的
# maxclients 10000
# 設置最大使用內存數量。在把Redis當作LRU緩存時特別實用。
# 設置的值要比系統能使用的值要小
# 由於當啟用刪除算法時。slave輸出緩存也要占用內存
# maxmemory <bytes>
#達到最大內存限制時,使用何種刪除算法
# volatile-lru 使用LRU算法移除帶有過期標致的key
# allkeys-lru -> 使用LRU算法移除不論什么key
# volatile-random -> 隨機移除一個帶有過期標致的key
# allkeys-random -> 隨機移除一個key
# volatile-ttl -> 移除近期要過期的key
# noeviction -> 不刪除key。當有寫請求時,返回錯誤
#默認設置為volatile-lru
# maxmemory-policy volatile-lru
# LRU和最小TTL算法沒有精確的實現
# 為了節省內存僅僅在一個樣本范圍內選擇一個近期最少使用的key,能夠設置這個樣本大小
# maxmemory-samples 3
##############AO模式#################
# AOF和RDB持久化能夠同一時候啟用
# Redis啟動時候會讀取AOF文件,AOF文件有更好的持久化保證
appendonly no
# AOF的保存名稱,默覺得appendonly.aof
# appendfilename appendonly.aof
# 設置何時寫入追加日志,又三種模式
# no:表示由操作系統決定何時寫入。
# everysec:表示每秒運行一次寫入。折中方案,推薦
# always:表示每次都寫入磁盤。
appendfsync everysec
# 當AOF同步策略設定為alway或everysec
# 當后台存儲進程(后台存儲或者AOF日志后台寫入)會產生非常多磁盤開銷
# 某些Linux配置會使Redis由於fsync()調用產生堵塞非常久
# 如今還沒有修復補丁,甚至使用不同線程進行fsync都會堵塞我們的同步write(2)調用。
# 為了緩解這個問題,使用下面選項在一個BGSAVE或BGREWRITEAOF執行的時候
# 能夠阻止fsync()在主程序中被調用,
no-appendfsync-on-rewrite no
# AOF自己主動重寫(合並命令,降低日志大小)
# 當AOF日志大小添加到一個特定比率,Redis調用BGREWRITEAOF自己主動重寫日志文件
# 原理:Redis 會記錄上次重寫后AOF文件的文件大小。
# 假設剛啟動,則記錄啟動時AOF大小
# 這個基本大小會用來和當前大小比較。假設當前大小比特定比率大。就會觸發重寫。
# 你也須要指定一個AOF須要被重寫的最小值,這樣會避免達到了比率。
# 可是AOF文件還非常小的情況下重寫AOF文件。
# 設置為0禁用自己主動重寫
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
##############LUA腳本#################
# Lua腳本的最大運行時間,單位毫秒
# 超時后會報錯。而且計入日志
# 當一個腳本執行時間超過了最大執行時間
# 僅僅有SCRIPT KILL和 SHUTDOWN NOSAVE兩個命令能夠使用。
# SCRIPT KILL用於停止沒有調用寫命令的腳本。
# SHUTDOWN NOSAVE是唯一的一個,在腳本的寫命令正在運行
# 用戶又不想等待腳本的正常結束的情況下。關閉server的方法。
# 下面選項設置為0或負數就會取消腳本運行時間限制
lua-
time
-limit 5000
##############慢查詢#################
# Redis慢查詢日志記錄超過設定時間的查詢,且僅僅記錄運行命令的時間
# 不記錄I/O操作,比方:和client交互。發送回復等。
# 時間單位為微妙,1000000微妙 = 1 秒
# 設置為負數會禁用慢查詢日志,設置為0會記錄全部查詢命令
slowlog-log-slower-than 10000
# 日志長度沒有限制,可是會消耗內存。超過日志長度后,最舊的記錄會被移除
# 使用SLOWLOG RESET命令能夠回收內存
slowlog-max-len 128
##############高級設置###############
# 當有少量條目的時候,哈希使用高效內存數據結構。
hash
-max-ziplist-entries 512
hash
-max-ziplist-value 64
# 和哈希編碼一樣,少量列表也以特殊方式編碼節省內存。
list-max-ziplist-entries 512
list-max-ziplist-value 64
# 集合僅僅在下面情況下使用特殊編碼來節省內存
# -->集合所有由64位帶符號10進制整數構成的字符串組成
# 以下的選項設置這個特殊集合的大小。
set
-max-intset-entries 512
# 當有序集合的長度和元素設定為下面數字時。又特殊編碼節省內存
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 哈希刷新使用每100個CPU毫秒中的1毫秒來幫助刷新主哈希表(頂級鍵值映射表)。
# Redis哈希表使用延遲刷新機制。越多操作。越多刷新。
# 假設server空暇,刷新操作就不會進行,很多其它內存會被哈希表占用
# 默認每秒進行10次主字典刷新,釋放內存。
# 假設你有硬性延遲需求,偶爾2毫秒的延遲無法忍受的話。設置為no
# 否則設置為yes
activerehashing
yes
# client輸出緩存限制強迫斷開讀取速度比較慢的client
# 有三種類型的限制
# normal -> 正茶館你client
# slave -> slave和 MONITOR
# pubsub -> client至少訂閱了一個頻道或者模式
# client輸出緩存限制語法例如以下(時間單位:秒)
# client-output-buffer-limit <類別> <強制限制> <軟性限制> <軟性時間>
# 達到強制限制緩存大小,立馬斷開鏈接。
# 達到軟性限制,仍然會有軟性時間大小的鏈接時間
# 默認正常client無限制,僅僅有請求后,異步client數據請求速度快於它能讀取數據的速度
# 訂閱模式和主從client又默認限制。由於它們都接受推送。
# 強制限制和軟性限制都能夠設置為0來禁用這個特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 設置Redis后台任務運行頻率,比方清除過期鍵任務。
# 設置范圍為1到500。默覺得10.越大CPU消耗越大,延遲越小。
# 建議不要超過100
hz 10
# 當子進程重寫AOF文件,下面選項開啟時。AOF文件會每產生32M數據同步一次。
# 這有助於更快寫入文件到磁盤避免延遲
aof-rewrite-incremental-fsync
yes
##############包括#################
#引入標准模板
# include /path/to/other.conf
|
|
slaveof 192.168.11.176 10001
|
啟動/停止
啟動
redis-server xxxxxx/redis.conf
停止
redis-cli -n 12002 shutdown
Redis持久化
Redis的持久化方式:快照和AOF(append-only file)
快照
默認的持久化方式。將內存數據以快照方式寫入文件dump.rdb,無法保證數據完整性(持久化之前出現宕機。RDB採用fork子進程完畢持久化,當數據集較大,可能會導致整個server停止服務幾百毫秒)
AOF
每個收到的寫命令都通過write函數追加到文件里appendonly.aof,當redis重新啟動會又一次運行文件里保存的寫命令重建數據庫的內容。因為os會在內核緩存write所的改動。所以不可能馬上寫入磁盤。這就有可能導致數據丟失。通過強制寫入來保證:
appendonly yes 啟用aof持久化方式
appendfsync always每次收寫命令馬上強制寫磁盤,最慢可是保證數據持久化,不推薦
appendfsync everysec 每秒寫
appendfsync no依賴os。性能好。持久化沒保證
aof文件比rdb大。效率慢
Jedisclient開發
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.0</version> </dependency>
package com.chiwei.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisClient {
private static JedisPool pool = null;
private static String host = "192.168.11.176";
private static int port = 10001;
static {
if (pool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(500);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
config.setTestWhileIdle(true);
pool = new JedisPool(config, host, port);
}
}
public static void returnResource(JedisPool pool, Jedis redis) {
if (redis != null) {
pool.returnResource(redis);
}
}
public static String get(String key) {
String value = null;
Jedis jedis = null;
try {
jedis = pool.getResource();
value = jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
// 釋放資源
pool.returnBrokenResource(jedis);
} finally {
returnResource(pool, jedis);
}
return value;
}
public static void set(String key, String value) {
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set(key, value);
jedis.expire(key, 10);
} catch (Exception e) {
e.printStackTrace();
pool.returnBrokenResource(jedis);
} finally {
returnResource(pool, jedis);
}
}
public static void main(String[] args) {
set("momo", "nono");
}
}
歡迎留言探討!!
