標籤:des http os 使用 java io strong ar 檔案
Redis伺服器搭建 安裝
在命令列執行下面的命令:
$ wget http://download.redis.io/releases/redis-2.8.13.tar.gz$ tar xzf redis-2.8.13.tar.gz$ cd redis-2.8.13$ make
編譯完成後,會產生六個檔案:
redis-server
:這個是redis的伺服器
redis-cli
:這個是redis的用戶端
redis-check-aof
:這個是檢查AOF檔案的工具
redis-check-dump
:這個是本機資料檢查工具
redis-benchmark
:效能基準測試載入器,安裝完後可以測試一下當前Redis的效能
redis-sentinel
:Redis監控工具,叢集管理工具
設定檔
Redis的設定檔是:redis.conf
常用配置項為:
daemonize
: 是否以後台進程運行,預設為no
pidfile /var/run/redis.pid
: pid檔案路徑
port 6379
: 監聽連接埠
bind 127.0.0.1
:綁定主機ip
unixsocket /tmp/redis.sock
:sock檔案路徑
timeout 300
:逾時時間,預設是300s
loglevel verbose
:日誌等級,可選項有debug:大量的資訊,開發與測試有用;verbose:很多極其有用的資訊,但是不像debug那麼亂;notice:在生產環境中你想用的資訊;warning:最關鍵、最重要的資訊才列印。 預設是erbose
logfile stdout
:日誌記錄方式,預設是stdout
syslog-enabled no
:日誌記錄到系統日誌中,預設是no
syslog-ident redis
:指定系統日誌標識
syslog-facility local0
:指定系統日誌裝置,必須是USER或者 LOCAL0~LOCAL7。 預設是local0
databases 16
:資料庫的數量,預設的資料庫是DB 0,你可以使用 SELECT 來選擇不同的資料庫。dbid的範圍是0~(你設定的值-1)
save <seconds> <changes>
:RDB在多長時間內,有多少次更新操作,就將資料同步到資料檔案。
save 900 1
:15min內至少1個key被改變
save 300 10
:5min內至少有300個key被改變
save 60 10000
:60s內至少有10000個key被改變
rdbcompression yes
:儲存至本機資料庫時是否壓縮資料,預設是yes
dbfilename dump.rdb
:本機資料庫檔案名稱,預設是dump.rdb
dir ./
:本機資料庫存放路徑,預設是./
slaveof <masterip> <masterport>
:當本機為從服務時,設定主服務的ip以及連接埠
masterauth <master-password>
:主服務的串連密碼
從結點與主結點失去串連、或者正在複製時,從結點對用戶端請求的處理方式:
slave-serve-stale-data yes
:yes:從結點繼續響應用戶端的請求,但是資料有可能不準確或者為空白 no:除了INFO和SLAVEOF以外,其它的命令都返回“SYNC with master in progress”
requirepass foobared
:串連密碼foobared
maxclients 128
:最大串連數,預設不限制
maxmemory <bytes>
:設定最大記憶體,達到最大記憶體設定後,redis會先嘗試清除已到期或即將到期的key,當此方法處理後,任然到達最大記憶體設定,將無法再進行寫入操作
下面是maxmemory的策略
maxmemory-policy volatile-lru
:maxmemory設定策略,預設是volatile-lru
volatile-lru:使用LRU演算法,從到期集中移除
allkeys-lru:根據LRU演算法移除key
volatile-random:從到期集中隨機移動一個
allkeys-random:隨機移除一個
volatile-ttl: 根據最近到期時間移除key
noeviction:不移除資料,用戶端寫操作時返回錯誤 don‘t expire at all, just return an error on write operations
maxmemory-samples 3
appendonly no
:是否 在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按照上面save條件來進行同步的,所以有的資料會在一段時間內只存在於記憶體中。預設是no
appendfilename appendonly.aof
:更新記錄檔名,預設是appendonly.aof
redis支援的三種不同的同步方式:
no: don‘t fsync, just let the OS flush the data when it wants. Faster. //等待OS進行資料緩衝同步到硬碟
always: fsync after every write to the append only log . Slow, Safest. //每次更新操作後調用fsync()將資料寫到磁碟
everysec: fsync only if one second passed since the last fsync. Compromise. //每秒同步一次
appendfsync everysec
//更新日誌條件,預設是everysec
no-appendfsync-on-rewrite no
slowlog-log-slower-than 10000
:設定redis slow log時間,只包括命令執行時間,不包括IO操作時間,比如用戶端串連,應答相應時間等等。單位是microseconds(一百萬分之一秒),預設是10000.負值表示禁用slow log,0表示記錄所有命令。
slowlog-max-len 1024
:slowlog最大長度1024.這會消耗記憶體,使用SLOWLOG RESET來回收slowlog記憶體。
vm-enabled no
//是否使用虛擬記憶體,預設是no。在redis2.4版本,強烈不建議使用virtual memory。
vm-swap-file /tmp/redis.swap
//虛擬記憶體檔案路徑,預設是/tmp/redis.swap,不可多個redis執行個體共用虛擬記憶體檔案。
vm-max-memory 0
//設定最大vm,預設為0,所有的value存在於磁碟中。
vm-page-size 32
//設定vm的page大小,預設是32
vm-pages 134217728
//設定swap檔案中最大memory pages,預設是134217728。swap大小=vm-page-size * vm-pages
vm-max-threads 4
//vm同時啟動並執行最大io線程
指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的雜湊演算法:
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
//是否重設hash表
include /path/to/other.conf
:引用其他設定檔
設定Linux核心記憶體配置策略
$ sudo vim /etc/sysctl.conf
vm.overcommit_memory = 1
//指定核心針對記憶體配置的策略,其值可以是0,1,2
0表示核心將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。1表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。2表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體
啟動
./redis-server redis.conf
如果想在一台伺服器上搭建多個執行個體,可以使用下面的目錄結果:
redis |-- 根目錄下放置檔案 |-- instance-1 執行個體1的目錄 |-- redis.conf 執行個體1的設定檔 |-- instance-2 執行個體2的目錄 |-- redis.conf 執行個體2的設定檔 |-- instance-3 執行個體3的目錄 |-- redis.conf 執行個體3的設定檔
啟動時可以使用下面的命令:
./redis-server ./instance-1/redis.conf
:啟動執行個體1
./redis-server ./instance-2/redis.conf
:啟動執行個體2
./redis-server ./instance-3/redis.conf
:啟動執行個體3
進行基準測試
./redis-benchmark
通過基準測試,可以測試在當前的Redis伺服器的效能。我在我的虛擬機器上測試的結果是寫每秒4萬多,讀每秒8萬多
設定主從結構
在作為副本的Redis伺服器的設定檔中增加如下配置:
slaveof 192.168.66.41 6379
說明: salveof <主結點的IP> <主結點的連接埠>
Jedis用戶端使用 擷取
Jedis的github地址為: https://github.com/xetorthio/jedis
可以通過下面兩種方式來擷取Jedis的Jar包
直接下載Jar包
https://github.com/xetorthio/jedis/releases
從Maven倉庫中取Jar包
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.5.2</version> <type>jar</type> <scope>compile</scope> </dependency>
使用 最簡單的使用方式
Jedis jedis = new Jedis("localhost");jedis.set("foo", "bar");String value = jedis.get("foo");
當然,這種方式並不好,因為每次使用都要建立立一個串連,而且Jedis並不是安全執行緒的,在並發訪問的情況下容易出奇怪的問題。所以應該使用下面的這種方式:使用池
來做。
JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");Jedis jedis = pool.getResource();try { /// 開始使用 jedis.set("foo", "bar"); String foobar = jedis.get("foo"); jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); Set<String> sose = jedis.zrange("sose", 0, -1);} finally { /// 使用完後,將串連放回串連池 if (null != jedis) { jedis.close(); }}/// 應用退出時,關閉串連池:pool.destroy();
這種使用池的方式一般都能滿足我們的要求,但是有時候我們使用多台Redis伺服器時,我們需要將不同的key放到不同的Redis伺服器上面,這時我們可以根據業務的不同來選擇不同的Redis伺服器。這麼做可以一定程度的解決問題,但是還會有另外的問題生產,如:我們不容易確定哪個業務產品的資料有多大。這樣會使資料不能平均的分配到多台Redis伺服器上面。
這時我們需要使用分區的技術。代碼如下:
// 分區資訊 List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();JedisShardInfo si = new JedisShardInfo("localhost", 6379);si.setPassword("foobared");shards.add(si);si = new JedisShardInfo("localhost", 6380);si.setPassword("foobared");shards.add(si);// 池對象 ShardedJedisPool pool = new ShardedJedisPool(new Config(), shards);// 開始使用 ShardedJedis jedis = pool.getResource();jedis.set("a", "foo");.... // do your work herepool.returnResource(jedis);.... // a few moments laterShardedJedis jedis2 = pool.getResource();jedis.set("z", "bar");pool.returnResource(jedis);pool.destroy();
叢集
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();//Jedis Cluster will attempt to discover cluster nodes automaticallyjedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));JedisCluster jc = new JedisCluster(jedisClusterNodes);jc.set("foo", "bar");String value = jc.get("foo");
Redis伺服器搭建/配置/及Jedis用戶端的使用方法