1. 程式人生 > >StringRedisTemplate和RedisTemplate的區別及使用方法

StringRedisTemplate和RedisTemplate的區別及使用方法

auth temp 獲取 ati ota 一個 @class col ()

在學習SpringCloud的過程中,總需要記錄一下學習的過程,今天記錄一下StringRedisTemplate和RedisTemplate的區別及使用方法,使用時只需使用maven依賴包spring-boot-starter-data-redis即可,然後在service中註入StringRedisTemplate或者RedisTemplate即可

技術分享圖片

首先如下圖所示StringRedisTemplate繼承了RedisTemplate,所以兩者對Redis的操作方法具有相同之處

技術分享圖片

  • 兩者的數據是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate裏面的數據,RedisTemplate只能管理RedisTemplate中的數據。

  • 其實他們兩者之間的區別主要在於他們使用的序列化類:

    RedisTemplate使用的是JdkSerializationRedisSerializer 存入數據會將數據先序列化成字節數組然後在存入Redis數據庫。

     StringRedisTemplate使用的是StringRedisSerializer

  • 使用時註意事項:
   當你的redis數據庫裏面本來存的是字符串數據或者你要存取的數據就是字符串類型數據的時候,那麽你就使用StringRedisTemplate即可。    但是如果你的數據是復雜的對象類型,而取出的時候又不想做任何的數據轉換,直接從Redis裏面取出一個對象,那麽使用RedisTemplate是更好的選擇。
  • RedisTemplate使用時常見問題:

    redisTemplate 中存取數據都是字節數組。當redis中存入的數據是可讀形式而非字節數組時,使用redisTemplate取值的時候會無法獲取導出數據,獲得的值為null。可以使用 StringRedisTemplate 試試。

StringRedisTemplate對於Redis的操作方法:

1 StringRedisTemplate.opsForValue().* //操作String字符串類型
2 StringRedisTemplate.delete(key/collection) //根據key/keys刪除
3
StringRedisTemplate.opsForList().* //操作List類型
4 StringRedisTemplate.opsForHash().* //操作Hash類型
5 StringRedisTemplate.opsForSet().*  //操作set類型
6 StringRedisTemplate.opsForZSet().*  //操作有序set

  

接口實現代碼如下:

  

package com.cloud.spring.demo.service.impl;

import com.cloud.spring.demo.service.RedisTestService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Package: com.cloud.spring.demo.service.impl
 * @ClassName: RedisTestServiceImpl
 * @Author: zhougaoyang
 * @Description: redis服務測試接口實現
 * @Date: 2019/4/27 10:16
 * @Version: 1.0
 */
@Service
public class RedisTestServiceImpl implements RedisTestService {
    private static final Logger log = LoggerFactory.getLogger(RedisTestService.class);

    @Autowired
    private StringRedisTemplate redisTemplate;


    /**
     * @Description 獲取String類型的value
     * @param name
     * @return
     */
    @Override
    public String findName(String name) {
        if (name==null){
            log.error("===============key為null======================================================");
        }
        return redisTemplate.opsForValue().get(name);
    }

    /**
     * @Description 添加String類型的key-value
     * @param name
     * @param value
     * @return
     */
    @Override
    public String setNameValue(String name, String value) {
        log.info("==================添加String類型的key-value========================================");
        redisTemplate.opsForValue().set(name,value);
        return name;
    }

    /**
     * @Description 根據key刪除redis的數據
     * @param name
     * @return
     */
    @Override
    public String delNameValue(String name) {
        redisTemplate.delete(name);
        return name;
    }

    /**
     * @Description 根據key獲取list類型的value(範圍)
     * @param key
     * @return
     */
    @Override
    public List<String> findList(String key,int start,int end) {
        log.info("=====================按照範圍查詢redis中List類型=======================================");
        return redisTemplate.opsForList().range(key,start,end);
    }

    /**
     * @Description 插入多條數據
     * @param key
     * @param value
     * @return
     */
    @Override
    public long setList(String key, List<String> value) {
        log.info("=========================redis List type insert ======================================");
        return redisTemplate.opsForList().rightPushAll(key, value);
    }

    /**
     * @Description 獲取list最新記錄(右側)
     * @param key
     * @return
     */
    @Override
    public String findLatest(String key) {
        log.info("=============================rides List latest rigth==================================");
        return redisTemplate.opsForList().index(key,redisTemplate.opsForList().size(key)-1);
    }

    /**
     * @Description 查詢hash
     * @param key
     * @return
     */
    @Override
    public Map<Object, Object> findHash(String key) {
        log.info("===================================redis hash =========================================");
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * @Description 查詢hash中所有的key
     * @param key
     * @return
     */
    @Override
    public Set<Object> findHashKeys(String key) {
        log.info("====================================== All keys of hash ===============================");
        return redisTemplate.opsForHash().keys(key);
    }

    /**
     * @Description 查詢hash中所有的value
     * @param key
     * @return
     */
    @Override
    public List<Object> findHashValues(String key) {
        log.info("===================================== All values of hash ==============================");
        return redisTemplate.opsForHash().values(key);
    }

    /**
     * @Desscription 插入hash數據
     * @param key
     * @param map
     * @return
     */
    @Override
    public long insertHash(String key, Map<String, Object> map) {
        log.info("====================================== insert hashes into redis ========================");
        redisTemplate.opsForHash().putAll(key,map);
        return map.size();
    }
}

StringRedisTemplate和RedisTemplate的區別及使用方法