Spring Data Redis

前言

使用Jedis來操做Redis有兩個明顯的問題(我都能發現固然很明顯):java

  • 須要手動關閉資源;
  • 徹底編碼式的事務聲明。

不過強大的Spring確定會有對Redis的支持,因而我找到了Spring Data Redisredis

Spring Data Redis

Jedis的不足

  • connection管理缺少自動化,connection-pool的設計缺乏必要的容器支持;
  • 數據操做須要關注「序列化」/「反序列化」,由於jedis的客戶端API接受的數據類型爲string和byte,對結構化數據(json,xml,pojo等)操做須要額外的支持;
  • 事務操做純粹爲硬編碼;
  • pub/sub功能,缺少必要的設計模式支持,對於開發者而言須要關注的太多。

Spring Data Redis提供的功能

  • 鏈接池自動管理,提供了一個高度封裝的「RedisTemplate」類;
  • 針對jedis客戶端中大量api進行了歸類封裝,將同一類型操做封裝爲operation接口;
  • 提供了對key的「bound」(綁定)便捷化操做API,能夠經過bound封裝指定的key,而後進行一系列的操做而無須「顯式」的再次指定Key,即BoundKeyOperations;
  • 將事務操做封裝,有容器控制。
  • 針對數據的「序列化/反序列化」,提供了多種可選擇策略(RedisSerializer)
  • 基於設計模式,和JMS開發思路,將pub/sub的API設計進行了封裝,使開發更加便捷。

序列化策略

Spring Data Redis 提供了四種serializer:spring

  • JdkSerializationRedisSerializer ,使用JDK的序列化(serializable接口,ObjectInputStrean,ObjectOutputStream),數據以字節流存儲;
  • StringRedisSerializer,字符串編碼,數據以string存儲;
  • JacksonJsonRedisSerializer,json格式存儲;
  • OxmSerializer,xml格式存儲。

其中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎的序列化策略,「JacksonJsonRedisSerializer」與「OxmSerializer」都是基於stirng存儲,所以它們是較爲「高級」的序列化(最終仍是使用string解析以及構建java對象)。json

RedisTemplate中須要聲明4種serializer,默認爲「JdkSerializationRedisSerializer」:設計模式

  • keySerializer ,對於普通K-V操做時,key採起的序列化策略;
  • valueSerializer,value採起的序列化策略;
  • hashKeySerializer,在hash數據結構中,hash-key的序列化策略;
  • hashValueSerializer,hash-value的序列化策略。

代碼

maven依賴

<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.8.4.RELEASE</version>
</dependency>

Spring配置

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.pool.maxIdle}"/>
        <property name="maxTotal" value="${redis.pool.maxTotal}"/>
        <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
    </bean>

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="hostName" value="${redis.url}"/>
        <property name="port" value="${redis.port}"/>
        <property name="password" value="${redis.auth}"/>
        <property name="timeout" value="${redis.timeout}"/>
        <property name="database" value="${redis.database}" />
        <property name="usePool" value="true" />
        <property name="poolConfig" ref="jedisPoolConfig" />
    </bean>
    <bean class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>

model

import java.io.Serializable;

/**
 * Created by FJH on 2017/6/18.
 */
public class User implements Serializable{

    private Long userId;
    private String username;
    private String loginName;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", loginName='" + loginName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

dao

import cn.fjhdtp.maventest.dao.UserDao;
import cn.fjhdtp.maventest.model.User;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

/**
 * Created by FJH on 2017/6/18.
 */
@Repository
public class UserDaoImpl implements UserDao {
    @Resource
    private RedisTemplate<Long, User> redisTemplate;

    @Override
    public void save(User user) {
        ValueOperations<Long, User> valueOperations = redisTemplate.opsForValue();
        valueOperations.set(user.getUserId(), user);
    }

    @Override
    public User get(Long id) {
        ValueOperations<Long, User> valueOperations = redisTemplate.opsForValue();
        return valueOperations.get(id);
    }

    @Override
    public void delete(Long id) {
        ValueOperations<Long, User> valueOperations = redisTemplate.opsForValue();
        RedisOperations<Long, User> redisOperations = valueOperations.getOperations();
        redisOperations.delete(id);
    }
}
相關文章
相關標籤/搜索