spring-整合redis

來源:互聯網
上載者:User

標籤:還原序列化   puts   util   key   path   ack   factory   OLE   pack   

Redis是key-value儲存的非關係型資料庫。Spring Data Redis包含了多個模板實現,用來完成Redis資料庫的資料存取功能

1、如何串連Redis?

Spring Data Redis提供了JedisConnectFactory串連工廠(不止這一個)

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">      <property name="hostName" value="192.168.1.106"></property></bean>

2、使用模板

  Spring Data Redis提供了RedisTemplate 和 StringRedisTemplate模板。模板封裝了對redis操作,提供了較進階的資料訪問方案。從名字可以看出後者只關注字串類型,當redis的key和value都是字串時候建議使用StringRedisTemplate

RedisTemplate的很多功能以子API的形式提供,他們區分了單個值和集合值得情境。

package com.cn.util;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import java.util.List;import java.util.Set;@Componentpublic class JedisUtil {    @Autowired    private RedisTemplate<String, Object> redisTemplate;    //字串    public void setStr(String key, Object value){        redisTemplate.opsForValue().set(key, value);    }    public Object getStr(String key){        return redisTemplate.opsForValue().get(key);    }    //list集合    public void lpush(String key, Object value){        redisTemplate.opsForList().leftPush(key, value);    }    public Object lpop(String key){        return redisTemplate.opsForList().leftPop(key);    }    public List<Object> lrange(String key, long start , long end){        return redisTemplate.opsForList().range(key, start, end);    }    //set集合    public void addSet(String key, String value){        redisTemplate.opsForSet().add(key, value);    }    public Set<Object> getSet(String key){        return redisTemplate.opsForSet().members(key);    }    //hash集合    public void hset(String key, String key1, String value){        redisTemplate.opsForHash().put(key, key1, value);    }    public Object hget(String key, String key1){        return redisTemplate.opsForHash().get(key, key1);    }    public Set<Object> getKeys(String key){        return redisTemplate.opsForHash().keys(key);    }}

測試類別

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:springMvc.xml", "classpath:spring-source.xml"})public class JedisUtilTest {    @Autowired    private JedisUtil jedisUtil;    @Test    public void setStr() throws Exception {        jedisUtil.setStr("shoudu","beijing");    }    @Test    public void getStr() throws Exception {        Object obj=jedisUtil.getStr("shoudu");        System.out.println(obj);    }    @Test    public void lpush() throws Exception {        jedisUtil.lpush("testlist",new User("ii","ll"));    }    @Test    public void lpop() throws Exception {       Object obj= jedisUtil.lpop("testlist");        System.out.println(obj);    }    @Test    public void lrange() throws Exception {        List<Object> list=jedisUtil.lrange("testlist", 0 , -1);        System.out.println(list);    }    @Test    public void addSet() throws Exception {        jedisUtil.addSet("testset", "jj2");    }    @Test    public void getSet() throws Exception {        Object obj = jedisUtil.getSet("testset");        System.out.println(obj);    }    @Test    public void hset() throws Exception {        jedisUtil.hset("testhash", "name", "liming");    }    @Test    public void hget() throws Exception {        Object obj=jedisUtil.hget("testhash","name");        System.out.println(obj);    }    @Test    public void getKeys() throws Exception {        Set<Object> keys=jedisUtil.getKeys("testhash");        System.out.println(keys);    }    @Test    public void muchOps() throws Exception{        BoundHashOperations<String, String, Object> boundHashOperations=                jedisUtil.redisTemplate.boundHashOps("testhash");        String str=boundHashOperations.getKey();        System.out.println(str);        Object obj=boundHashOperations.get("name");        System.out.println(obj);        boundValueOperations.put("age",123);        boundValueOperations.put("school","beida");        Set<String> keys=boundHashOperations.keys();        System.out.println(keys);    }}

  以上測試方法,僅僅測試了每種redis資料類型的部分方法。注意,最後muchOps()測試方法,redisTemplate提供綁定key(此處為hash類型的key,其它類型類似)的方式執行操作,整個方法中僅僅一個地方使用了key,即jedisUtil.redisTemplate.boundHashOps("testhash"),對返回的boundValueOperations執行的所有操作都會應用到這個key上。

3、使用key和value的序列化器

  當某個key-value條目儲存到Redis儲存時候,key和value都會使用Redis序列化器進行序列化。Spring Date Redis 提供了多個序列化器:

1)JdkSerializationRedisSerializer:POJO對象的存取情境,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將儲存位元組序列。是目前最常用的序列化策略。
2)StringRedisSerializer:Key或者value為字串的情境,根據指定的charset對資料的位元組序列編碼成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略。
3)JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo執行個體序列化成json格式儲存在redis中,也可以將json格式的資料轉換成pojo執行個體。因為jackson工具在序列化和還原序列化時,需要明確指定Class類型,因此此策略封裝起來稍微複雜。【需要jackson-mapper-asl工具支援】
4)OxmSerializer:提供了將javabean與xml之間的轉換能力,目前可用的三方支援包括jaxb,apache-xmlbeans;redis儲存的資料將是xml工具。不過使用此策略,編程將會有些難度,而且效率最低;不建議使用。【需要spring-oxm模組的支援

  • RedisTemplate中需要聲明4種serializer,預設為“JdkSerializationRedisSerializer”:

    a) keySerializer :對於普通K-V操作時,key採取的序列化策略
    b) valueSerializer:value採取的序列化策略
    c) hashKeySerializer: 在hash資料結構中,hash-key的序列化策略
    d) hashValueSerializer:hash-value的序列化策略

  • StringRedisTemplate也需要申明4中serializer,但是預設為“StringRedisSerializer”,可以看StringRedisTemplate類的源碼:
package org.springframework.data.redis.core;import org.springframework.data.redis.connection.DefaultStringRedisConnection;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;public class StringRedisTemplate extends RedisTemplate<String, String> {    public StringRedisTemplate() {        RedisSerializer<String> stringSerializer = new StringRedisSerializer();   //StringRedisSerializer序列器        this.setKeySerializer(stringSerializer);        this.setValueSerializer(stringSerializer);        this.setHashKeySerializer(stringSerializer);        this.setHashValueSerializer(stringSerializer);    }    public StringRedisTemplate(RedisConnectionFactory connectionFactory) {        this();        this.setConnectionFactory(connectionFactory);        this.afterPropertiesSet();    }    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {        return new DefaultStringRedisConnection(connection);    }}

 

spring-整合redis

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.