1. 程式人生 > >spring boot實際應用(五) redis

spring boot實際應用(五) redis

package com.ecej.nove.redis.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.springframework.data.redis.connection.RedisZSetCommands.Tuple;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;

/**
 *
 * @author QIANG
 *
 */
public class JedisClusterUtils {

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    private static JedisClusterUtils cacheUtils;

    @PostConstruct
    public void init() {
        cacheUtils = this;
        cacheUtils.redisTemplate = this.redisTemplate;
    }

    /**
     * 將資料存入快取
     *
     * @param key
     * @param val
     * @return
     */
    public static void saveString(String key, String val) {

        ValueOperations<String, String> vo = cacheUtils.redisTemplate.opsForValue();
        vo.set(key, val);
    }

    /**
     * 將資料存入快取的集合中
     *
     * @param key
     * @param val
     * @return
     */
    public static void saveToSet(String key, String val) {

        SetOperations<String, String> so = cacheUtils.redisTemplate.opsForSet();

        so.add(key, val);
    }

    /**
     *
     *
     * @param key
     *            快取Key
     * @return keyValue
     * @author:mijp
     * @since:2017/1/16 13:23
     */
    public static String getFromSet(String key) {
        return cacheUtils.redisTemplate.opsForSet().pop(key);
    }

    /**
     * 將 key的值儲存為 value ,當且僅當 key 不存在。 若給定的 key 已經存在,則 SETNX 不做任何動作。 SETNX 是『SET
     * if Not eXists』(如果不存在,則 SET)的簡寫。 <br>
     * 儲存成功,返回 true <br>
     * 儲存失敗,返回 false
     */
    public static boolean saveNX(String key, String val) {

        /** 設定成功,返回 1 設定失敗,返回 0 **/
        return cacheUtils.redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            return connection.setNX(key.getBytes(), val.getBytes());
        });

    }

    /**
     * 將 key的值儲存為 value ,當且僅當 key 不存在。 若給定的 key 已經存在,則 SETNX 不做任何動作。 SETNX 是『SET
     * if Not eXists』(如果不存在,則 SET)的簡寫。 <br>
     * 儲存成功,返回 true <br>
     * 儲存失敗,返回 false
     *
     * @param key
     * @param val
     * @param expire
     *            超時時間
     * @return 儲存成功,返回 true 否則返回 false
     */
    public static boolean saveNX(String key, String val, int expire) {

        boolean ret = saveNX(key, val);
        if (ret) {
            cacheUtils.redisTemplate.expire(key, expire, TimeUnit.SECONDS);
        }
        return ret;
    }

    /**
     * 將資料存入快取(並設定失效時間)
     *
     * @param key
     * @param val
     * @param seconds
     * @return
     */
    public static void saveString(String key, String val, int seconds) {

        cacheUtils.redisTemplate.opsForValue().set(key, val, seconds, TimeUnit.SECONDS);
    }

    /**
     * 將自增變數存入快取
     */
    public static void saveSeq(String key, long seqNo) {

        cacheUtils.redisTemplate.delete(key);
        cacheUtils.redisTemplate.opsForValue().increment(key, seqNo);
    }

    /**
     * 將遞增浮點數存入快取
     */
    public static void saveFloat(String key, float data) {

        cacheUtils.redisTemplate.delete(key);
        cacheUtils.redisTemplate.opsForValue().increment(key, data);
    }

    /**
     * 儲存複雜型別資料到快取
     *
     * @param key
     * @param obj
     * @return
     */
    public static void saveBean(String key, Object obj) {

        cacheUtils.redisTemplate.opsForValue().set(key, JSON.toJSONString(obj));
    }

    /**
     * 儲存複雜型別資料到快取(並設定失效時間)
     *
     * @param key
     * @param Object
     * @param seconds
     * @return
     */
    public static void saveBean(String key, Object obj, int seconds) {

        cacheUtils.redisTemplate.opsForValue().set(key, JSON.toJSONString(obj), seconds, TimeUnit.SECONDS);
    }

    /**
     * 功能: 存到指定的佇列中<br />
     * 左近右出<br\> 作者: 耿建委
     *
     * @param key
     * @param val
     * @param size
     *            佇列大小限制 0:不限制
     */
    public static void saveToQueue(String key, String val, long size) {

        ListOperations<String, String> lo = cacheUtils.redisTemplate.opsForList();

        if (size > 0 && lo.size(key) >= size) {
            lo.rightPop(key);
        }
        lo.leftPush(key, val);
    }

    /**
     * 儲存到hash集合中
     *
     * @param hName
     *            集合名
     * @param key
     * @param val
     */
    public static void hashSet(String hName, String key, String value) {

        cacheUtils.redisTemplate.opsForHash().put(hName, key, value);
    }

    /**
     * 根據key獲取所以值
     * 
     * @param key
     * @return
     */
    public static Map<Object, Object> hgetAll(String key) {

        return cacheUtils.redisTemplate.opsForHash().entries(key);
    }

    /**
     * 儲存到hash集合中
     *
     * @param <T>
     *
     * @param hName
     *            集合名
     * @param key
     * @param val
     */
    public static <T> void hashSet(String hName, String key, T t) {

        hashSet(hName, key, JSON.toJSONString(t));
    }

    /**
     * 取得複雜型別資料
     *
     * @param key
     * @param obj
     * @param clazz
     * @return
     */
    public static <T> T getBean(String key, Class<T> clazz) {

        String value = cacheUtils.redisTemplate.opsForValue().get(key);
        if (value == null) {
            return null;
        }
        return JSON.parseObject(value, clazz);
    }

    /**
     * 從快取中取得字串資料
     *
     * @param key
     * @return 資料
     */
    public static String getString(String key) {
        cacheUtils.redisTemplate.opsForValue().get(key);

        return cacheUtils.redisTemplate.opsForValue().get(key);
    }

    /**
     *
     * 功能: 從指定佇列裡取得資料<br />
     * 作者: 耿建委
     *
     * @param key
     * @param size
     *            資料長度
     * @return
     */
    public static List<String> getFromQueue(String key, long size) {

        boolean flag = cacheUtils.redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            return connection.exists(key.getBytes());
        });

        if (flag) {
            return new ArrayList<>();
        }
        ListOperations<String, String> lo = cacheUtils.redisTemplate.opsForList();
        if (size > 0) {
            return lo.range(key, 0, size - 1);
        } else {
            return lo.range(key, 0, lo.size(key) - 1);
        }
    }

    /**
     *
     * 功能: 從指定佇列裡取得資料<br />
     * 作者: 耿建委
     *
     * @param key
     * @return
     */
    public static String popQueue(String key) {

        return cacheUtils.redisTemplate.opsForList().rightPop(key);

    }

    /**
     * 取得序列值的下一個
     *
     * @param key
     * @return
     */
    public static Long getSeqNext(String key) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Long>) connection -> {

            return connection.incr(key.getBytes());

        });
    }

    /**
     * 取得序列值的下一個
     *
     * @param key
     * @return
     */
    public static Long getSeqNext(String key, long value) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Long>) connection -> {

            return connection.incrBy(key.getBytes(), value);

        });

    }

    /**
     * 將序列值回退一個
     *
     * @param key
     * @return
     */
    public static void getSeqBack(String key) {

        cacheUtils.redisTemplate.execute((RedisCallback<Long>) connection -> connection.decr(key.getBytes()));

    }

    /**
     * 從hash集合裡取得
     *
     * @param hName
     * @param key
     * @return
     */
    public static Object hashGet(String hName, String key) {

        return cacheUtils.redisTemplate.opsForHash().get(hName, key);
    }

    public static <T> T hashGet(String hName, String key, Class<T> clazz) {

        return JSON.parseObject((String) hashGet(hName, key), clazz);
    }

    /**
     * 增加浮點數的值
     *
     * @param key
     * @return
     */
    public static Double incrFloat(String key, double incrBy) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Double>) connection -> {

            return connection.incrBy(key.getBytes(), incrBy);

        });
    }

    /**
     * 判斷是否快取了資料
     *
     * @param key
     *            資料KEY
     * @return 判斷是否快取了
     */
    public static boolean isCached(String key) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            return connection.exists(key.getBytes());
        });
    }

    /**
     * 判斷hash集合中是否快取了資料
     *
     * @param hName
     * @param key
     *            資料KEY
     * @return 判斷是否快取了
     */
    public static boolean hashCached(String hName, String key) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            return connection.hExists(key.getBytes(), key.getBytes());
        });
    }

    /**
     * 判斷是否快取在指定的集合中
     *
     * @param key
     *            資料KEY
     * @param val
     *            資料
     * @return 判斷是否快取了
     */
    public static boolean isMember(String key, String val) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            return connection.sIsMember(key.getBytes(), val.getBytes());
        });
    }

    /**
     * 從快取中刪除資料
     *
     * @param string
     * @return
     */
    public static void delKey(String key) {

        cacheUtils.redisTemplate.execute((RedisCallback<Long>) connection -> connection.del(key.getBytes()));
    }

    /**
     * 設定超時時間
     *
     * @param key
     * @param seconds
     */
    public static void expire(String key, int seconds) {
        cacheUtils.redisTemplate
                .execute((RedisCallback<Boolean>) connection -> connection.expire(key.getBytes(), seconds));

    }

    /**
     * 列出set中所有成員
     *
     * @param setName
     *            set名
     * @return
     */
    public static Set<Object> listSet(String setName) {

        return cacheUtils.redisTemplate.opsForHash().keys(setName);

    }

    /**
     * 向set中追加一個值
     *
     * @param setName
     *            set名
     * @param value
     */
    public static void setSave(String setName, String value) {

        cacheUtils.redisTemplate
                .execute((RedisCallback<Long>) connection -> connection.sAdd(setName.getBytes(), value.getBytes()));

    }

    /**
     * 逆序列出sorted set包括分數的set列表
     *
     * @param key
     *            set名
     * @param start
     *            開始位置
     * @param end
     *            結束位置
     * @return 列表
     */
    public static Set<Tuple> listSortedsetRev(String key, int start, int end) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Set<Tuple>>) connection -> {
            return connection.zRevRangeWithScores(key.getBytes(), start, end);
        });
    }

    /**
     * 逆序取得sorted sort排名
     *
     * @param key
     *            set名
     * @param member
     *            成員名
     * @return 排名
     */
    public static Long getRankRev(String key, String member) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Long>) connection -> {
            return connection.zRevRank(key.getBytes(), member.getBytes());
        });

    }

    /**
     * 根據成員名取得sorted sort分數
     *
     * @param key
     *            set名
     * @param member
     *            成員名
     * @return 分數
     */
    public static Double getMemberScore(String key, String member) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Double>) connection -> {
            return connection.zScore(key.getBytes(), member.getBytes());
        });
    }

    /**
     * 向sorted set中追加一個值
     *
     * @param key
     *            set名
     * @param score
     *            分數
     * @param member
     *            成員名稱
     */
    public static void saveToSortedset(String key, Double score, String member) {

        cacheUtils.redisTemplate.execute(
                (RedisCallback<Boolean>) connection -> connection.zAdd(key.getBytes(), score, member.getBytes()));
    }

    /**
     * 從sorted set刪除一個值
     *
     * @param key
     *            set名
     * @param member
     *            成員名稱
     */
    public static void delFromSortedset(String key, String member) {
        cacheUtils.redisTemplate
                .execute((RedisCallback<Long>) connection -> connection.zRem(key.getBytes(), member.getBytes()));

    }

    /**
     * 從hash map中取得複雜型別資料
     *
     * @param key
     * @param field
     * @param clazz
     */
    public static <T> T getBeanFromMap(String key, String field, Class<T> clazz) {

        byte[] input = cacheUtils.redisTemplate.execute((RedisCallback<byte[]>) connection -> {
            return connection.hGet(key.getBytes(), field.getBytes());
        });
        return JSON.parseObject(input, clazz, Feature.AutoCloseSource);
    }

    /**
     * 從hashmap中刪除一個值
     *
     * @param key
     *            map名
     * @param field
     *            成員名稱
     */
    public static void delFromMap(String key, String field) {

        cacheUtils.redisTemplate
                .execute((RedisCallback<Long>) connection -> connection.hDel(key.getBytes(), field.getBytes()));

    }

    /**
     *
     * @Description: 根據key增長 ,計數器
     * @author clg
     * @date 2016年6月30日 下午2:37:52
     *
     * @param key
     * @return
     */
    public static long incr(String key) {

        return cacheUtils.redisTemplate.execute((RedisCallback<Long>) connection -> {
            return connection.incr(key.getBytes());
        });
    }

    /**
     *
     * @Description: 根據key獲取當前計數結果
     * @author clg
     * @date 2016年6月30日 下午2:38:20
     *
     * @param key
     * @return
     */
    public static String getCount(String key) {

        return cacheUtils.redisTemplate.opsForValue().get(key);
    }

    /**
     * 將所有指定的值插入到存於 key 的列表的頭部。如果 key 不存在,那麼在進行 push 操作前會建立一個空列表
     *
     * @param <T>
     *
     * @param key
     * @param value
     * @return
     */
    public static <T> Long lpush(String key, T value) {

        return cacheUtils.redisTemplate.opsForList().leftPush(key, JSON.toJSONString(value));
    }

    /**
     * 只有當 key 已經存在並且存著一個 list 的時候,在這個 key 下面的 list 的頭部插入 value。 與 LPUSH 相反,當
     * key 不存在的時候不會進行任何操作
     *
     * @param key
     * @param value
     * @return
     */
    public static <T> Long lpushx(String key, T value) {

        return cacheUtils.redisTemplate.opsForList().leftPushIfPresent(key, JSON.toJSONString(value));
    }

    /**
     * 返回儲存在 key 裡的list的長度。 如果 key 不存在,那麼就被看作是空list,並且返回長度為 0
     *
     * @param key
     * @return
     */
    public static Long llen(String key) {

        return cacheUtils.redisTemplate.opsForList().size(key);
    }

    /**
     * 返回儲存在 key 的列表裡指定範圍內的元素。 start 和 end
     * 偏移量都是基於0的下標,即list的第一個元素下標是0(list的表頭),第二個元素下標是1,以此類推
     *
     * @param key
     * @return
     */
    public static List<String> lrange(String key, long start, long end) {

        return cacheUtils.redisTemplate.opsForList().range(key, start, end);
    }

    /**
     * 移除並且返回 key 對應的 list 的第一個元素
     *
     * @param key
     * @return
     */
    public static String lpop(String key) {

        return cacheUtils.redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 儲存到hash集合中 只在 key 指定的雜湊集中不存在指定的欄位時,設定欄位的值。如果 key 指定的雜湊集不存在,會建立一個新的雜湊集並與
     * key 關聯。如果欄位已存在,該操作無效果。
     *
     * @param hName
     *            集合名
     * @param key
     * @param val
     */
    public static void hsetnx(String hName, String key, String value) {

        cacheUtils.redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.hSetNX(key.getBytes(),
                key.getBytes(), value.getBytes()));

    }

    /**
     * 儲存到hash集合中 只在 key 指定的雜湊集中不存在指定的欄位時,設定欄位的值。如果 key 指定的雜湊集不存在,會建立一個新的雜湊集並與
     * key 關聯。如果欄位已存在,該操作無效果。
     *
     * @param <T>
     *
     * @param hName
     *            集合名
     * @param key
     * @param val
     */
    public static <T> void hsetnx(String hName, String key, T t) {
        hsetnx(hName, key, JSON.toJSONString(t));
    }

}


