Redis服務器搭建/配置/及Jedis客戶端的使用方法

jopen 10年前發布 | 72K 次閱讀 Redis Jedis NoSQL數據庫

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!