1. 程式人生 > >SpringCloud工作筆記070---SpringCloud中使用Redis儲存List型別資料

SpringCloud工作筆記070---SpringCloud中使用Redis儲存List型別資料

    JAVA技術交流QQ群:170933152  

看看這邊封裝的redis的工具類:

src\main\java\cn\gov\majorproj\scadmin\util\CacheUtils.java

注意,就是用下面的saveList,getList 這兩個方法來實現的,直接存的時候存一個key,然後把obj轉為json,通過json來進行中間過程

的儲存,這樣就可以了.

用法就是下面這樣用,然後再下面是工具類:

package cn.gov.majorproj.scpermission.util;

import cn.gov.majorproj.scpermission.dao.SysAccessMapper;
import cn.gov.majorproj.scpermission.dao.SysRoleaccessMapper;
import cn.gov.majorproj.scpermission.model.SysAccess;
import cn.gov.majorproj.scpermission.model.SysRoleaccess;
import com.sun.javaws.CacheUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service("PermissionMemUtil")
public class PermissionMemUtil {
    @Autowired
    private SysRoleaccessMapper roleaccessMapper;
    @Autowired
    private SysAccessMapper accessMapper;

    private Logger logger=LoggerFactory.getLogger(this.getClass());

    public static List<SysRoleaccess> roleaccessesmap = new ArrayList<SysRoleaccess>();
    public static List<SysAccess> accessesmap = new ArrayList<SysAccess>();

    public static int flag = 1;

    public void refresh()
    {
        roleaccessesmap.clear();
        if (roleaccessesmap.isEmpty() && (flag == 1))
        {
            roleaccessesmap = roleaccessMapper.selectAll();
            CacheUtils.saveBean("roleaccessesmap",roleaccessesmap);
            roleaccessesmap.clear();
            roleaccessesmap=CacheUtils.getList("roleaccessesmap",SysRoleaccess.class);
        }
        else if (flag != 1)
        {
            logger.info("重新整理資料字典操作~~~~~start");
            roleaccessesmap = roleaccessMapper.selectAll();
            CacheUtils.saveBean("roleaccessesmap",roleaccessesmap);
            roleaccessesmap.clear();
            roleaccessesmap=CacheUtils.getList("roleaccessesmap",SysRoleaccess.class);
        }
        logger.info("識別符號:{},獲取字典組資料:{}",flag,roleaccessesmap);

        //許可權列表
        accessesmap.clear();
        if (accessesmap.isEmpty() && (flag == 1))
        {
            accessesmap = accessMapper.selectAll();
            CacheUtils.saveBean("accessesmap",accessesmap);
            accessesmap.clear();
            accessesmap=CacheUtils.getList("accessesmap",SysAccess.class);

        }
        else if (flag != 1)
        {
            logger.info("重新整理資料字典操作~~~~~start");
            accessesmap = accessMapper.selectAll();
            CacheUtils.saveBean("accessesmap",accessesmap);
            accessesmap.clear();
            accessesmap=CacheUtils.getList("accessesmap",SysAccess.class);
        }
        logger.info("識別符號:{},獲取字典組資料:{}",flag,accessesmap);
    }

    /**
     * 根據角色id獲取該角色擁有的角色許可權資訊
     * @param roleid 角色id
     * @return 角色許可權列表
     */
    public static List<SysRoleaccess> getRoleaccessListByRoleId(String roleid)
    {
        List<SysRoleaccess> list=null;
        if (CmUtil.isNotEmpty(roleid) && !roleaccessesmap.isEmpty())
        {
            Integer introleid=Integer.valueOf(roleid);
            list = new ArrayList<SysRoleaccess>();
            for (SysRoleaccess dict: roleaccessesmap)
            {
                if (introleid.equals(dict.getRoleId()))
                {
                    list.add(dict);
                }
            }
            return list;
        }
        return PermissionMemUtil.roleaccessesmap;
    }

    /**
     *返回許可權id對應的許可權
     * @param accessId 許可權id
     * @return 該許可權id對應的許可權
     */
    public static SysAccess getSysAccessByAccessId(Integer accessId)
    {
        if (CmUtil.isNotEmpty(accessId) && !accessesmap.isEmpty())
        {
            for (SysAccess dict: accessesmap)
            {
                if (accessId.equals(dict.getAccessId()))
                {
                    return dict;
                }
            }
        }
        return null;
    }

}
package cn.gov.majorproj.scpermission.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.RedisZSetCommands.Tuple;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * 描述: 操作redis 工具類
 * author: lidewei
 * Date: 2018/09/19 15:01
 */
@Component
public class CacheUtils {
    @Resource
    private RedisTemplate<String, String> redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    private static CacheUtils cacheUtils;

    private static final Logger logger = LoggerFactory.getLogger(CacheUtils.class);

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

    /**
     * 獲取所有登入的使用者
     *
     * @return
     */
    public static Integer getOnlineUsers() {
        Integer userCount = 0;
        userCount = cacheUtils.redisTemplate.keys("*").size();
        return userCount;
    }


    /**
     * 將資料存入快取
     *
     * @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);
    }

    /**
     * key 快取Key
     *
     * @param key
     * @return
     */
    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));
    }

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

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

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

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

    /**
     * 存到指定的佇列中
     *
     * @param key
     * @param val
     * @param size
     */
    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 value
     */
    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 t
     */
    public static <T> void hashSet(String hName, String key, T t) {

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

    /**
     * 取得複雜JSON資料
     *
     * @param key
     * @param clazz
     * @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);
    }

    /**
     * 取得複雜JSON資料
     *
     * @param key
     * @param clazz
     * @return
     */
    public static <T> List<T> getList(String key, Class<T> clazz) {

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

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

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

    /**
     * 從指定佇列裡取得資料
     *
     * @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);
        }
    }

    /**
     * 從指定佇列裡取得資料
     *
     * @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 key
     * @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中取得複雜JSON資料
     *
     * @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()));

    }

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

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


    /**
     * 根據key獲取當前計數結果
     *
     * @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 value
     */
    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 hName 集合名
     * @param key
     * @param t
     * @param <T>
     */
    public static <T> void hsetnx(String hName, String key, T t) {
        hsetnx(hName, key, JSON.toJSONString(t));
    }


}