1. 程式人生 > >spring-集成redis

spring-集成redis

高效 school 數據結構 cto mapper 聲明 lte 實例 地方

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; @Component public 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