如何給web項目添加redis服務

前言

  這兩天項目用到redis,而我本身也正準備看這個,因此就從頭開始學習了一遍。java

  既然要用,說明已經對redis是幹什麼的,特色是什麼,對項目有什麼好處,須要緩存什麼東西等問題都瞭解過了,因此咱們直接開搞:mysql

怎麼獲取redis

  安裝redis,linux下wget到github的源碼,而後直接make就好了,比較簡單。linux

  我是在windows下用的,因此來講下:到從redis官網鏈接過去的redisServer下載redis-2.8.19.zip,解壓以後運行redis-server.exe便可,而後打開redis-cli.exe就能夠使用了。通常這個只是用來測試鏈接和查看monitor用的。git

java端如何使用redis

  在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命令參考

相關文章
相關標籤/搜索