前言
這兩天項目用到redis,而我自己也正准備看這個,所以就從頭開始學習了一遍。
既然要用,說明已經對redis是干什么的,特點是什么,對項目有什么好處,需要緩存什么東西等問題都了解過了,所以我們直接開搞:
怎么獲取redis
安裝redis,linux下wget到github的源碼,然后直接make就行了,比較簡單。
我是在windows下用的,所以來說下:到從redis官網連接過去的redisServer下載redis-2.8.19.zip,解壓之后運行redis-server.exe即可,然后打開redis-cli.exe就可以使用了。一般這個只是用來測試連接和查看monitor用的。
java端如何使用redis
在java項目中,redis提供了很多客戶端庫,我用的jedis,它封裝了對redis數據庫的所有操作。
一般web應用中,我們還會用到spring,方便的地方在於spring本身也提供了對redis的支持--spring-data-redis,可以到官網查看文檔,並有實例。
具體步驟:
1.引入pom依賴(如果沒用maven的話,自行引入jar包吧)
<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.5.0.RELEASE</version> </dependency> </dependencies>
同時將jedis也依賴上,因為spring-data-redis底層就是用的jedis:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.0</version> <type>jar</type> <scope>compile</scope> </dependency>
2.在容器中配置RedisTemplate實例
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/> <!-- redis template definition --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
注意:這是官網直接復制過來的,我這樣直接放在xml中,會報錯,即使是引入p的命名空間。然后我就嘗試將p屬性寫成property后,就沒有報錯了,但是在后面用的時候會key和value會出現類似"\xac\xed\x00\x05t\x00\tb "這樣的情況,查詢得知這是因為spring-data-redis需要將數據存儲到jedis中,這中間需要序列化,再由jedis存儲到數據庫,問題就出在序列化上了,它會將key和value的類型信息也序列化后帶上,這顯然不是我們想要的結果。
所以RedisTemplate提供了對key和value序列化類,於是我打算這樣:
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnFactory"/> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> </bean>
可是中間兩個序列化類還是報錯,沒有無參構造器,所以就准備采用構造器注入的方式,但是要求注入的參數是一個Object.class類型,我也不知道怎么注入這種類型的,搞來搞去還是干脆就不要xml了,直接寫配置類:
@Configuration public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean RedisTemplate<String, Object> redisTemplate() { final RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class)); template.setValueSerializer(new GenericToStringSerializer<>(Object.class)); return template; } }
這下可算可以了(當然要注意掃描包)。
有了RedisTemplate之后,就可以寫具體的實現業務類了,RedisTemplate基本支持所有redis操作,比如:
@Component public class SpringRedisClientImpl implements SpringRedisClient { @Autowired private RedisTemplate<String, Object> template; @Autowired private JedisConnectionFactory jedisConnectionFactory; @Override public void setKey(String key, String value) { template.opsForValue().set(key, value); } @Override public Object getKey(String key) { return template.opsForValue().get(key); } @Override public void incr(String key) { template.opsForValue().increment(key, 1); } @Override public void lPush(String key, String value) { template.opsForList().leftPush(key, value); } @Override public boolean checkKey(String key) { return template.hasKey(key); } @Override public Object lIndex(String key) { return template.opsForList().index(key, 0); } @Override public Long llength(String key) { return template.opsForList().size(key); } @Override public String lpop(String key) { return (String) template.opsForList().leftPop(key); } @Override public Set<String> getKeys(String pattern) { return template.keys(pattern); } @Override public void flushAll() { Jedis jedis = jedisConnectionFactory.getShardInfo().createResource(); jedis.flushAll(); jedis.close(); } }
最后,啟動redis-server.exe就可以了(這里要注意要先啟動這個,再啟動web項目,否則啟動不了,原因未知),如果對redis比較熟悉的,可以自行配置redis.windows.conf文件。其實我也不太熟悉conf文件里面的配置,尤其是持久化到磁盤那個。所以在我的項目里,我是將數據以每天為單位保存到mysql中,並清空redis。
推薦
要使用RedisTemplate相應方法的時候,應該要對其的作用非常熟悉,這里推薦一個redis命令參考。