1. 程式人生 > >展開被 SpringBoot 玩的日子 《 三 》 整合Redis

展開被 SpringBoot 玩的日子 《 三 》 整合Redis

  SpringBoot對常用的資料庫支援外,對NoSQL 資料庫也進行了封裝自動化。

 

  redis介紹

  Redis是目前業界使用最廣泛的記憶體資料儲存。相比memcached,Redis支援更豐富的資料結構,例如hashes, lists, sets等,同時支援資料持久化。除此之外,Redis還提供一些類資料庫的特性,比如事務,HA,主從庫。可以說Redis兼具了快取系統和資料庫的一些特性,因此有著豐富的應用場景。本文介紹Redis在Spring Boot中兩個典型的應用場景。

  如何使用

  1、引入 spring-boot-starter-redis

<dependency>  

    <groupId>org.springframework.boot</groupId>  

    <artifactId>spring-boot-starter-data-redis</artifactId>  

</dependency>

  2、新增配置檔案

# REDIS (RedisProperties)
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連線埠
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連線池中的最大空閒連線
spring.redis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.pool.min-idle=0
# 連線超時時間(毫秒)
spring.redis.timeout=1000

  3、安裝 Redis 

  Redis 官網:https://redis.io/,官網提供的是linux版本的,下載windows版本的地址如下。

  Redis windows下載地址:https://github.com/MicrosoftArchive/redis/releases

  1、安裝。

  執行對話方塊輸入"cmd",開啟命令提示符對話方塊。定位到redis解壓縮後的資料夾中。輸入“redis-server.exe redis.windows.conf”出現如下介面即成功啟動。

   2、測試是否安裝成功(使用客戶端進行測試)

  方法一: 安裝redis服務的dos視窗不要關閉。另外開啟一個dos視窗,定位到解壓縮後的redis資料夾,輸入“redis-cli.exe -h 127.0.0.1 -p 6379”

   方法二:直接在安裝目錄找到redis-cli.exe,雙擊開啟

  輸入set a '1'回車儲存成功,輸入get a獲取Redis內的值。

  如下圖表示成功

   

  3、因為redis是key/value形式的記憶體資料庫,所以,在設定/讀取值的時候,需要使用set/get  key value的形式

  如果能正常設定/讀取,則證明redis已經安裝完成。
  4、每次使用都需要這樣開啟Redis 服務,挺麻煩的,那就繼續看: 

  1)安裝服務:redis-server --service-install redis.windows.conf--loglevel verbose

  2)啟動服務:redis-server --service-start

  3)解除安裝服務:redis-server --service-uninstall

  好,到這裡,Redis 的基本準備已經可以了,接下來就是怎樣去寫入快取,怎樣拿出快取的問題了,我看了很多人的用法,都不一樣,這個方案,是我認為比較合適的方案,裡面包含了 Redis 的所有使用方式,大家可以參考一

  

@Component
public class RedisUtil {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 寫入快取
     * @param key 鍵
     * @param value 值
     * @return
     */
    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 寫入快取設定時效時間
     * @param key 鍵
     * @param value 值
     * @param expireTime 過期時間(秒)
     * @return
     */
    public boolean set(final String key, Object value, Long expireTime) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 批量刪除對應的value
     * @param keys 鍵s
     */
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * 批量刪除key
     * @param pattern
     */
    public void removePattern(final String pattern) {
        Set<Serializable> keys = redisTemplate.keys(pattern);
        if (keys.size() > 0)
            redisTemplate.delete(keys);
    }
    /**
     * 刪除對應的value
     * @param key 鍵
     */
    public void remove(final String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }
    /**
     * 判斷快取中是否有對應的value
     * @param key 鍵
     * @return
     */
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }
    /**
     * 讀取快取
     * @param key 鍵
     * @return
     */
    public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
    }
    /**
     * 雜湊 新增
     * @param key 鍵
     * @param hashKey has鍵
     * @param value 值
     */
    public void hmSet(String key, Object hashKey, Object value){
        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
        hash.put(key,hashKey,value);
    }

    /**
     * 雜湊獲取資料
     * @param key 鍵
     * @param hashKey has鍵
     * @return
     */
    public Object hmGet(String key, Object hashKey){
        HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();
        return hash.get(key,hashKey);
    }

    /**
     * 列表新增
     * @param k 鍵
     * @param v 值
     */
    public void lPush(String k,Object v){
        ListOperations<String, Object> list = redisTemplate.opsForList();
        list.rightPush(k,v);
    }

    /**
     * 列表獲取
     * @param k 鍵
     * @param l
     * @param l1
     * @return
     */
    public List<Object> lRange(String k, long l, long l1){
        ListOperations<String, Object> list = redisTemplate.opsForList();
        return list.range(k,l,l1);
    }

    /**
     * 集合新增
     * @param key 鍵
     * @param value 值
     */
    public void add(String key,Object value){
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        set.add(key,value);
    }

    /**
     * 集合獲取
     * @param key 鍵
     * @return
     */
    public Set<Object> setMembers(String key){
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        return set.members(key);
    }

    /**
     * 有序集合新增
     * @param key
     * @param value
     * @param scoure
     */
    public void zAdd(String key,Object value,double scoure){
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        zset.add(key,value,scoure);
    }

    /**
     * 有序集合獲取
     * @param key
     * @param scoure
     * @param scoure1
     * @return
     */
    public Set<Object> rangeByScore(String key,double scoure,double scoure1){
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        return zset.rangeByScore(key, scoure, scoure1);
    }
}

 

 

  4、好了,接下來就可以直接使用了,我是直接用瀏覽器或者 PostMan 來測試的,配合我第二節的 User 類來使用

  

@RestController
public class TestRedisController {

    @Autowired
    private UserDao userDao;

    @Autowired
    private RedisUtil redisUtil;

    @RequestMapping("/testSetRedis")
    public void testSetRedis () {
        redisUtil.set("key","value22222");
    }

    @RequestMapping("/testGetRedis")
    public Object getSetRedis () {
        return redisUtil.get("key");
    }

    @RequestMapping("/testRegister")
    public void testRegister () {
        User user = new User();
        user.setUserName("xjb1");
        user.setPassword("123456");
        user.setEmail("[email protected]");
        user.setNickName("xjb1");
        user.setRegTime(new Date().toString());
        userDao.save(user);
        // new User 並新增到資料庫後,將主鍵返回,並且儲存到 快取,設定有效時間
        redisUtil.set(user.getId().toString(), user, 10l);
    }

    @RequestMapping("/testGetUserByRedis")
    public Object testGetUserByRedis () {
        // 這裡寫得比較死,真實開發中,有很多方式獲取快取的key
        return redisUtil.get("61");
    }
}