Redis常用操作

1:redis常用操作:

package com.shunaier.hhhh.biz.utils;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.shunaier.hhhh.common.enums.SystemErrorEnum;
import com.shunaier.hhhh.common.exception.SNEBizException;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStringCommands.SetOption;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;@Component
@SuppressWarnings({"hiding", "rawtypes", "unchecked"})
public final class RedisUtils {private static RedisTemplate redisTemplate;private static RedissonClient redissonClient;private static String host;private static String password;private static Integer port;private static int databaseIndex;@Value("${redis.server.host}")public void setHost(String host) {RedisUtils.host = host;}@Value("${redis.server.password}")public void setPassword(String password) {RedisUtils.password = password;}@Value("${redis.server.port}")public void setPort(Integer port) {RedisUtils.port = port;}@Value("${redis.server.database:0}")public void setDatabaseIndex(int databaseIndex) {RedisUtils.databaseIndex = databaseIndex;}//鎖private static RedissonClient redissonClient() {if (redissonClient == null) {Config config = new Config();config.useSingleServer().setAddress(String.format("redis://%s:%s", host, port)).setDatabase(databaseIndex).setPassword(password);redissonClient = Redisson.create(config);}return redissonClient;}@Autowiredpublic void setRedisTemplate(RedisTemplate redisTemplate) {RedisUtils.redisTemplate = redisTemplate;}/*** 存入字符串* @param key 鍵* @param value 值*/public static void set(Object key, Object value) {try {redisTemplate.opsForValue().set(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 不存在便存入字符串* @param key 鍵* @param value 值*/public static Boolean setIfAbsent(Object key, Object value) {try {return redisTemplate.opsForValue().setIfAbsent(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量存入字符串* @param map 鍵-值*/public static void setAll(Map<Object, Object> map) {try {redisTemplate.opsForValue().multiSet(map);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入字符串 并 設置過期時間* @param key 鍵* @param value 值* @param time 時間* @param unit 時間粒度*/public static void setAndTimeout(Object key, Object value, long time, TimeUnit unit) {try {redisTemplate.opsForValue().set(key, value, time, unit);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 不存在便存入字符串 并 設置過期時間* @param key 鍵* @param value 值* @param time 時間* @param TimeUnit unit 時間粒度*/public static Boolean setIfAbsentAndTimeout(Object key, Object value, long time, TimeUnit unit) {try {return redisTemplate.opsForValue().setIfAbsent(key, value, time, unit);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量存入 map* @param map* @return*/public static void setByPipelined(Map<String, String> map) {try {redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {for (Entry<String, String> entry : map.entrySet()) {connection.set(entry.getKey().getBytes(), entry.getValue().getBytes());}return null;}});} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量存入-過期 map* @param map* @return*/public static void setByPipelinedAndTimeout(Map<String, String> map, long time, TimeUnit unit) {try {redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {for (Entry<String, String> entry : map.entrySet()) {connection.set(entry.getKey().getBytes(), entry.getValue().getBytes(), Expiration.from(time, unit), SetOption.UPSERT);}return null;}});} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取所有的key*/public static Set<Object> keys() {try {return redisTemplate.keys("*");} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 關鍵字模糊獲取所有的key* @param prex*/public static Set<Object> keys(String prex) {try {return redisTemplate.keys("*" + prex + "*");} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 修改key* @param oldKey* @param newKey*/public static void renameKey(Object oldKey, Object newKey) {try {redisTemplate.rename(oldKey, newKey);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 判斷key的類型* @param key* @return*/public static String type(String key) {try {DataType dataType = redisTemplate.type(key);return dataType.code();} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取字符串* @param key 鍵* @return*/public static Object get(Object key) {try {return redisTemplate.opsForValue().get(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量獲取字符串* @param keys 鍵* @return*/public static List<Object> multiGet(List<Object> keys) {try {return redisTemplate.opsForValue().multiGet(keys);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量獲取* @param keys 鍵* @return*/public static List<Object> getByPipelined(List<Object> keys) {try {return redisTemplate.executePipelined(new RedisCallback<String>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {for (int i = 0; i < keys.size(); i++) {connection.get(keys.get(i).toString().getBytes());}return null;}});} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量獲取 Map* @param key 鍵* @param hashKeys* @return*/public static List<Object> getMapValuesByPipelined(Object key, List<Object> hashKeys) {try {return redisTemplate.executePipelined(new RedisCallback<String>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {for (int i = 0; i < hashKeys.size(); i++) {connection.hGet(key.toString().getBytes(), hashKeys.get(i).toString().getBytes());}return null;}});} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量獲取 Map* @param key 鍵* @param hashKeys* @return*/public static Map<Object, Object> getMapByPipelined(Object key, List<Object> hashKeys) {try {Map<Object, Object> result = new HashMap<Object, Object>();List<Object> values = getMapValuesByPipelined(key, hashKeys);if (!values.isEmpty()) {for (int i = 0; i < hashKeys.size(); i++) {result.put(hashKeys.get(i), values.get(i));}}return result;} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取原字符串 并 重新賦值* @param key 鍵* @param value 新值* @return*/public static Object getAndSet(Object key, Object value) {try {return redisTemplate.opsForValue().getAndSet(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 在原字符串末尾 追加字符串* @param key 鍵* @param value 值*/public static void append(Object key, String value) {try {redisTemplate.opsForValue().append(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入對象* @param key 鍵* @param entity 對象*/public static <T> void setEntity(Object key, T entity) {try {redisTemplate.opsForValue().set(key, JSONObject.toJSONString(entity));} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入對象  并 設置過期時間* @param key 鍵* @param entity 對象* @param time 時間* @param unit 時間粒度*/public static <T> void setEntityAndTimeout(Object key, T value, long time, TimeUnit unit) {try {redisTemplate.opsForValue().set(key, JSONObject.toJSONString(value), time, unit);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入對象集合* @param key 鍵* @param value 集合對象*/public static <T> void setEntityList(Object key, List<T> entityList) {try {redisTemplate.opsForValue().set(key, JSONObject.toJSONString(entityList));} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入對象集合 并 設置過期時間* @param key 鍵* @param entityList 對象集合* @param time 時間* @param unit 時間粒度*/public static <T> void setEntityListAndTimeout(Object key, List<T> entityList, long time, TimeUnit unit) {try {redisTemplate.opsForValue().set(key, JSONObject.toJSONString(entityList), time, unit);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取對象* @param key 鍵* @return*/public static <T> T getEntity(Object key, Class<T> clz) {try {Object obj = redisTemplate.opsForValue().get(key);if (obj != null) {return jsonToEntity((String) obj, clz);}return null;} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取對象集合* @param key 鍵* @return*/public static <T> List<T> getEntityList(Object key, Class<T> clz) {try {Object obj = redisTemplate.opsForValue().get(key);if (obj != null) {return jsonToList((String) obj, clz);}return new ArrayList<T>();} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取對象 并 重新賦值* @param key 鍵* @param newEntity 新對象* @return*/public static <T> T getEntityAndSet(Object key, T newEntity, Class<T> clz) {try {Object obj = redisTemplate.opsForValue().getAndSet(key, JSONObject.toJSONString(newEntity));if (obj != null) {return jsonToEntity((String) obj, clz);}return null;} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取對象集合 并 重新賦值* @param key 鍵* @param newEntityList 新對象集合* @return*/public static <T> List<T> getEntityListAndSet(Object key, List<T> newEntityList, Class<T> clz) {try {Object obj = redisTemplate.opsForValue().getAndSet(key, JSONObject.toJSONString(newEntityList));if (obj != null) {return jsonToList((String) obj, clz);}return new ArrayList<T>();} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 轉換成 實體類對象* @param text JSON字符串* @param clz 對象的類型* @return*/public static <T> T jsonToEntity(String text, Class<T> clz) {try {return JSONArray.parseObject(text, clz);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 轉換成 實體類對象集合* @param text JSON字符串* @param clz 對象的類型* @return*/public static <T> List<T> jsonToList(String text, Class<T> clz) {try {return JSONArray.parseArray(text, clz);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 對象 轉換成 JSON字符串* @param obj* @return*/public static String toJSONString(Object obj) {try {return JSONArray.toJSONString(obj);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 判斷key是否存在* @param key 鍵* @return*/public static Boolean exist(Object key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 移除緩存數據* @param key 鍵*/public static void delete(Object key) {try {redisTemplate.delete(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量移除緩存數據* @param keys 鍵*/public static void deleteAll(List<Object> keys) {try {redisTemplate.delete(keys);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入Map* @param key 鍵* @param hashKey Map的key* @param value Map的value*/public static void put(Object key, Object hashKey, Object hashValue) {try {redisTemplate.opsForHash().put(key, hashKey, hashValue);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 不存在便存入Map、存在即存入失敗* @param key 鍵* @param hashKey Map的key* @param value Map的value*/public static Boolean putIfAbsent(Object key, Object hashKey, Object hashValue) {try {return redisTemplate.opsForHash().putIfAbsent(key, hashKey, hashValue);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 存入Map* @param key 鍵* @param map*/public static void putAll(Object key, Map<? extends Object, ? extends Object> map) {try {redisTemplate.opsForHash().putAll(key, map);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 批量存入* @param key* @param map* @return*/public static void putByPipelined(String key, Map<String, String> map) {try {redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {Map<byte[], byte[]> byteMap = new HashMap<byte[], byte[]>();for (Entry<String, String> entry : map.entrySet()) {byteMap.put(entry.getKey().getBytes(), entry.getValue().getBytes());}connection.hMSet(key.getBytes(), byteMap);return null;}});} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Map* @param key 鍵*/public static Map<Object, Object> getMap(Object key) {try {return redisTemplate.opsForHash().entries(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Map中指定的值* @param key 鍵* @param hashKey Map的key* @return*/public static Object getMapValue(Object key, Object hashKey) {try {return redisTemplate.opsForHash().get(key, hashKey);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Map中所有的key* @param key 鍵* @return*/public static Set<Object> getMapKeys(Object key) {try {return redisTemplate.opsForHash().keys(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Map中所有的值* @param key 鍵* @return*/public static List<Object> getMapValues(Object key) {try {return redisTemplate.opsForHash().values(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Map的長度* @param key 鍵* @return*/public static long getMapSize(Object key) {try {return redisTemplate.opsForHash().size(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 判斷Map中key是否存在* @param key 鍵* @param hashKey Map的key* @return*/public static Boolean existMapKey(Object key, Object hashKey) {try {return redisTemplate.opsForHash().hasKey(key, hashKey);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 移除Map中指定的key* @param key 鍵* @param hashKey Map的key* 單個haskKey 或 數組形式*/public static void deleteMapKey(Object key, Object... hashKey) {try {redisTemplate.opsForHash().delete(key, hashKey);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Map中自增數字* @param key 鍵* @param hashKey Map的key* @param delta 遞增的基數* @return*/public static long getAddNumberForMap(Object key, Object hashKey, long delta) {try {return redisTemplate.opsForHash().increment(key, hashKey, delta);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取自增數字* @param key 鍵* @param delta 遞增的基數* @return*/public static long getAddNumber(String key, long delta) {try {RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());return counter.addAndGet(delta);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向左添加元素* @param key 鍵* @param value 值*/public static void leftPush(Object key, Object value) {try {redisTemplate.opsForList().leftPush(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向左添加元素-集合* @param key 鍵* @param values 值(集合)*/public static void leftPushAll(Object key, Collection<Object> values) {try {redisTemplate.opsForList().leftPushAll(key, values);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向右添加元素* @param key 鍵* @param value 值*/public static void rightPush(Object key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向 pivot 右邊添加元素* @param key 鍵* @param pivot 已存在的值* @param value 值*/public static void rightPush(Object key, Object pivot, Object value) {try {redisTemplate.opsForList().rightPush(key, pivot, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向右添加元素-集合* @param key 鍵* @param values 值(集合)*/public static void rightPushAll(Object key, Collection<Object> values) {try {redisTemplate.opsForList().rightPushAll(key, values);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向左彈出元素* @param key 鍵* @return*/public static Object leftPop(Object key) {try {return redisTemplate.opsForList().leftPop(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 向右彈出元素* @param key 鍵* @return*/public static Object rightPop(Object key) {try {return redisTemplate.opsForList().rightPop(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 將list中的元素截取,并存為新值* @param key* @param start* @param end -1代表全部* @return*/public static void listTrim(Object key, long start, long end) {try {redisTemplate.opsForList().trim(key, start, end);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取集合長度* @param key 鍵* @return*/public static long size(Object key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取集合中指定下標的元素* @param key 鍵* @param index 下標* @return*/public static Object index(Object key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取指定區間的集合元素* @param key* @param start* @param end* @return*/public static List<Object> getList(Object key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取集合元素* @param key* @return*/public static List<Object> getAllList(Object key) {try {return redisTemplate.opsForList().range(key, 0, -1);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 集合添加指定下表元素* @param key* @param index* @param value*/public static void addToList(Object key, int index, Object value) {try {redisTemplate.opsForList().set(key, index, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 刪除List中的元素* @param key* @param value*/public static void removeToList(Object key, Object value) {try {redisTemplate.opsForList().remove(key, 0, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 鎖* @param key* @return*/public static RLock getLock(String key) {return redissonClient().getLock(key);}/* Set *//*** 添加Set元素* @param key* @param value 單個或多個...*/public static void addToSet(Object key, Object value) {try {redisTemplate.opsForSet().add(key, value);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Set集合* @param key* @return*/public static Set getToSet(Object key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 移除Set中的元素* @param key* @param values*/public static void deleteToSet(Object key, Object values) {try {redisTemplate.opsForSet().remove(key, values);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取Set長度* @param key* @return*/public static Long sizeToSet(Object key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 添加ZSet元素* @param key* @param value* @param score*/public static void addToZSet(Object key, Object value, double score) {try {redisTemplate.opsForZSet().add(key, value, score);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 添加所有ZSet元素* @param key* @param datas key-score 所有元素*/public static void addToZSetAll(Object key, Map<String, Double> datas) {try {if (datas != null && !datas.isEmpty()) {Set<ZSetOperations.TypedTuple<Object>> tupleDatas = new HashSet<>();for (Entry<String, Double> entry : datas.entrySet()) {ZSetOperations.TypedTuple<Object> item = new DefaultTypedTuple<>(entry.getKey(), entry.getValue());tupleDatas.add(item);}redisTemplate.opsForZSet().add(key, tupleDatas);}} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 合并多個ZSet集合,存入新的集合* @param key 當前集合Key* @param otherKeys 需要合并的即可Keys* @param destKey 合并之后存入的新集合Key*/public static void unionMoreZSet(Object key, Collection<Object> otherKeys, Object destKey) {try {redisTemplate.opsForZSet().unionAndStore(key, otherKeys, destKey);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取多個ZSet集合的交集,存入新的集合* @param key 當前集合Key* @param otherKeys 需要合并的即可Keys* @param destKey 合并之后存入的新集合Key*/public static void intersectMoreZSet(Object key, Collection<Object> otherKeys, Object destKey) {try {redisTemplate.opsForZSet().intersectAndStore(key, otherKeys, destKey);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取ZSet長度* @param key*/public static Long sizeToZSet(Object key) {try {return redisTemplate.opsForZSet().size(key);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取指定區間ZSet集合元素(可用作分頁查詢)* @param key* @param start* @param end -1代表全部* @return*/public static Set<Object> getSubZSet(Object key, long start, long end) {try {return redisTemplate.opsForZSet().range(key, start, end);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 倒序獲取指定區間ZSet集合元素(可用作分頁查詢)* @param key* @param start* @param end -1代表全部* @return*/public static Set<Object> getSubZSetDesc(Object key, long start, long end) {try {return redisTemplate.opsForZSet().reverseRange(key, start, end);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取ZSet集合元素* @param key* @return*/public static Set<Object> getAllZSet(Object key) {try {return redisTemplate.opsForZSet().range(key, 0, -1);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取指定分值區間的ZSet集合元素* @param key* @param min* @param max* @return*/public static Set<Object> getRangeScoreToZSet(Object key, double min, double max) {try {return redisTemplate.opsForZSet().rangeByScore(key, min, max);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 獲取ZSet集合元素的Score* @param key* @param eo 元素* @return*/public static double getZSetItemScore(Object key, Object eo) {try {return redisTemplate.opsForZSet().score(key, eo);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 移除ZSet集合元素* @param key* @return*/public static void removeToZSet(Object key, Object values) {try {redisTemplate.opsForZSet().remove(key, values);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}/*** 設置key過期時間* @param key* @return*/public static void setTimeOut(Object key, long timeout, TimeUnit unit) {try {redisTemplate.expire(key, timeout, unit);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}//#################################################################################//#################################################################################//##################                    Redis簡易版消息隊列                                          ##################//#################################################################################//#################################################################################/*** 生成消息* @param channel 頻道* @param message 消息對象*/public static void convertAndSend(String channel, Object message) {try {redisTemplate.convertAndSend(channel, message);} catch (Exception e) {e.printStackTrace();if (e instanceof RedisConnectionFailureException) {throw new SNEBizException(SystemErrorEnum.REDIS_NOT_CONNECTION);} else {throw new SNEBizException(SystemErrorEnum.REDIS_CACHE_ERROR);}}}public static Long increment(String key, Long incr) {return redisTemplate.opsForValue().increment(key, incr);}}

2:redis分布式鎖

package com.oceania.b2b.framework.redis.service;import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RFuture;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;/*** Redisson 分布式鎖工具類(增強版)** ? 支持 Runnable / Supplier 模板執行* ? 支持重入標識(當前線程多次加鎖)* ? 支持重試機制(自動嘗試獲取鎖)* ? 支持異步鎖(異步執行任務)*/
@Slf4j
@Component
public class RedissonDistributedLocker {private final RedissonClient redissonClient;// 當前線程內已持有的鎖 key -> count(用于記錄當前線程內是否已經持有某個鎖(以及重入次數))private final ThreadLocal<Map<String, AtomicInteger>> reentrantLockHolder =ThreadLocal.withInitial(ConcurrentHashMap::new);public RedissonDistributedLocker(RedissonClient redissonClient) {this.redissonClient = redissonClient;}// ------------------ 基礎方法 ------------------/*** 嘗試獲取鎖(等待 + 自動釋放)*  1:如果當前線程已持有該鎖,則只是遞增計數*  2:否則調用 Redisson 的 tryLock()。*  3:如果獲取成功,記錄鎖信息。*/public boolean tryLock(String key, long waitTime, long leaseTime, TimeUnit unit) {try {if (isReentrant(key)) {incrementReentrant(key);// 支持重入return true;}RLock lock = redissonClient.getLock(key);boolean locked = lock.tryLock(waitTime, leaseTime, unit); // 嘗試獲取鎖if (locked) {incrementReentrant(key);// 成功則計入當前線程}return locked;} catch (InterruptedException e) {Thread.currentThread().interrupt();log.warn("線程中斷,獲取鎖失敗,key={}", key, e);return false;}}/*** 阻塞加鎖(自動釋放)* 同樣支持重入。* 若當前線程未持有,則調用 Redisson 的 lock() 方法(阻塞直到成功)。*/public void lock(String key, long leaseTime, TimeUnit unit) {if (isReentrant(key)) {incrementReentrant(key);return;}RLock lock = redissonClient.getLock(key);lock.lock(leaseTime, unit);incrementReentrant(key);}/*** 解鎖* 檢查當前線程是否持有該鎖(通過 ThreadLocal)* 遞減鎖引用計數,只有降為 0 時才真正執行 unlock()*/public void unlock(String key) {if (!isReentrant(key)) {return;}decrementOrRemove(key);if (!isReentrant(key)) {RLock lock = redissonClient.getLock(key);if (lock.isHeldByCurrentThread()) {lock.unlock();}}}/*** 解鎖(傳入 RLock)* 提供更底層的 RLock 解鎖接口,用于異步鎖釋放時調用。*/public void unlock(RLock lock) {if (lock != null && lock.isHeldByCurrentThread()) {lock.unlock();}}// ------------------ 可重入支持 ------------------/*** 當前線程是否持有 key 對應的鎖* @param key* @return*/private boolean isReentrant(String key) {return reentrantLockHolder.get().containsKey(key);}/*** 加鎖時計數 +1* @param key*/private void incrementReentrant(String key) {reentrantLockHolder.get().computeIfAbsent(key, k -> new AtomicInteger(0)).incrementAndGet();}/***  解鎖時計數 -1,歸零后移除(釋放鎖)* @param key*/private void decrementOrRemove(String key) {Map<String, AtomicInteger> map = reentrantLockHolder.get();AtomicInteger counter = map.get(key);if (counter != null) {if (counter.decrementAndGet() <= 0) {map.remove(key);}}if (map.isEmpty()) {reentrantLockHolder.remove();}}// ------------------ 執行模板(同步) ------------------/*** 封裝:加鎖 + 執行 + 解鎖* 避免業務層忘記釋放鎖,提升代碼安全性* @param key* @param leaseTime* @param unit* @param task*/public void lock(String key, long leaseTime, TimeUnit unit, Runnable task) {lock(key, leaseTime, unit);try {task.run();} finally {unlock(key);}}/*** 加鎖執行有返回值的邏輯,適合用于 ID 生成、緩存初始化等* @param key* @param leaseTime* @param unit* @param task* @return* @param <T>*/public <T> T lockAndReturn(String key, long leaseTime, TimeUnit unit, Supplier<T> task) {lock(key, leaseTime, unit);try {return task.get();} finally {unlock(key);}}// ------------------ 支持重試機制 ------------------public boolean tryLockWithRetry(String key, long leaseTime, long totalWaitTime, long retryInterval, TimeUnit unit) {long deadline = System.currentTimeMillis() + unit.toMillis(totalWaitTime);while (System.currentTimeMillis() < deadline) {if (tryLock(key, 0, leaseTime, unit)) {return true;}try {Thread.sleep(unit.toMillis(retryInterval));} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}return false;}/*** 若初次未獲取鎖,可自動等待重試* 常用于不想立刻失敗的場景,如資源初始化、消息消費* @param key* @param leaseTime* @param totalWaitTime* @param retryInterval* @param unit* @return*/public void tryLockWithRetry(String key, long leaseTime, long totalWaitTime, long retryInterval, TimeUnit unit, Runnable task) {boolean locked = tryLockWithRetry(key, leaseTime, totalWaitTime, retryInterval, unit);if (!locked) {throw new RuntimeException("無法獲取鎖: " + key);}try {task.run();} finally {unlock(key);}}// ------------------ 異步鎖支持 ------------------/*** Redisson 的異步鎖封裝* 用于異步任務執行時保護共享資源(非阻塞)* @param key* @param leaseTime* @param unit* @param task* @return*/public CompletableFuture<Void> lockAsync(String key, long leaseTime, TimeUnit unit, Runnable task) {RLock lock = redissonClient.getLock(key);RFuture<Void> future = lock.lockAsync(leaseTime, unit);return future.toCompletableFuture().thenRunAsync(() -> {try {task.run();} finally {unlock(lock);}});}public <T> CompletableFuture<T> lockAsync(String key, long leaseTime, TimeUnit unit, Supplier<T> supplier) {RLock lock = redissonClient.getLock(key);RFuture<Void> future = lock.lockAsync(leaseTime, unit);return future.toCompletableFuture().thenApplyAsync(ignored -> {try {return supplier.get();} finally {unlock(lock);}});}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87671.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mybatis-plus-01-環境初始化及簡單應用

文章目錄 【README】【1】springboot集成mybatis-plus配置【1.1】目錄結構【相關說明】 【1.2】代碼示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表語句】 【2】演示 【README】 本文代碼參見&…

VR小鼠解剖虛擬仿真:開啟生命科學教育新視野?

VR 小鼠解剖虛擬仿真&#xff0c;是一項將虛擬現實(VR)技術深度融入小鼠解剖學習與研究過程的創新應用&#xff0c;即 VR 小鼠解剖虛擬仿真。其核心原理在于&#xff0c;借助 VR 技術所構建的高度逼真的虛擬環境&#xff0c;突破了傳統小鼠解剖在時間、空間以及實體操作上的諸多…

計算機網絡(網頁顯示過程,TCP三次握手,HTTP1.0,1.1,2.0,3.0,JWT cookie)

前言 最近一直在后端開發的面經&#x1f64c;&#xff0c;里面涉及到了好多計算機網絡的知識&#x1f601;&#xff0c;在這里以問題的形式寫一個學習筆記&#xff08;其中參考了: JavaGuide 和 小林coding 這兩個很好的學習網站&#x1f618;&#xff09; 1.當鍵入網址后&am…

Redis 消息的發布和訂閱

Redis 消息的發布和訂閱 1、什么是發布和訂閱 Redis 發布訂閱 (pub/sub) 是一種消息通信模式&#xff1a;發送者 (pub) 發送消息&#xff0c;訂閱者 (sub) 接收消息。 Redis 客戶端可以訂閱任意數量的頻道。 2、Redis的發布和訂閱示意 1、客戶端可以訂閱頻道如下圖 2、當…

python優先隊列使用

heapq 是 Python 的一個內置模塊&#xff0c;提供了堆隊列算法的實現&#xff0c;也稱為優先隊列算法。以下是關于 heapq 模塊的詳細使用說明。 基本概念 堆&#xff1a;一種特殊的二叉樹結構&#xff0c;滿足父節點總是小于或等于其子節點&#xff08;最小堆&#xff09;特性…

在 Windows 機器上安裝和配置 RabbitMQ

RabbitMQ 它是一款基于 AMQP&#xff08;高級消息隊列協議&#xff09;的流行消息代理。RabbitMQ 適用于 Windows、Linux 和 macOS&#xff0c;易于安裝和使用&#xff0c;并提供一系列強大的消息隊列和路由功能。要在 Windows 計算機上使用 RabbitMQ&#xff0c;您必須先安裝 …

第十五節:第六部分:日志技術:logback的核心配置文件詳解、日志級別

核心配置文件logback.xml 什么是日志級別&#xff0c;為什么要學日志級別

從入門到精通:數據庫全攻略

目錄一、數據庫基礎概念1.1 數據庫定義1.2 數據庫與文件系統的區別1.3 數據庫系統組成部分1.4 關系型數據庫與非關系型數據庫二、數據庫安裝與配置2.1 下載 MySQL2.2 安裝 MySQL2.3 初始化數據庫服務器2.4 啟動和停止 MySQL 服務2.5 登錄 MySQL2.6 創建數據庫2.7 創建數據表三、…

【JAVA】消息隊列(MQ)是個好東西

一、前言再JAVA系統開發中&#xff0c;再高并發的場景經常需要使用到消息隊列&#xff0c;有時候是不得不使用到消息對了。特別是大數據量的并發處理。對數據實時性要求又沒那么高的情況下。用戶請求 → 接入層(Nginx) → 限流 → 消息隊列 → 訂單服務 → 庫存服務 → 支付服務…

【Golang面試題】Go結構體的特點,與其它語言的區別

Go 結構體深度解析&#xff1a;與 C/C、Java 的全面對比 一、核心概念對比特性Go 結構體 (struct)C/C 結構體 (struct)Java 類 (class)本質值類型復合數據類型值類型復合數據類型引用類型內存分配棧或堆 (編譯器決定)棧 (顯式控制)堆 (JVM管理)默認訪問權限首字母大寫導出publi…

CppCon 2018 學習:OOP is dead, long live Data-oriented design

探討了面向對象編程&#xff08;OOP&#xff09;的一些根本性問題深入理解&#xff1a; 標題&#xff1a;What is so wrong with OOP? 什么是面向對象的問題&#xff1f; 這不是說 OOP “絕對錯誤”&#xff0c;而是指出它在實踐中經常引發的問題&#xff0c;尤其是在性能敏…

科學的第五范式:人工智能如何重塑發現之疆

在人類探索未知的壯闊史詩中&#xff0c;科學方法的演進如同照亮迷霧的燈塔。從基于經驗的第一范式&#xff08;描述自然現象&#xff09;&#xff0c;到以理論推演為核心的第二范式&#xff08;牛頓定律、麥克斯韋方程&#xff09;&#xff0c;再到以計算機模擬為標志的第三范…

tmux 左下角會話名顯示不全的解決方法

在 tmux 中顯示完整的會話名 有時候我們要在服務器上長時間跑某個任務&#xff0c;但不可能時時刻刻保持終端模擬器開啟&#xff0c;這時候就需要用到 tmux &#xff0c;可以在關閉會話的同時讓任務繼續在后臺跑&#xff0c;后續還可以連回來。但在 tmux 會話中&#xff0c;左…

【期末分布式】分布式的期末考試資料大題整理

&#x1f9f8;安清h&#xff1a;個人主頁 &#x1f3a5;個人專欄&#xff1a;【Spring篇】【計算機網絡】【Mybatis篇】 &#x1f3af;大題 ?一.Nacos的服務注冊與發現 &#x1f6a6;1.怎么來進行服務的注冊與發現的這樣的一個流程&#xff0c;描述一下。 &#x1f383;描述…

Android手機無網離線使用FunASR識別麥克風語音內容

手機斷網離線使用FunASR識別麥克風語音內容 --本地AI電話機器人 上一篇&#xff1a;阿里FunASR本地斷網離線識別模型簡析 下一篇&#xff1a;手機無網離線使用FunASR識別手機歷史通話錄音 一、前言 繼上一篇《阿里FunASR本地斷網離線識別模型簡析》和前面幾篇ASR相關理論的…

Stable Diffusion 項目實戰落地:從0到1 掌握ControlNet 第五篇 線稿到高清修復:一步步教你用AI做出完美IP形象

大家好!上一篇,我們一起玩轉了字體風格變換 ,讓文字根據提示詞進行自如變換,個性十足又充滿創意! 如果你錯過了那篇文章,別擔心,趕緊點這里補課:Stable Diffusion 項目實戰落地:從0到1 掌握ControlNet 第四篇 風格化字體大揭秘:從線稿到涂鴉,ControlNet讓文字煥發新生…

Java網絡編程:TCP/UDP套接字通信詳解

TCP客戶端套接字創建與使用 Socket類基礎概念 Socket類的對象代表TCP客戶端套接字&#xff0c;用于與TCP服務器套接字進行通信。與服務器端通過accept()方法獲取Socket對象不同&#xff0c;客戶端需要主動執行三個關鍵步驟&#xff1a;創建套接字、綁定地址和建立連接。 客戶端…

VMware vSphere 9與ESXi 9正式發布:云原生與AI驅動的虛擬化平臺革新

2025年6月18日&#xff0c;VMware正式推出其旗艦虛擬化平臺vSphere 9及配套的ESXi 9操作系統&#xff0c;標志著企業級虛擬化技術邁入以云原生、人工智能&#xff08;AI&#xff09;和硬件加速為核心的新紀元。此次更新不僅在功能層面實現突破&#xff0c;更通過授權模式革新為…

汽車功能安全概念階段開發【相關項定義HARA】2

文章目錄 1 淺談概念階段開發2 功能安全概念階段開發2.1 相關項定義2.2 危害分析與風險評估&#xff08;HARA-Hazard Analysis and Risk Assessment&#xff09; 3 關鍵輸出與對后續階段的影響4 總結 1 淺談概念階段開發 概念階段開發是整個研發流程的起點和基石。它發生在任何…

WPF中依賴屬性和附加屬性

依賴屬性&#xff08;DependencyProperty&#xff09; 依賴屬性是WPF中的一種特殊屬性&#xff0c;它的實現依賴于DependencyObject類提供的基礎設施。與普通的.NET屬性不同&#xff0c;依賴屬性的值可以通過多種方式確定&#xff0c;包括繼承、樣式、數據綁定和動畫等。 主要特…