1. 程式人生 > >Redis實戰之徵服 Redis + Jedis + Spring (三)

Redis實戰之徵服 Redis + Jedis + Spring (三)

一開始以為Spring下操作雜湊表,列表,真就是那麼土。恍惚間發現“stringRedisTemplate.opsForList()”的強大,抓緊時間惡補下。

通過spring-data-redis完成LINDEX, LLEN, LPOP, LPUSH, LRANGE, LREM, LSET, LTRIM, RPOP, RPUSH命令。其實還有一些命令,當前版本不支援。皺眉不過,這些List的操作方法可以實現佇列,堆疊的正常操作,足夠用了。

相關連結:

為了簡便操作,我使用了StringRedisTemplate。用字串操作做展示。當然,你可以繼續使用RedisTemplate。

閒言少敘,上程式碼,一目瞭然:

Java程式碼  
  1. /** 
  2.  * Mar 5, 2013 
  3.  */
  4. package org.zlex.redis.support;  
  5. import java.util.List;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.data.redis.core.StringRedisTemplate;  
  8. import org.springframework.stereotype.Component;  
  9. /** 
  10.  *  
  11.  * @author snowolf 
  12.  * @version 1.0
     
  13.  * @since 1.0 
  14.  */
  15. @Component("listOps")  
  16. publicclass ListOps {  
  17.     @Autowired
  18.     private StringRedisTemplate stringRedisTemplate;  
  19.     /** 
  20.      * 壓棧 
  21.      *  
  22.      * @param key 
  23.      * @param value 
  24.      * @return 
  25.      */
  26.     public Long push(String key, String value) {  
  27.         return stringRedisTemplate.opsForList().leftPush(key, value);  
  28.     }  
  29.     /** 
  30.      * 出棧 
  31.      *  
  32.      * @param key 
  33.      * @return 
  34.      */
  35.     public String pop(String key) {  
  36.         return stringRedisTemplate.opsForList().leftPop(key);  
  37.     }  
  38.     /** 
  39.      * 入隊 
  40.      *  
  41.      * @param key 
  42.      * @param value 
  43.      * @return 
  44.      */
  45.     public Long in(String key, String value) {  
  46.         return stringRedisTemplate.opsForList().rightPush(key, value);  
  47.     }  
  48.     /** 
  49.      * 出隊 
  50.      *  
  51.      * @param key 
  52.      * @return 
  53.      */
  54.     public String out(String key) {  
  55.         return stringRedisTemplate.opsForList().leftPop(key);  
  56.     }  
  57.     /** 
  58.      * 棧/佇列長 
  59.      *  
  60.      * @param key 
  61.      * @return 
  62.      */
  63.     public Long length(String key) {  
  64.         return stringRedisTemplate.opsForList().size(key);  
  65.     }  
  66.     /** 
  67.      * 範圍檢索 
  68.      *  
  69.      * @param key 
  70.      * @param start 
  71.      * @param end 
  72.      * @return 
  73.      */
  74.     public List<String> range(String key, int start, int end) {  
  75.         return stringRedisTemplate.opsForList().range(key, start, end);  
  76.     }  
  77.     /** 
  78.      * 移除 
  79.      *  
  80.      * @param key 
  81.      * @param i 
  82.      * @param value 
  83.      */
  84.     publicvoid remove(String key, long i, String value) {  
  85.         stringRedisTemplate.opsForList().remove(key, i, value);  
  86.     }  
  87.     /** 
  88.      * 檢索 
  89.      *  
  90.      * @param key 
  91.      * @param index 
  92.      * @return 
  93.      */
  94.     public String index(String key, long index) {  
  95.         return stringRedisTemplate.opsForList().index(key, index);  
  96.     }  
  97.     /** 
  98.      * 置值 
  99.      *  
  100.      * @param key 
  101.      * @param index 
  102.      * @param value 
  103.      */
  104.     publicvoid set(String key, long index, String value) {  
  105.         stringRedisTemplate.opsForList().set(key, index, value);  
  106.     }  
  107.     /** 
  108.      * 裁剪 
  109.      *  
  110.      * @param key 
  111.      * @param start 
  112.      * @param end 
  113.      */
  114.     publicvoid trim(String key, long start, int end) {  
  115.         stringRedisTemplate.opsForList().trim(key, start, end);  
  116.     }  
  117. }  
/**
 * Mar 5, 2013
 */
package org.zlex.redis.support;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 
 * @author snowolf
 * @version 1.0
 * @since 1.0
 */
