Redis服務器搭建/配置/及Jedis客戶端的使用方法
Redis服務器搭建、常用參數含意說明、主從配置、以及使用Jedis客戶端來操作Redis
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 here pool.returnResource(jedis);.... // a few moments later ShardedJedis jedis2 = pool.getResource(); jedis.set("z", "bar"); pool.returnResource(jedis); pool.destroy();</pre>
集群
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>(); //Jedis Cluster will attempt to discover cluster nodes automatically jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379)); JedisCluster jc = new JedisCluster(jedisClusterNodes); jc.set("foo", "bar"); String value = jc.get("foo");來自:http://my.oschina.net/gccr/blog/307725