SpringCloud工作筆記070---SpringCloud中使用Redis儲存List型別資料
阿新 • • 發佈:2018-12-11
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)); } }