@Component("listOps")
public class ListOps {

	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	/**
	 * 壓棧
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public Long push(String key, String value) {
		return stringRedisTemplate.opsForList().leftPush(key, value);
	}

	/**
	 * 出棧
	 * 
	 * @param key
	 * @return
	 */
	public String pop(String key) {
		return stringRedisTemplate.opsForList().leftPop(key);
	}

	/**
	 * 入隊
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public Long in(String key, String value) {
		return stringRedisTemplate.opsForList().rightPush(key, value);
	}

	/**
	 * 出隊
	 * 
	 * @param key
	 * @return
	 */
	public String out(String key) {
		return stringRedisTemplate.opsForList().leftPop(key);
	}

	/**
	 * 棧/佇列長
	 * 
	 * @param key
	 * @return
	 */
	public Long length(String key) {
		return stringRedisTemplate.opsForList().size(key);
	}

	/**
	 * 範圍檢索
	 * 
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<String> range(String key, int start, int end) {
		return stringRedisTemplate.opsForList().range(key, start, end);
	}

	/**
	 * 移除
	 * 
	 * @param key
	 * @param i
	 * @param value
	 */
	public void remove(String key, long i, String value) {
		stringRedisTemplate.opsForList().remove(key, i, value);
	}

	/**
	 * 檢索
	 * 
	 * @param key
	 * @param index
	 * @return
	 */
	public String index(String key, long index) {
		return stringRedisTemplate.opsForList().index(key, index);
	}

	/**
	 * 置值
	 * 
	 * @param key
	 * @param index
	 * @param value
	 */
	public void set(String key, long index, String value) {
		stringRedisTemplate.opsForList().set(key, index, value);
	}

	/**
	 * 裁剪
	 * 
	 * @param key
	 * @param start
	 * @param end
	 */
	public void trim(String key, long start, int end) {
		stringRedisTemplate.opsForList().trim(key, start, end);
	}
}

這裡說明下,例如LPUSH,RPUSH,其實就是從左邊壓棧,還是從右邊壓棧的不同命令。可以把堆疊看作是一個從左至右的陣列。如果左邊壓棧,右邊出棧,那就是佇列的入隊/出隊操作;如果左邊壓棧,左邊出棧,那就是堆疊操作。

舉個具體的例子:

佇列操作:LPUSH入隊,RPOP出隊,同理,可把L|R替換。

堆疊操作:LPUSH壓棧,LPOP出棧,同理,可把L|R替換。

下面進行測試用例,初始、結束時,分別做入隊、出隊操作,期間進行堆疊,佇列操作。不用我細說了,看測試用例,很簡單!

Java程式碼  
  1. /** 
  2.  * Mar 5, 2013 
  3.  */
  4. package org.zlex.redis;  
  5. importstatic org.junit.Assert.*;  
  6. import java.util.List;  
  7. import org.junit.Before;  
  8. import org.junit.After;  
  9. import org.junit.Test;  
  10. import org.springframework.context.ApplicationContext;  
  11. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  12. import org.zlex.redis.support.ListOps;  
  13. /** 
  14.  *  
  15.  * @author snowolf 
  16.  * @version 1.0 
  17.  * @since 1.0 
  18.  */
  19. publicclass ListOpsTest {  
  20.     private ApplicationContext app;  
  21.     private ListOps listOps;  
  22.     private String key = "queue";  
  23.     @Before
  24.     publicvoid before() throws Exception {  
  25.         app = new ClassPathXmlApplicationContext("applicationContext.xml");  
  26.         listOps = (ListOps) app.getBean("listOps");  
  27.         System.out.println("------------IN---------------");  
  28.         for (int i = 0; i < 5; i++) {  
  29.             String uid = "u" + i;  
  30.             System.out.println(uid);  
  31.             listOps.in(key, uid);  
  32.         }  
  33.     }  
  34.     @After
  35.     publicvoid after() {  
  36.         // ------------OUT---------------
  37.         System.out.println("------------OUT---------------");  
  38.         long length = listOps.length(key);  
  39.         for (long i = 0; i < length; i++) {  
  40.             String uid = listOps.out(key);  
  41.             System.out.println(uid);  
  42.         }  
  43.     }  
  44.     @Test
  45.     publicvoid stack() {  
  46.         // ------------PUSH---------------
  47.         String key = "stack";  
  48.         int len = 5;  
  49.         System.out.println("------------PUSH---------------");  
  50.         for (int i = 0; i < len; i++) {  
  51.             String uid = "u" + System.currentTimeMillis();  
  52.             System.out.println(uid);  
  53.             listOps.push(key, uid);  
  54.         }  
  55.         long length = listOps.length(key);  
  56.         assertEquals(len, length);  
  57.         // ------------POP---------------
  58.         System.out.println("------------POP---------------");  
  59.         for (long i = 0; i < length; i++) {  
  60.             String uid = listOps.pop(key);  
  61.             System.out.println(uid);  
  62.         }  
  63.     }  
  64.     @Test
  65.     publicvoid index() {  
  66.         // -------------INDEX-------------
  67.         String value = listOps.index(key, 3);  
  68.         assertEquals("u3", value);  
  69.     }  
  70.     @Test
  71.     publicvoid range() {  
  72.         // -------------RANGE-------------
  73.         List<String> list = listOps.range(key, 35);  
  74.         boolean result1 = list.contains("u3");  
  75.         assertEquals(true, result1);  
  76.         boolean result2 = list.contains("u1");  
  77.         assertEquals(false, result2);  
  78.     }  
  79.     @Test
  80.     publicvoid trim() {  
  81.         // ------------TRIM---------------
  82.         List<String> list = listOps.range(key, 35);  
  83.         listOps.trim(key, 35);  
  84.         boolean result3 = list.contains("u1");  
  85.         assertEquals(false, result3);  
  86.     }  
  87.     @Test
  88.     publicvoid set() {  
  89.         // ------------SET-----------------
  90.         List<String> list = listOps.range(key, 35);  
  91.         listOps.set(key, 4"ux4");  
  92.         boolean result4 = list.contains("u4");  
  93.         assertEquals(true, result4);  
  94.     }  
  95.     @Test
  96.     publicvoid remove() {  
  97.         // ------------REMOVE-----------------
  98.         listOps.remove(key, 4"u4");  
  99.         String value = listOps.index(key, 4);  
  100.         assertEquals(null, value);  
  101.     }  
  102. }  
