如何給web項目添加redis服務


前言

  這兩天項目用到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命令參考

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM