Redis
Redis命令參考網(wǎng)址:http://doc.redisfans.com/
- Redis 簡(jiǎn)介
Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議泛源,是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)仔燕。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
- Redis支持?jǐn)?shù)據(jù)的持久化舒帮,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中蒙袍,重啟的時(shí)候可以再次加載進(jìn)行使用其兴。
- Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù)骚烧,同時(shí)還提供list浸赫,set,zset赃绊,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)掺炭。
- Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份凭戴。
2.Redis安裝
1)Window 下安裝
64位下載地址:https://github.com/MSOpenTech/redis/releases涧狮。
32位下載地址:http://vdisk.weibo.com/s/dbUhxKrgqodB
(如果使用32位,請(qǐng)采用單機(jī)模式)
Redis 支持 32 位和 64 位么夫。這個(gè)需要根據(jù)你系統(tǒng)平臺(tái)的實(shí)際情況選擇者冤,這里我們下載 Redis-x64-xxx.zip壓縮包到 C 盤,解壓后档痪,將文件夾重新命名為 redis涉枫。
下載解壓,在解壓后的目錄下有以下這些文件
打開一個(gè) cmd 窗口 使用cd命令切換目錄到 C:\redis 運(yùn)行 redis-server.exe redis.windows.conf 腐螟。
如果想方便的話愿汰,可以把 redis 的路徑加到系統(tǒng)的環(huán)境變量里,這樣就省得再輸路徑了乐纸,后面的那個(gè) redis.windows.conf 可以省略衬廷,如果省略,會(huì)啟用默認(rèn)的汽绢。輸入之后吗跋,會(huì)顯示如下界面:
這時(shí)候另啟一個(gè)cmd窗口,原來(lái)的不要關(guān)閉,不然就無(wú)法訪問(wèn)服務(wù)端了跌宛。
切換到redis目錄下運(yùn)行 redis-cli.exe -h <ip> -p <端口(默認(rèn)6379)>
例如:redis-cli.exe -h 127.0.0.1 -p 6379酗宋。
設(shè)置鍵值對(duì) set myKey abc
取出鍵值對(duì) get myKey
2)Linux 下安裝
下載地址:http://redis.io/download,下載最新文檔版本疆拘。
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
make完后 redis-2.8.17目錄下會(huì)出現(xiàn)編譯后的redis服務(wù)程序redis-server,還有用于測(cè)試的客戶端程序redis-cli,兩個(gè)程序位于安裝目錄 src 目錄下:
下面啟動(dòng)redis服務(wù).
$ cd src
$ ./redis-server
注意這種方式啟動(dòng)redis 使用的是默認(rèn)配置蜕猫。也可以通過(guò)啟動(dòng)參數(shù)告訴redis使用指定配置文件使用下面命令啟動(dòng)。
$ cd src
$ ./redis-server redis.conf
redis.conf是一個(gè)默認(rèn)的配置文件哎迄。我們可以根據(jù)需要使用自己的配置文件回右。
啟動(dòng)redis服務(wù)進(jìn)程后,就可以使用測(cè)試客戶端程序redis-cli和redis服務(wù)交互了芬失。 比如:
$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
3)window下redis集群搭建
ruby環(huán)境準(zhǔn)備
下載 64位的 RubyInstaller并安裝 地址http://rubyinstaller.org/downloads/
勾選下面三個(gè)不用配置環(huán)境變量
安裝RubyGems
下載下來(lái)是一個(gè)壓縮包楣黍,解壓運(yùn)行里面的 setup.rb 安裝 rubyGems
由于墻的原因ruby自帶的源有時(shí)候很慢,我們換成淘寶的源棱烂,不然下面安裝redis依賴會(huì)失斪馄\(--)/
在cmd下運(yùn)行
gem sources --remove https://rubygems.org/ 刪掉原來(lái)的源
gem sources -a http://ruby.taobao.org 添加淘寶源(如果添加失敗,試試https://ruby.taobao.org或http://gems.ruby-china.org)
gem sources -l 查看現(xiàn)有的源
gem install redis 安裝redis依賴
二 颊糜、使用redis cluster
按照文檔的說(shuō)明步驟來(lái)做就行了哩治,詳情在這http://doc.redisfans.com/topic/cluster-tutorial.html#id5
要讓集群正常運(yùn)作至少需要三個(gè)主節(jié)點(diǎn),因此我們創(chuàng)建6個(gè)節(jié)點(diǎn)衬鱼,三個(gè)主節(jié)點(diǎn)三個(gè)從節(jié)點(diǎn)业筏,詳細(xì)請(qǐng)查看文檔,我簡(jiǎn)化一下文檔的步驟即:
1.創(chuàng)建 6個(gè)文件夾分別為 7000-7005
這里就是做集群時(shí)各個(gè)機(jī)器所安裝的redis鸟赫,在每個(gè)文件夾放一份下載下來(lái)的redis蒜胖,例如
2.創(chuàng)建配置文件 redis.conf
其他幾個(gè)7000-7004文件夾以此類推,注意修改對(duì)應(yīng)的端口號(hào)
bind <ip> 例:192.168.1.202
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
文件中的
cluster-enabled 選項(xiàng)用于開實(shí)例的集群模式抛蚤,
cluster-conf-file 選項(xiàng)則設(shè)定了保存節(jié)點(diǎn)配置文件的路徑台谢, 默認(rèn)值為nodes.conf 。
nodes.conf 節(jié)點(diǎn)配置文件無(wú)須人為修改岁经, 它由 Redis 集群在啟動(dòng)時(shí)創(chuàng)建朋沮, 并在有需要時(shí)自動(dòng)進(jìn)行更新。
3.創(chuàng)建啟動(dòng)腳本7005.bat
這樣不用總是敲命令 ,名字隨意改缀壤,其他幾個(gè)文件夾同理
@echo off
redis-server.exe redis.conf
@pause
4.創(chuàng)建集群
1.按照上面所說(shuō)的配置好各個(gè)實(shí)例樊拓,主要是改端口號(hào),運(yùn)行 7000.bat- 7005.bat腳本啟動(dòng)六個(gè)redis實(shí)例
2.cd到 redis-trib.rb 所在的目錄下運(yùn)行命令
redis-trib.rb create --replicas 1 <ip>:<端口> <ip>:<端口> <ip>:<端口>…
例:redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
打印出配置信息塘慕,現(xiàn)在的master是 7000 7001 7002這三臺(tái)機(jī)筋夏,redis會(huì)對(duì)key 做 CRC16 校驗(yàn)和后分別存儲(chǔ)這三臺(tái)機(jī)上。沒(méi)問(wèn)題就輸入yes
5苍糠、查看配置的集群的信息
查看集群的配置信息可執(zhí)行以下命令:
redis-cli.exe -c -h 127.0.0.1 -p 7003 cluster nodes
連接任意一臺(tái)Redis集群節(jié)點(diǎn)即可叁丧,會(huì)看到以下信息就是成功了:
E:\redis-3.0.501>redis-cli.exe -c -h 127.0.0.1 -p 7002 cluster nodes
aa618ef5e865851d33b71d18eb709766fc18a277 127.0.0.1:7005 slave f673e19b77818c431e61dfb6eb5f3ba321e661c8 0 1468662482348 5 connected
9d9e45376bfc47f816734dadd7f0668f5c713470 127.0.0.1:7003 master - 0 14686624793233 connected 10923-16383
f673e19b77818c431e61dfb6eb5f3ba321e661c8 127.0.0.1:7002 myself,master - 0 0 2 connected 5461-10922
60c544fe2f6e6ea11dfeacd3c778c586bc977b1f 127.0.0.1:7001 master - 0 14686624813441 connected 0-5460
e27dae6b7bac30c7795d3f198ba2324c0c1fa65b 127.0.0.1:7006 slave 9d9e45376bfc47f816734dadd7f0668f5c713470 0 1468662477240 6 connected
773c908e6312b21d938e1185e1cb30dd8b9d9823 127.0.0.1:7004 slave 60c544fe2f6e6ea11dfeacd3c778c586bc977b1f 0 1468662476511 4 connected
6、動(dòng)態(tài)的向集群是添加一個(gè)節(jié)點(diǎn)
redis-trib.rb add-node 127.0.0.1:7008(要添加的節(jié)點(diǎn)) 127.0.0.1:7002(任意一臺(tái)正在運(yùn)行的節(jié)點(diǎn))
3.springMVC集成redis
依賴jar包:
岳瞭,
spring-redis.xml
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="numTestsPerEvictionRun"value="${redis.numTestsPerEvictionRun}"/>
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
<property name="softMinEvictableIdleTimeMillis" value="${redis.softMinEvictableIdleTimeMillis}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" />
<property name="blockWhenExhausted" value="false" />
</bean>
<bean id="redisClient" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="${redis.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.port}"></constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
</bean>
RedisModel實(shí)體類
package com.sinog2c.model.redis;
import java.io.Serializable;
public class RedisModel implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6762060250356126904L;
public static final String OBJECT_KEY = "USER";
private String key;
private Object obj;
private Integer seconds;//過(guò)期時(shí)間(單位:毫秒)
public RedisModel(){}
public RedisModel(String key, Object obj){
this.key = key;
this.obj = obj;
}
public RedisModel(String key, Object obj, Integer seconds){
this.key = key;
this.obj = obj;
this.seconds = seconds;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Integer getSeconds() {
return seconds;
}
public void setSeconds(Integer seconds) {
this.seconds = seconds;
}
public String getObjectKey() {
return OBJECT_KEY;
}
}
Service層
JedisClientService.java
package com.sinog2c.service.api.redis;
import com.sinog2c.model.redis.RedisModel;
public interface JedisClientService {
/**
* 往redis緩存中添加數(shù)據(jù)(Key-Value)
* @param redis
* @return
/
String set(RedisModel redis);
/*
* 往redis緩存中添加數(shù)據(jù)(hash)
* @param redis
* @return
/
long hset(RedisModel redis);
/*
* 從redis緩存中獲取數(shù)據(jù)(Key-Value)
* @param key
* @return
/
Object get(String key);
/*
* 從redis緩存中獲取數(shù)據(jù)(hash)
* @param redis
* @return
/
public Object hget(RedisModel redis);
/*
* 從redis緩存中刪除數(shù)據(jù)
* @param key
* @return
/
long del(String key);
/*
* 從redis緩存中刪除數(shù)據(jù)(hash)
* @param key
* @return
/
long hdel(RedisModel redis);
/*
* 設(shè)置key的過(guò)期時(shí)間
* @param key
* @param second
* @return
/
long expire(String key, int second);
/*
* 確認(rèn)一個(gè)key是否存在
* @param key
* @return
/
Boolean exists(String key);
/*
* 確認(rèn)map中key是否存在
* @param key
* @return
/
Boolean hexists(RedisModel redis);
/*
* 刪除當(dāng)前DB數(shù)據(jù)
* @return
/
String flushDB();
/*
* 清空所以數(shù)據(jù)
* @return
/
String flushAll();
/*
* 對(duì)名稱為key的string增加操作(RedisModel中obj值為long類型)
* @param redis
* @return
/
long incrBy(RedisModel redis);
/*
* 對(duì)名稱為key的string減少操作(RedisModel中obj值為long類型)
* @param redis
* @return
/
long decrBy(RedisModel redis);
/*
* 在名稱為key的list尾添加一個(gè)值為value的元素
* @param redis
* @return
/
long rpush(RedisModel redis);
/*
* 在名稱為key的list頭添加一個(gè)值為value的元素
* @param redis
* @return
/
long lpush(RedisModel redis);
/*
* 查找名稱為key的list的長(zhǎng)度
* @param key
* @return
/
long llen(String key);
/*
* 查找名稱為key的list中start至end之間的元素
* @param key
* @param start
* @param end
* @return
/
Object lrange(String key, long start, long end);
/*
* 截取名稱為key的list
* @param key
* @param start
* @param end
* @return
*/
Object ltrim(String key, long start, long end);
}
單機(jī)版實(shí)現(xiàn)類(如果采用集群版不用此實(shí)現(xiàn)類)
package com.sinog2c.service.impl.redis;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import com.sinog2c.model.redis.RedisModel;
import com.sinog2c.service.api.redis.JedisClientService;
import com.sinog2c.util.common.redis.ObjectsTranscoder;
@Service("jedisClientSingleService")
public class JedisClientSingleServiceImpl implements JedisClientService {
@Autowired
private JedisPool jedisPool;
/**
* 往redis緩存中添加數(shù)據(jù)
*/
@Override
public String set(RedisModel redis) {
Jedis jedis = jedisPool.getResource();
String string = "faile";
try {
if (redis != null) {
String key = redis.getKey();
Integer seconds = redis.getSeconds();
string = jedis.set(key.getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
if (seconds != null) {
jedis.expire(key.getBytes(), seconds);
}
}
} catch (Exception e) {
} finally {
jedis.close();
}
return string;
}
/**
* 往redis緩存中添加數(shù)據(jù)(Hash)
*/
@Override
public long hset(RedisModel redis){
Jedis jedis = jedisPool.getResource();
long flag = 0;
try {
if (redis != null) {
String key = redis.getKey();
Integer seconds = redis.getSeconds();
flag = jedis.hset(redis.getObjectKey().getBytes(),key.getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
if (seconds != null) {
jedis.expire(key.getBytes(), seconds);
}
}
} catch (Exception e) {
} finally {
jedis.close();
}
return flag;
}
/**
* 從redis緩存中獲取數(shù)據(jù)
*/
@Override
public Object get(String key) {
Jedis jedis = jedisPool.getResource();
try {
if(key != null && !"".equals(key)){
byte[] bytes = jedis.get(key.getBytes());
return ObjectsTranscoder.getInstance().deserialize(bytes);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
return null;
}
/**
* 從redis緩存中獲取數(shù)據(jù)(hash)
*/
@Override
public Object hget(RedisModel redis) {
Jedis jedis = jedisPool.getResource();
try {
String key = redis.getKey();
if(key != null && !"".equals(key)){
byte[] bytes = jedis.hget(redis.getObjectKey().getBytes(),key.getBytes());
return ObjectsTranscoder.getInstance().deserialize(bytes);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
return null;
}
/**
* 從redis緩存中刪除數(shù)據(jù)
*/
@Override
public long del(String key) {
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
Long result = jedis.del(key.getBytes());
jedis.close();
return result;
}
return 0;
}
/**
* 從redis緩存中刪除數(shù)據(jù)
*/
@Override
public long hdel(RedisModel redis) {
if(redis != null){
String key = redis.getKey();
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key.getBytes());
jedis.close();
return result;
}
}
return 0;
}
/**
* 設(shè)置key的過(guò)期時(shí)間
*/
@Override
public long expire(String key, int second) {
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key.getBytes(), second);
jedis.close();
return result;
}
return 0;
}
/**
* 對(duì)名稱為key的string增加操作(RedisModel中obj值為long類型)
*/
@Override
public long incrBy(RedisModel redis) {
if(redis != null){
Jedis jedis = jedisPool.getResource();
long result = jedis.incrBy(redis.getKey().getBytes(), Long.parseLong(redis.getObj()+""));
jedis.close();
return result;
}
return 0;
}
/**
* 對(duì)名稱為key的string減少操作(RedisModel中obj值為long類型)
*/
@Override
public long decrBy(RedisModel redis) {
if(redis != null){
Jedis jedis = jedisPool.getResource();
long result = jedis.decrBy(redis.getKey().getBytes(), Long.parseLong(redis.getObj()+""));
jedis.close();
return result;
}
return 0;
}
/**
* 在名稱為key的list尾添加一個(gè)值為value的元素
*/
@Override
public long rpush(RedisModel redis) {
if(redis != null){
Jedis jedis = jedisPool.getResource();
long result = jedis.rpush(redis.getKey().getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
jedis.close();
return result;
}
return 0;
}
/**
* 在名稱為key的list頭添加一個(gè)值為value的元素
*/
@Override
public long lpush(RedisModel redis) {
if(redis != null){
Jedis jedis = jedisPool.getResource();
long result = jedis.lpush(redis.getKey().getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
jedis.close();
return result;
}
return 0;
}
/**
* 查找名稱為key的list的長(zhǎng)度
*/
@Override
public long llen(String key) {
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
long result = jedis.llen(key.getBytes());
jedis.close();
return result;
}
return 0;
}
/**
* 查找名稱為key的list中start至end之間的元素
*/
@Override
public Object lrange(String key, long start, long end) {
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
List<byte[]> list = jedis.lrange(key.getBytes(), start, end);
jedis.close();
return listByteArrayToObject(list);
}
return null;
}
/**
* 截取名稱為key的list
*/
@Override
public Object ltrim(String key, long start, long end) {
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
String result = jedis.ltrim(key.getBytes(), start, end);
jedis.close();
return result;
}
return null;
}
/**
* 確認(rèn)一個(gè)key是否存在
* @param key
* @return
*/
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean flag = jedis.exists(key);
jedis.close();
return flag;
}
/**
* 確認(rèn)map中key是否存在
* @param key
* @return
*/
@Override
public Boolean hexists(RedisModel redis) {
Boolean flag = false;
if(redis != null){
String key = redis.getKey();
if(key != null && !"".equals(key)){
Jedis jedis = jedisPool.getResource();
flag = jedis.hexists(redis.getObjectKey().getBytes(), key.getBytes());
jedis.close();
}
}
return flag;
}
/**
* 刪除當(dāng)前DB數(shù)據(jù)
* @return
*/
@Override
public String flushDB(){
Jedis jedis = jedisPool.getResource();
String result = jedis.flushDB();
jedis.close();
return result;
}
/**
* 清空所以數(shù)據(jù)
* @return
*/
@Override
public String flushAll(){
Jedis jedis = jedisPool.getResource();
String result = jedis.flushAll();
jedis.close();
return result;
}
/**
* 將List<byte[]>轉(zhuǎn)化為L(zhǎng)ist<Object>
* @param list
* @return
*/
private Object listByteArrayToObject(List<byte[]> list){
List<Object> result = new ArrayList<Object>();
if(list != null && list.size() > 0){
for(int i=0; i<list.size(); i++){
result.add(ObjectsTranscoder.getInstance().deserialize(list.get(i)));
}
return result;
} else {
return "";
}
}
}
集群實(shí)現(xiàn)類(單機(jī)版不用此時(shí)實(shí)現(xiàn)類)
package com.sinog2c.service.impl.redis;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import com.sinog2c.model.redis.RedisModel;
import com.sinog2c.service.api.redis.JedisClientService;
import com.sinog2c.util.common.redis.ObjectsTranscoder;
/**
- 類描述:集群版實(shí)現(xiàn)
- @author 許杰
*/
@Service("jedisClientClusterServcie")
public class JedisClientClusterServcieImpl implements JedisClientService {
@Autowired
private JedisCluster jedisCluster;
/**
* 往redis緩存中添加數(shù)據(jù)(Key-Value)
*/
@Override
public String set(RedisModel redis) {
String string = "faile";
try {
if (redis != null) {
String key = redis.getKey();
Integer seconds = redis.getSeconds();
string = jedisCluster.set(key.getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
if (seconds != null) {
jedisCluster.expire(key.getBytes(), seconds);
}
}
} catch (Exception e) {
}
return string;
}
/**
* 往redis緩存中添加數(shù)據(jù)(Hash)
*/
@Override
public long hset(RedisModel redis) {
long log = 0;
try {
if (redis != null) {
String key = redis.getKey();
Integer seconds = redis.getSeconds();
log = jedisCluster.hset(redis.getObjectKey().getBytes(),key.getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
if (seconds != null) {
jedisCluster.expire(key.getBytes(), seconds);
}
}
} catch (Exception e) {
}
return log;
}
/**
* 從redis緩存中獲取數(shù)據(jù)(Key-Value)
*/
@Override
public Object get(String key) {
try {
if(key != null && !"".equals(key)){
byte[] bytes = jedisCluster.get(key.getBytes());
return ObjectsTranscoder.getInstance().deserialize(bytes);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 從redis緩存中獲取數(shù)據(jù)(hash)
*/
@Override
public Object hget(RedisModel redis) {
try {
if(redis != null){
String key = redis.getKey();
if(key != null && !"".equals(key)){
byte[] bytes = jedisCluster.hget(redis.getObjectKey().getBytes(),key.getBytes());
return ObjectsTranscoder.getInstance().deserialize(bytes);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 從redis緩存中刪除數(shù)據(jù)
*/
@Override
public long del(String key) {
if(key != null && !"".equals(key)){
Long result = jedisCluster.del(key.getBytes());
return result;
}
return 0;
}
/**
* 從redis緩存中刪除數(shù)據(jù)(hash)
* @param key
* @return
*/
@Override
public long hdel(RedisModel redis) {
if(redis != null){
String key = redis.getKey();
if(key != null && !"".equals(key)){
Long result = jedisCluster.hdel(redis.getObjectKey().getBytes(), key.getBytes());
return result;
}
}
return 0;
}
/**
* 設(shè)置key的過(guò)期時(shí)間
*/
@Override
public long expire(String key, int second) {
if(key != null && !"".equals(key)){
Long result = jedisCluster.expire(key.getBytes(), second);
return result;
}
return 0;
}
/**
* 確認(rèn)一個(gè)key是否存在
* @param key
* @return
*/
@Override
public Boolean exists(String key) {
Boolean flag = jedisCluster.exists(key);
return flag;
}
/**
* 確認(rèn)map中key是否存在
* @param key
* @return
*/
@Override
public Boolean hexists(RedisModel redis) {
Boolean flag = false;
if(redis != null){
String key = redis.getKey();
if(key != null && !"".equals(key)){
flag = jedisCluster.hexists(redis.getObjectKey().getBytes(), key.getBytes());
}
}
return flag;
}
/**
* 刪除當(dāng)前DB數(shù)據(jù)
* @return
*/
@SuppressWarnings("deprecation")
@Override
public String flushDB(){
String result = jedisCluster.flushDB();
return result;
}
/**
* 清空所以數(shù)據(jù)
* @return
*/
@SuppressWarnings("deprecation")
@Override
public String flushAll(){
String result = jedisCluster.flushAll();
return result;
}
/**
* 對(duì)名稱為key的string增加操作(RedisModel中obj值為long類型)
*/
@Override
public long incrBy(RedisModel redis) {
if(redis != null){
long result = jedisCluster.incrBy(redis.getKey().getBytes(), Long.parseLong(redis.getObj()+""));
return result;
}
return 0;
}
/**
* 對(duì)名稱為key的string減少操作(RedisModel中obj值為long類型)
*/
@Override
public long decrBy(RedisModel redis) {
if(redis != null){
long result = jedisCluster.decrBy(redis.getKey().getBytes(), Long.parseLong(redis.getObj()+""));
return result;
}
return 0;
}
/**
* 在名稱為key的list尾添加一個(gè)值為value的元素
*/
@Override
public long rpush(RedisModel redis) {
if(redis != null){
long result = jedisCluster.rpush(redis.getKey().getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
return result;
}
return 0;
}
/**
* 在名稱為key的list頭添加一個(gè)值為value的元素
*/
@Override
public long lpush(RedisModel redis) {
if(redis != null){
long result = jedisCluster.lpush(redis.getKey().getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
return result;
}
return 0;
}
/**
* 查找名稱為key的list的長(zhǎng)度
*/
@Override
public long llen(String key) {
if(key != null && !"".equals(key)){
long result = jedisCluster.llen(key.getBytes());
return result;
}
return 0;
}
/**
* 查找名稱為key的list中start至end之間的元素
*/
@Override
public Object lrange(String key, long start, long end) {
if(key != null && !"".equals(key)){
List<byte[]> list = jedisCluster.lrange(key.getBytes(), start, end);
return listByteArrayToObject(list);
}
return null;
}
/**
* 截取名稱為key的list
*/
@Override
public Object ltrim(String key, long start, long end) {
if(key != null && !"".equals(key)){
String result = jedisCluster.ltrim(key.getBytes(), start, end);
return result;
}
return null;
}
/**
* 將List<byte[]>轉(zhuǎn)化為L(zhǎng)ist<Object>
* @param list
* @return
*/
private Object listByteArrayToObject(List<byte[]> list){
List<Object> result = new ArrayList<Object>();
if(list != null && list.size() > 0){
for(int i=0; i<list.size(); i++){
result.add(ObjectsTranscoder.getInstance().deserialize(list.get(i)));
}
return result;
} else {
return "";
}
}
}
ObjectsTranscoder類(將對(duì)象序列化反序列化)
package com.sinog2c.util.common.redis;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
將對(duì)象序列化拥娄,反序列化
@author 許杰
-
@param <M> 對(duì)象
*/
public class ObjectsTranscoder<M extends Serializable> extends SerializeTranscoder {private ObjectsTranscoder(){}
private static ObjectsTranscoder single=null;
//靜態(tài)工廠方法
public static ObjectsTranscoder getInstance() {
if (single == null) {
single = new ObjectsTranscoder();
}
return single;
}public byte[] serialize(Object value) {
if (value == null) {
throw new NullPointerException("Can't serialize null");
}
byte[] result = null;
ByteArrayOutputStream bos = null;
ObjectOutputStream os = null;
try {
bos = new ByteArrayOutputStream();
os = new ObjectOutputStream(bos);
M m = (M) value;
os.writeObject(m);
os.close();
bos.close();
result = bos.toByteArray();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object", e);
} finally {
close(os);
close(bos);
}
return result;
}public M deserialize(byte[] in) {
M result = null;
ByteArrayInputStream bis = null;
ObjectInputStream is = null;
try {
if (in != null) {
bis = new ByteArrayInputStream(in);
is = new ObjectInputStream(bis);
result = (M) is.readObject();
is.close();
bis.close();
}
} catch (IOException e) {} catch (ClassNotFoundException e) { } finally { close(is); close(bis); } return result;
}
}
SerializeTranscoder類
package com.sinog2c.util.common.redis;
import java.io.Closeable;
import org.apache.log4j.Logger;
public abstract class SerializeTranscoder {
protected static Logger logger = Logger.getLogger(SerializeTranscoder.class);
public abstract byte[] serialize(Object value);
public abstract Object deserialize(byte[] in);
public void close(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (Exception e) {
logger.info("Unable to close " + closeable, e);
}
}
}
}