/**
 * Mar 5, 2013
 */
package org.zlex.redis;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Before;
import org.junit.After;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.zlex.redis.support.ListOps;

/**
 * 
 * @author snowolf
 * @version 1.0
 * @since 1.0
 */
public class ListOpsTest {
	private ApplicationContext app;
	private ListOps listOps;
	private String key = "queue";

	@Before
	public void before() throws Exception {
		app = new ClassPathXmlApplicationContext("applicationContext.xml");
		listOps = (ListOps) app.getBean("listOps");

		System.out.println("------------IN---------------");
		for (int i = 0; i < 5; i++) {
			String uid = "u" + i;
			System.out.println(uid);
			listOps.in(key, uid);
		}
	}

	@After
	public void after() {
		// ------------OUT---------------
		System.out.println("------------OUT---------------");
		long length = listOps.length(key);
		for (long i = 0; i < length; i++) {
			String uid = listOps.out(key);
			System.out.println(uid);
		}
	}

	@Test
	public void stack() {
		// ------------PUSH---------------
		String key = "stack";
		int len = 5;
		System.out.println("------------PUSH---------------");
		for (int i = 0; i < len; i++) {
			String uid = "u" + System.currentTimeMillis();
			System.out.println(uid);
			listOps.push(key, uid);
		}

		long length = listOps.length(key);
		assertEquals(len, length);

		// ------------POP---------------
		System.out.println("------------POP---------------");
		for (long i = 0; i < length; i++) {
			String uid = listOps.pop(key);
			System.out.println(uid);
		}
	}

	@Test
	public void index() {

		// -------------INDEX-------------
		String value = listOps.index(key, 3);
		assertEquals("u3", value);
	}

	@Test
	public void range() {
		// -------------RANGE-------------
		List<String> list = listOps.range(key, 3, 5);
		boolean result1 = list.contains("u3");
		assertEquals(true, result1);

		boolean result2 = list.contains("u1");
		assertEquals(false, result2);
	}

	@Test
	public void trim() {
		// ------------TRIM---------------
		List<String> list = listOps.range(key, 3, 5);
		listOps.trim(key, 3, 5);
		boolean result3 = list.contains("u1");
		assertEquals(false, result3);
	}

	@Test
	public void set() {
		// ------------SET-----------------
		List<String> list = listOps.range(key, 3, 5);
		listOps.set(key, 4, "ux4");
		boolean result4 = list.contains("u4");
		assertEquals(true, result4);

	}

	@Test
	public void remove() {
		// ------------REMOVE-----------------
		listOps.remove(key, 4, "u4");
		String value = listOps.index(key, 4);
		assertEquals(null, value);

	}
}

回頭繼續整理,這個套路沒錯!

相關連結: