這兩天項目用到redis,而我本身也正準備看這個,因此就從頭開始學習了一遍。java
既然要用,說明已經對redis是幹什麼的,特色是什麼,對項目有什麼好處,須要緩存什麼東西等問題都瞭解過了,因此咱們直接開搞:mysql
安裝redis,linux下wget到github的源碼,而後直接make就好了,比較簡單。linux
我是在windows下用的,因此來講下:到從redis官網鏈接過去的redisServer下載redis-2.8.19.zip,解壓以後運行redis-server.exe便可,而後打開redis-cli.exe就能夠使用了。通常這個只是用來測試鏈接和查看monitor用的。git
在java項目中,redis提供了不少客戶端庫,我用的jedis,它封裝了對redis數據庫的全部操做。github
通常web應用中,咱們還會用到spring,方便的地方在於spring自己也提供了對redis的支持--spring-data-redis,能夠到官網查看文檔,並有實例。web
具體步驟:redis
1.引入pom依賴(若是沒用maven的話,自行引入jar包吧)spring
<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:sql
<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命令參考。