spring redis入門,springredis
1. 虛擬機器上安裝redis服務
下載tar包,wget http://download.redis.io/releases/redis-2.8.19.tar.gz。
解壓縮,tar -zxvf redis-2.8.19.tar.gz
進到檔案夾,cd redis-2.8.19/,編譯一下,make
建立空檔案夾用於存放redis程式,mkdir /usr/local/redis
把編譯後的產物依次複製到redis檔案夾下
1) 編譯後src檔案夾下
紅色部分檔案都分別複製過去
cp redis-benchmark /usr/local/redis
cp redis-cli /usr/local/redis
cp redis-server /usr/local/redis
2) 編譯後主資料夾下
cp redis.conf /usr/local/redis
乾坤大挪移施展好後,讓我們看看redis程式的檔案夾是什麼樣子的吧。
cd /usr/local/redis
OK,萬事俱備,只欠startup了,now 讓我們輕輕的輸入啟動命令:
./redis-server ./redis.conf
想在後台運行?覺得命令太煩不爽?想設定成開機自啟動?那就nohup...&一下,把命令加入到path中,再把它寫入到rc.local裡面吧。
自己百度吧,這裡就不詳述了。
剛才我們是用預設的方式啟動伺服器端的,預設的hostName是localhost,port是6379,你也可以編輯redis.conf改變他們。
好了,redis服務端啟動後讓我們使用用戶端串連下。輸入redis-cli 即可(預設是串連到localhost的6379連接埠)
這裡keys *命令的意思是查看redis資料庫裡目前有哪些內容。
我們可以簡單的輸入幾個redis命令來測試一下。
更多命令,敬請訪問,三達不溜點度娘點康姆。這裡就不細說了。
註:第二部分java是在windows耍的,而要訪問linux主機上的redis,還需要“走後門”,你需要做的是在iptables配置裡面添加6379為防火牆例外連接埠,並重啟一下iptables服務即可。
vi /etc/sysconf/iptables
加點佐料
service iptables restart
2. 訪問redis的java程式的編寫
這裡我們就直接寫測試案例吧,直接用spring+junit就行了,做到簡潔大方就行,鋪張浪費可恥啊。
maven兄,出來耍耍吧。
項目的結構就是醬紫的。下面詳述一下各個檔案裡面的內容吧。
1) pom.xml
作為保姆maven的專屬地區,裡面定義了要用到的包,要用到的是spring(包括core、context),junit,jedis和spring-data-redis。spring-data-redis是spring在jedis的基礎上再次進行了封裝,讓我們用起來更爽。
就直接上依賴包的代碼吧。
<dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.1.0</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.1.2.RELEASE</version> </dependency> <!-- spring data redis --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.1.1.RELEASE</version> </dependency> </dependencies>
不多說,保姆趕緊幹活去。 (Maven童鞋:T_T 你這頻寬讓我很無語)
2) spring-redis.xml
spring的xml,裡面當然是配置bean的嘍。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:property-placeholder location="classpath:redis.properties" /> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${hostName}" /> <property name="port" value="${port}" /> <property name="database" value="${index}" /> </bean> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> </bean></beans>
這裡用到了一個小技巧,一些基礎的配置資訊我可能不想要寫到xml裡面,為毛呢,因為在linux下面用vi編輯格式會亂,有點小潔癖的我更願意去編輯properties檔案,key=value的形式更容易編輯,格式也不會紊亂。
那嗎?就用property placeholder吧,配置起來超簡單,要用某個key的時候只需要${key}這樣寫就可以了。
這裡我們需要定義兩個spring-data-redis為我們封裝好的對象,一個是JedisConnectionFactory,是不是有點串連池之類的味道了,典型的原廠模式,從connection factory裡面可以拿到redis的連線物件,然後用這個connection對象YY一下,然後可能LOL。。。;另外一個是StringRedisTemplate對象,又有點JdbcTemplate的味道了,典型的模板方法模式,通過這個template對象我們就可以進行CRUD了,只不過JdbcTemplate是針對關係型資料庫的,而這個RedisTemplate是針對redis非關係型資料庫的。
注意點:這裡的redisTemplate我們不是用的基類RedisTemplate的對象(可能有些教程文章就用它,如果你的redis裡已經有了字串作為key/value的資料,那麼小心出錯),而是其子類StringRedisTemplate。在redis裡面進行CRUD時,用的最多的就是String,例如字串作為key、作為value、作為hashmap的key或value,而基類RedisTemplate預設的序列化/還原序列化操作(它使用的是JdkSerializationRedisSerializer類)不是針對字串的,更確切的來說,RedisTemplate類裡面的序列化/還原序列化工具對字串/位元組數組進行處理後的結果不是我們想要的結果。子類StringRedisTemplate裡面的序列化/還原序列化工具是StringRedisSerializer類的執行個體,該類是我們想要的,因此這邊我們用了StringRedisTemplate的執行個體。有興趣的童鞋可以試一下,如果使用的是RedisTemplate類的執行個體,對redis進行寫操作的時候,寫入的會是什麼樣的資料。
3) redis.properties
存放redis的配置資訊。在第二點裡也說了,具體的redis的伺服器端配置資訊,我們寫在這個檔案裡。
hostName=192.168.1.225port=6379index=0
就跟mysql等資料庫一樣,一個redis服務上也能有多個資料庫,redis預設串連的是0號庫,預設有16個資料庫,這裡的配置index是指幾號資料庫,範圍0~15,如果你想擴大容量,請自行修改redis.conf。
4) RedisTest.java
終於輪到豬腳登場了。咱們先看代碼吧。
package code.selwyn.spring.redis.demo.test;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;/** * Class RedisTest * 耍耍redis * * @author Selwyn * Date: Mar 28, 2015 7:15:57 PM */public class RedisTest { /*** * spring設定檔 */ private final static String[] CONFIG_LOC = { "spring-redis.xml" }; private ApplicationContext appContext = null; private ApplicationContext getAppContext() { return new ClassPathXmlApplicationContext(CONFIG_LOC); } @Before public void setUp() { //讀取spring設定檔,載入到spring上下文 this.appContext = this.getAppContext(); } /*** * 測試redis單值讀取與寫入 */ @Test public void testRedisValueOperation() { RedisTemplate template = (RedisTemplate) this.appContext.getBean("redisTemplate"); //單值操作的對象,通過該對象直接可以對redis進行CRUD(單值操作) ValueOperations<String, String> valueOper = template.opsForValue(); String key = "cat"; String valueExpected = "tom"; String value = valueOper.get(key); Assert.assertNotNull(value); Assert.assertEquals("The cat is not Tom!!!", valueExpected, value); System.out.println(String.format("%s->%s",key,value)); String newValue = "hello kitty"; //設定新值 valueOper.set(key, newValue); System.out.println("After changing..."); System.out.println(String.format("%s->%s",key,valueOper.get(key))); }}
作為一個Test類,針對的是一個功能類的測試,裡面會有多個測試案例,而每個測試案例都可能會在開始前進行配置,測試跑完後會進行收尾工作(比如中斷連線啊什麼的),junit提供了兩個annotation給我們,一個是@Before,一個是@After。對於單個測試方法(以@Test標識),它的執行順序是@Before指定方法->@Test指定的方法->@After指定的方法。當然如果這個Test類裡面的所有測試案例載入的配置都一樣,結束後又都進行相同的收尾操作,那麼我們可以用另外兩個annotation,@BeforeClass和@AfterClass,我們現在就只有一個測試案例,就按常規來吧。
對於這個測試方法的前置工作,當然是讓spring幫我們蓋一間豪華別墅(context),產生兩個傭人(bean)。然後在測試代碼裡面我們要做的就是指揮那個勤勞的傭人進行工作。一切都是那麼的河蟹。
通過ClassPathXmlApplicationContext的構造方法,傳遞一個spring xml檔案名稱數組給它,spring看到這個數組就開始初始化上下文,產生jedisConnectionFactory對象和redisTemplate對象,並且返回一個ApplicationContext對象,從這個對象裡面我們可能很輕鬆的擷取那兩個產生的對象。
好,接下來看測試方法。
從spring上下文中擷取redisTemplate對象,擷取該對象的成員變數,即ValueOperations對象,這個類是個泛型類,ValueOperations<K, V>,對應redis資料庫的基礎資料類型String,即key為字串,value也是字串。
使用ValueOperations對象,可以進行redis對String類型的所有操作了,包括get,set,getex等操作,通過api就可以查到相關的介面方法。
例子裡採用最基礎的get/set操作,相信大家也能看懂,就不多說了吧。
3. 總結
入門例子,相對還是太簡單了,深入學習還是需要掌握redis的很多基本命令,以及spring封裝後對應的又是哪些介面的哪些方法。作為一個碼農,面對新技術層出不窮、更新換代太快的情況,我只能說:任重而道遠,且摳(摳腚,coding)且哈皮。