1. 程式人生 > >《商城專案04》--Redis快取的應用

《商城專案04》--Redis快取的應用

一, redis的下載安裝配置

1, 下載

貼個連結供參考使用:  redis-3.0.0.tar.gz

2, 安裝

<前提是有已安裝Linux虛擬機器可使用>

2.1  安裝gcc編譯器

      yum install gcc-c++

2.2  解壓redis

      tar -zxvf redis-3.0.0.tar.gz

2.3  編譯

       cd redis-3.0.0   -->  make指令 進行編譯!

2.4  安裝

      make install PREFIX=/usr/local/redis

3, 啟動redis服務

3.1 前端啟動

      cd /usr/local/redis/bin/   --> ./redis-server

3.2 後端啟動

   修改配置檔案

cd /usr/local/redis/bin/redis.conf (從安裝目錄usr/redis/redis-3.0.0/redis.conf複製過來)

 --> (daemonize對應的no改成yes)

 --> 指令    ./redis-server redis.conf(後臺啟動)

3.3  檢視是否啟動

ps aux|grep redis

root       9389  0.1  0.7 140848  7452 ?        Ssl  16:00   0:00 ./redis-server *:6379

root       9429  0.0  0.0 112676   968 pts/0    R+   16:01   0:00 grep --color=auto redis

3.4  關閉服務

      3.4.1  Kill  9389  <程序號, 不是埠號>

      3.4.2   ./redis-cli  shutdown  <通過客戶端關閉>

3.5  啟動redis客戶端, 連線服務

      ./redis-cli -h 192.168.25.133 -p 6379

二, redis的常用語法

1, 先進入redis

1.1   先進入bin目錄  cd /usr/local/redis/bin/ 

1.2  然後啟動客戶端 ./redis-cli

1.3   測試是否啟動成功 

       輸入指令ping,  若響應PONG則表示啟動成功,可以進行相關命令操作;

2, 五種資料型別

2.1 String型別

set str1 abc   -->宣告一字串str1 值為abc

get str1          -->取出變數str1

Keys  *           -->取出所有的key值

Incr  key1       -->給變數key1 +1

Decr key1      -->給變數key1 -1

Del  key2       -->刪除變數key2

2.2 hash型別

hset hash1 filed1 1  -->給hash1裡的filed1賦值為1

hget hash1 filed1     -->取出hash1裡的filed1

hkeys hash1             -->查詢hash1裡的所有key值

hvals hash1           -->查詢hash1裡的所有value值

hgetall hash1       -->查詢hash1裡的所有key-value;

kdel hash1 filed1     --> 刪除hash1裡的filed1;

2.3 List型別<有序可重複>

lpush list1 a b c d  -->從左新增元素

lrange list1 0 -1  -->從左查詢所有資料

rpush list1 1 2 3 4   -->從右...

lrange list1 0 -1       -->從右查詢所有資料

Lpop list1   取左起第一個元素

Rpop list1   取右起第一個元素

2.4 Set型別<無序不可重複>

2.5 SortedSet型別<有序不可重複>

## 資料設定過期時間, 以及資料持久化處理

Expire key second:設定key的過期時間

Ttl key:檢視key的有效期

Persist key:清除key的過期時間。Key持久化。

3, redis叢集的搭建

    略繁瑣, 此處省略300字

三, redis在java專案中的實際應用

1, 寫測試類簡單測下

1.1 導包, pom.xml中新增依賴

    <!-- Redis客戶端 -->
	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
	</dependency>

1.2 寫測試方法

    @Test
	public void testJedis() throws Exception {
		// 第一步:建立一個Jedis物件。需要指定服務端的ip及埠。
		Jedis jedis = new Jedis("192.168.25.133", 6379);
		//Jedis jedis = new Jedis("192.168.1.103", 8082);
		// 第二步:使用Jedis物件操作資料庫,每個redis命令對應一個方法。
		jedis.set("hello", "this is shanghai!");
		String result = jedis.get("hello");
		// 第三步:列印結果。
		System.out.println(result);
		// 第四步:關閉Jedis
		jedis.close();
	}

執行能正常打印出結果, 則ok

1.3 在專案中的實際應用

1.3.1 配置Spring-redis.xml

1.3.2  呼叫對應的redis-Bean

呼叫邏輯大概就是:

第一步: 注入JedisClient

第二步: 根據key查redis中是否存有對應的value值, 存在即返回, 不存在再去查詢資料庫, 這裡起到緩解資料庫壓力的作用, 一般需要將經常被訪問的一些資料同步到redis快取中。

下面是封裝的redis相關呼叫類

public interface JedisClient {

	String set(String key, String value);
	String get(String key);
	Boolean exists(String key);
	Long expire(String key, int seconds);
	Long ttl(String key);
	Long incr(String key);
	Long hset(String key, String field, String value);
	String hget(String key, String field);
	Long hdel(String key, String... field);
	
	Boolean hexists(String key, String field);
	List<String> hvals(String key);
	Long del(String key);
}
public class JedisClientPool implements JedisClient {
	
	@Autowired
	private JedisPool jedisPool;
	
	//構建bean額外新增的;  by xiangyoulu 2018/3/18 ;
//	public JedisClientPool(JedisPool jedisPool) {
//		this.jedisPool=jedisPool;
//	}

	@Override
	public String set(String key, String value) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.set(key, value);
		jedis.close();
		return result;
	}

	@Override
	public String get(String key) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.get(key);
		jedis.close();
		return result;
	}

	@Override
	public Boolean exists(String key) {
		Jedis jedis = jedisPool.getResource();
		Boolean result = jedis.exists(key);
		jedis.close();
		return result;
	}

	@Override
	public Long expire(String key, int seconds) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.expire(key, seconds);
		jedis.close();
		return result;
	}

	@Override
	public Long ttl(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.ttl(key);
		jedis.close();
		return result;
	}

	@Override
	public Long incr(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.incr(key);
		jedis.close();
		return result;
	}

	@Override
	public Long hset(String key, String field, String value) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.hset(key, field, value);
		jedis.close();
		return result;
	}

	@Override
	public String hget(String key, String field) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.hget(key, field);
		jedis.close();
		return result;
	}

	@Override
	public Long hdel(String key, String... field) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.hdel(key, field);
		jedis.close();
		return result;
	}
	
	
	@Override
	public Boolean hexists(String key, String field) {
		Jedis jedis = jedisPool.getResource();
		Boolean result = jedis.hexists(key, field);
		jedis.close();
		return result;
	}

	@Override
	public List<String> hvals(String key) {
		Jedis jedis = jedisPool.getResource();
		List<String> result = jedis.hvals(key);
		jedis.close();
		return result;
	}

	@Override
	public Long del(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.del(key);
		jedis.close();
		return result;
	}

}
public class JedisClientCluster implements JedisClient {
	
	@Autowired
	private JedisCluster jedisCluster;

	@Override
	public String set(String key, String value) {
		return jedisCluster.set(key, value);
	}

	@Override
	public String get(String key) {
		return jedisCluster.get(key);
	}

	@Override
	public Boolean exists(String key) {
		return jedisCluster.exists(key);
	}

	@Override
	public Long expire(String key, int seconds) {
		return jedisCluster.expire(key, seconds);
	}

	@Override
	public Long ttl(String key) {
		return jedisCluster.ttl(key);
	}

	@Override
	public Long incr(String key) {
		return jedisCluster.incr(key);
	}

	@Override
	public Long hset(String key, String field, String value) {
		return jedisCluster.hset(key, field, value);
	}

	@Override
	public String hget(String key, String field) {
		return jedisCluster.hget(key, field);
	}

	@Override
	public Long hdel(String key, String... field) {
		return jedisCluster.hdel(key, field);
	}
	
	
	
	@Override
	public Boolean hexists(String key, String field) {
		return jedisCluster.hexists(key, field);
	}

	@Override
	public List<String> hvals(String key) {
		return jedisCluster.hvals(key);
	}

	@Override
	public Long del(String key) {
		return jedisCluster.del(key);
	}

}

ok, 是有點略繁瑣。。。