redis的安裝和使用

Redis
Redis命令參考網(wǎng)址:http://doc.redisfans.com/

  1. Redis 簡(jiǎn)介
    Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議泛源,是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)仔燕。
    Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
  1. Redis支持?jǐn)?shù)據(jù)的持久化舒帮,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中蒙袍,重啟的時(shí)候可以再次加載進(jìn)行使用其兴。
  2. Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù)骚烧,同時(shí)還提供list浸赫,set,zset赃绊,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)掺炭。
  3. 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涉枫。
圖片.png

下載解壓,在解壓后的目錄下有以下這些文件

圖片.png

打開一個(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ì)顯示如下界面:

圖片.png

這時(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

圖片.png

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)境變量

圖片.png

安裝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.orghttp://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蒜胖,例如

圖片.png

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

圖片.png

打印出配置信息塘慕,現(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包:

圖片.png

岳瞭,
圖片.png

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>

圖片.png

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); 
        }
    }
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瞳筏,隨后出現(xiàn)的幾起案子稚瘾,更是在濱河造成了極大的恐慌,老刑警劉巖姚炕,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊欠,死亡現(xiàn)場(chǎng)離奇詭異滓窍,居然都是意外死亡奏窑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門狞谱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掸刊,“玉大人免糕,你說(shuō)我怎么就攤上這事∮遣啵” “怎么了石窑?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚓炬。 經(jīng)常有香客問(wèn)我松逊,道長(zhǎng),這世上最難降的妖魔是什么肯夏? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任经宏,我火速辦了婚禮,結(jié)果婚禮上驯击,老公的妹妹穿的比我還像新娘烁兰。我一直安慰自己,他們只是感情好余耽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布缚柏。 她就那樣靜靜地躺著,像睡著了一般碟贾。 火紅的嫁衣襯著肌膚如雪币喧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天袱耽,我揣著相機(jī)與錄音杀餐,去河邊找鬼。 笑死朱巨,一個(gè)胖子當(dāng)著我的面吹牛史翘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琼讽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼必峰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起钻蹬,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吼蚁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后问欠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肝匆,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年顺献,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旗国。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡注整,死狀恐怖能曾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情设捐,我是刑警寧澤借浊,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站萝招,受9級(jí)特大地震影響蚂斤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜槐沼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一曙蒸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岗钩,春花似錦纽窟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至视搏,卻和暖如春审孽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浑娜。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工佑力, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筋遭。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓打颤,卻偏偏與公主長(zhǎng)得像暴拄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子编饺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理乖篷,服務(wù)發(fā)現(xiàn),斷路器反肋,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)石蔗、高可擴(kuò)展、高可用畅形、大數(shù)據(jù)存儲(chǔ)問(wèn)題而產(chǎn)生的數(shù)據(jù)庫(kù)解決方...
    克魯?shù)吕?/span>閱讀 5,295評(píng)論 0 36
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法养距,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法日熬,繼承相關(guān)的語(yǔ)法棍厌,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,639評(píng)論 18 399
  • 說(shuō)明本次redis集群安裝在rhel6.8 64位機(jī)器上竖席,redis版本為3.2.8耘纱,redis的gem文件版本為...
    讀或?qū)?/span>閱讀 14,742評(píng)論 3 9
  • 素記## 超級(jí)中國(guó)風(fēng)素雅的一款,從icon就可以感覺出來(lái)毕荐∈觯↓ 整個(gè)app都很素雅,默認(rèn)字體憎亚,備選信紙员寇,甚至連信紙顏...
    South_Lin閱讀 29,667評(píng)論 5 5