相關推薦

spring boot實際應用() redis

package com.ecej.nove.redis.utils; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurr

spring boot 實際應用(二) 編寫測試類

spring boot的測試類在開發中我們是非常需要的,看了不少文章也感覺比較麻煩,下面說個最簡單的``` @RunWith(SpringRunner.class) @SpringBootTe

spring boot項目之redis分布式鎖的應用

key 什麽 其他 ng- 分布式鎖 即使 功能 pri ont SETNX key value 起始版本:1.0.0 時間復雜度:O(1) 將key設置值為value,如果key不存在,這種情況下等同SET命令。 當key存在時,什麽也不做。SETNX是”SET i

spring boot 開發—第篇SpringDataJPA整合 Redis 實現快取

對druid專案進行改造,增加redis快取支援。 1、redis簡介 Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。 Redis 與其他 key - value 快取產品有以下三個特點: Redis支援資料

Spring boot 2.0的Redis快取應用

範培忠 2018-04-18  Spring Boot2.0.0.RELEASE在2018年3月1日正式釋出。2.0下對Redis的使用與之前略有不同。具體實現如下:        一、Maven依賴和配置        新增3個依賴:<dependency>

spring boot/cloud 應用監控

alt min .com cnblogs ima target 器監控 斷路器 htm 原文地址:http://www.cnblogs.com/skyblog/p/5633635.html 應用的監控功能,對於分布式系統非常重要。如果把分布式系統比作整個社會系統。那麽各個

基於Spring Boot構建應用開發規範

SpringBoot 項目規範 1.規範的意義和作用 編碼規範可以最大限度的提高團隊開發的合作效率 編碼規範可以盡可能的減少一個軟件的維護成本 , 並且幾乎沒有任何一個軟件,在其整個生命周期中,均由最初的開發人員來維護 編碼規範可以改善軟件的可讀性,可以讓開發人員盡快而徹底地理解新的代碼 規範性編碼

spring boot 利用redisson實現redis的分布式鎖

代碼 sched 技術 商品 onf 定義 必須 配置線 oracle 原文:http://liaoke0123.iteye.com/blog/2375469 利用redis實現分布式鎖,網上搜索的大部分是使用java jedis實現的。 redis官方推薦的分布式

Spring Boot 2.0():Docker Compose + Spring Boot + Nginx + Mysql 實踐

work 加載 ports access 分享圖片 htm 初始化 visit edi 我知道大家這段時間看了我寫關於 docker 相關的幾篇文章,不疼不癢的,仍然沒有感受 docker 的便利,是的,我也是這樣認為的,I know your felling 。 前期了解

Spring Boot整合JPA、Redis和Swagger2

enc code extends art redis學習 and 小結 JD pip 好久沒有總結了,最近也一直在學習。今天就把spring boot與其它技術的整合做個小總結,主要是jpa、redis和swagger2。公司裏有用到這些,整合起來也很簡單。 首先,新建一個

Spring Boot入門系列(FreeMarker模板的使用)

前端 start marker pin 用戶 需要 類庫 準備 control FreeMarker模板的使用   FreeMarker是一款模板引擎: 即一種基於模板和要改變的數據, 並用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具。 它不是面向

Spring Boot 企業級應用開發實戰

-o .com 註解 ping 折騰 jar 服務 開啟 blog Spring Boot 企業級應用開發實戰【下載地址:https://pan.baidu.com/s/1SbB-auGkUN6r2i6dtv7t_w 】 Spring Boot是目前Spring技術體系中炙

基於spring-boot應用程序的單元測試方案

supported nsa action throws 接口 insert tomat clas 資料 概述 本文主要介紹如何對基於spring-boot的web應用編寫單元測試、集成測試的代碼。 此類應用的架構圖一般如下所示: 我們項目的程序,對應到上圖中的web應用部

精選Spring Boot三十道必知必會知識點!

其它 同時 ont 帶來 ng2 數據源 mvc atl name Spring Boot、Spring MVC 和 Spring 有什麽區別? 1、Spring Spring最重要的特征是依賴註入。所有 SpringModules 不是依賴註入就是 IOC 控制反轉。 當

spring boot項目之redis緩存

程序 ati 如果 lec 第一次 數據 寫入 緩存 list()方法 以程序為例,tomcat裏是我們的java應用,第一步會先從redis獲取,如果沒有,就會從db上面獲取,如果取出了,他還會把取出的東西重新寫回redis 使用緩存的步驟: 一、在SellApplic

精選Spring Boot三十道必知必會知識點

問題一 Spring Boot、Spring MVC 和 Spring 有什麼區別? 1、Spring Spring最重要的特徵是依賴注入。所有 SpringModules 不是依賴注入就是 IOC 控制反轉。 當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發鬆耦合應用。

Spring Boot入門教程(十): httpclient

在開發中經常會遇到呼叫第三方的介面,這裡介紹一下在spring boot中如何使用httpclient來發送get和post請求。 引入依賴 <dependency> <groupId>org.apache.httpco

Spring boot 4 應用打包部署

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Boot基礎教程 ( )

首先,回顧並詳細說明一下在快速入門中使用的@Controller、@RestController、@RequestMapping註解。如果您對Spring MVC不熟悉並且還沒有嘗試過快速入門案例,建議先看一下快速入門的內容。 @Controller:修飾class,用來建立處理http

基於spring-boot應用程序的單元+集成測試方案

回歸 path turn behavior pat 一個 match 多場景 mybatis框架 概述 本文主要介紹單元測試、集成測試相關的概念、技術實現以及最佳實踐。 本文的demo是基於Java語言,Spring Boot構建的web應用。測試框架使用Junit,模擬框