1. 程式人生 > >Springboot 與 Redis 整合 簡易Redis工具類實現

Springboot 與 Redis 整合 簡易Redis工具類實現

最近專案需要處理一項資料量比較大的業務,考慮之下,高頻訪問/讀取決定使用Redis.自己的Springboot框架下研究了Redis兩天,把成果總結一下

開發環境介紹 JDK1.7 Redis 基礎依賴 org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.1 org.springframework.boot spring-boot-starter-data-redis Redis配置 省略部分內容的application.yml, 都是預設配置,可以沒有. 同時也可以在這裡配置超時時間 最大連線 等屬性,可以考慮參照其他網路部落格

server: redis: host: localhost # 162上面的Redis port: 6379 password: 建立RedisConfig,用來配置一些自定義內容.我配置的比較簡略,只註冊了一個按JDK序列化資料的RedisTemplate

@Configuration public class RedisConfig extends CachingConfigurerSupport{ /** * 注入 RedisConnectionFactory */ @Autowired RedisConnectionFactory redisConnectionFactory;

/**
 * 例項化 RedisTemplate 物件
 * Primary 在autoware時優先選用我註冊的bean. 
 * 因為在redis框架中有註冊一個StringRedisTemplate,避免注入衝突
 * @return
 */
@Bean
@Primary
public RedisTemplate<String, Object> functionDomainRedisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
    return redisTemplate;
}

/**
 * 設定資料存入 redis 的序列化方式
 *
 * @param redisTemplate
 * @param factory
 */
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
    redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
    redisTemplate.setConnectionFactory(factory);
}

} Springboot倡導開箱即用,這個Redis依賴很符合這個理念,事實上,即使你不做任何配置,依舊可以正常連線.

最後,在springboot主類上新增@EnableCaching,啟用快取管理,這個不能省略

@EnableCaching class Application {

static void main(String[] args) {
    SpringApplication.run (Application.class , args)
}

} Redis輔助類 根據分層思想,對Redis資料庫的操作屬於Dao層,不應該直接在Service操作資料, 而Redis是否有ORM框架我也不太清楚,所以為方便操作Redis資料庫,封裝了RedisDBHelper方便操作,先上介面

/**

  • K 指以hash結構操作時 鍵型別

  • T 為資料實體 應實現序列化介面,並定義serialVersionUID

  • RedisTemplate 提供了五種資料結構操作型別 hash / list / set / zset / value

  • 方法命名格式為 資料操作型別 + 操作 如 hashPut 指以hash結構(也就是map)想key新增鍵值對

  • Created by hp on 2018/3/1. / public interface RedisDBHelper<HK, T> { /*

    • Hash結構 新增元素
    • @param key key
    • @param hashKey hashKey
    • @param domain 元素 */ void hashPut(String key, HK hashKey,T domain);

    /**

    • Hash結構 獲取指定key所有鍵值對
    • @param key
    • @return */ Map< HK, T> hashFindAll(String key);

    /**

    • Hash結構 獲取單個元素
    • @param key
    • @param hashKey
    • @return */ T hashGet(String key,HK hashKey);

    void hashRemove(String key, HK hashKey);

    /**

    • List結構 向尾部(Right)新增元素
    • @param key
    • @param domain
    • @return */ Long listPush(String key, T domain);

    /**

    • List結構 向頭部(Left)新增元素
    • @param key
    • @param domain
    • @return */ Long listUnshift(String key, T domain);

    /**

    • List結構 獲取所有元素
    • @param key
    • @return */ List listFindAll(String key);

    /**

    • List結構 移除並獲取陣列第一個元素
    • @param key
    • @return */ T listLPop(String key);

    void remove(String key);

/** * 設定過期時間 * @param key 鍵 * @param timeout 時間 * @param timeUnit 時間單位 */ boolean expirse(String key, long timeout, TimeUnit timeUnit); } 這裡我只根據我目前的業務需要添加了幾個介面, 如有其它需要可以自行新增並實現.對這個介面我提供了簡單的實現

/**

  • 介面的簡單實現

  • Created by hp on 2018/3/1. */ @Service(“RedisDBHelper”) public class RedisDBHelperImpl<HK, T> implements RedisDBHelper<HK, T>{

    // 在構造器中獲取redisTemplate例項, key(not hashKey) 預設使用String型別 private RedisTemplate<String, T> redisTemplate;

    // 在構造器中通過redisTemplate的工廠方法例項化操作物件 private HashOperations<String, HK, T> hashOperations;

    private ListOperations<String, T> listOperations;

    private ZSetOperations<String, T> zSetOperations;

    private SetOperations<String, T> setOperations;

    private ValueOperations<String, T> valueOperations;

    // IDEA雖然報錯,但是依然可以注入成功, 例項化操作物件後就可以直接呼叫方法操作Redis資料庫 @Autowired public RedisDBHelperImpl (RedisTemplate<String, T> redisTemplate) { this.redisTemplate = redisTemplate; this.hashOperations = redisTemplate.opsForHash(); this.listOperations = redisTemplate.opsForList(); this.zSetOperations = redisTemplate.opsForZSet(); this.setOperations = redisTemplate.opsForSet(); this.valueOperations = redisTemplate.opsForValue(); }

    @Override public void hashPut(String key, HK hashKey, T domain) { hashOperations.put(key, hashKey, domain); }

    @Override public Map<HK, T> hashFindAll(String key) { return hashOperations.entries(key); }

    @Override public T hashGet(String key, HK hashKey) { return hashOperations.get(key, hashKey); }

    @Override public void hashRemove(String key, HK hashKey) { hashOperations.delete(key, hashKey); }

    @Override public Long listPush(String key, T domain) { return listOperations.rightPush(key, domain); }

    @Override public Long listUnshift(String key, T domain) { return listOperations.leftPush(key, domain); }

    @Override public List listFindAll(String key) { if (! redisTemplate.hasKey(key)){ return null; } return listOperations.range(key,0, listOperations.size(key)); }

    @Override public T listLPop(String key) { return listOperations.leftPop(key); }

    @Override public void remove(String key) { redisTemplate.delete(key); }

    @Override public boolean expire(String key, long timeout, TimeUnit timeUnit) { return redisTemplate.expire(key, timeout, timeUnit); } } 整體而言就是對Operations的簡單封裝,讓自己可以使用的更得心應手一點.那麼RedisDBHelper應該怎麼使用呢?首先定義一個簡單實體

public class Person implements Serializable { // 為了能夠正確得序列化和反序列化,這個屬性必不可少 private static final long serialVersionUID = - 1L;

private String id;

private String name;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

} PersonServiceImpl超簡易示例

使用方式就是直接autoware注入RedisDBHelper的例項,按需求定義泛型即可

@Service public class PersonServiceImpl implements PersonService{ @Autowired RedisDBHelper<String, Person> redisDBHelper;

// 你可以理解為這個是表名
private static final String KEY= "PERSON_KEY";

/**
 * 儲存一個Person到一個Map結構中
 * @param person
 */
public void putPerson(Person person) {
    redisDBHelper.hashPut(KEY, person.getId(), person);
}

}