redis集群若想實現多key的事務控制,可能根據分片演算法會分配到不同的jedisclient,導致無法進行事務控制,這應該就是redis集群不支援事務的核心原因。但是若是單個key的get()獲取值之後再set(),可以使用單個jedis連線的watch、multi()、exec()來實現,防止get()之後其它client又set()導致資料和預期不一致的場景。
redis實現事務方式三種:
1: 跟spring結合事務,只單台redis支援,redis集群就無法滿足。
3:自定義實現方式,可以通過佇列實現,手動提交,手動回滾。
基於spring cloud 專案使用redis本身事務配置如下:
首先獲取redis集群配置的伺服器與埠:
@configuration
@configurationproperties(prefix = "spring.redis.cluster")
public class redisclusterproperties
public void setnodes(listnodes)
}jediscluster配置
/*** jediscluster配置
* @classname: jedisclusterconfig
* @date: 2019-1-28
*/@configuration
public class jedisclusterconfig
string serverarray = redisclusterproperties.getnodes().get(0).split(",");
setnodes = new hashset<>();
for (string node:serverarray)
return new jediscluster(nodes);}}
呼叫的工具類:
private static threadlocaltxthreadlocal = new threadlocal<>();
private static threadlocalclusterthreadlocal= new threadlocal<>();
/*** @title: multi
* @description: 開啟事務使用redis事務必須呼叫此方法
*/public static void multi()
/*** 儲存string資料型別,如果存的是物件,則格式化為json格式
* @param key
* @param value
*/public static void set(string key,string value)
/*** 批量儲存string資料型別
* @param key
* @param value
*/public static void mset(string... keysvalues)
/*** 批量儲存hash資料型別
* @param key
* @param value
*/public static void hmset(string key,maphash)
/*** 儲存list資料型別
* @param key
* @param value
*/public static void lpush(string key,string... values)
/*** 儲存set資料型別
* @param key
* @param value
*/public static void sadd(string key,string... member)
/*** 儲存sorted set資料型別
* @param key
* @param value
*/public static void zadd(string key,mapscoremembers)
/*** 通用刪除
* @param key
* @param value
*/public static void del(string... keys) }}
/*** 刪除hash
* @param key
* @param value
*/public static void hdel(string key,string... field)
/*** 刪除set
* @param key
* @param value
*/public static void srem(string key,string... member)
/*** 刪除sorted set
* @param key
* @param value
*/public static void zrem(string key,string... member)
/*** 提交
*/public static void exec() }}
/*** 回滾
*/public static void discard() }}
/*** 根據key,得到事務物件
* @param cluster
* @param key
* @return
*/private static transaction settxbykey(string key)
mapmap = cluster.getclusternodes();
for(entryentry:map.entryset()) catch (exception e)
}return null;
}/**
* 根據key,獲取資料
* @param key
* @return
*/public static t getbykey(string key,classcls)
} catch (exception e)
if (null != obj)
}return json.parseobject(json.tojsonstring(obj), cls);
}/**
* 刪除方法
* @param key
*/private static void delbykey(string key) catch (exception e) }}
/***
* @return
*/public static jedispoolconfig getjedispoolconfig()
public static void delallclusterkey(string keypattern) catch (exception e)
}if (!keys.isempty()) }}
}
Spring Cloud Redis 介面冪等性
冪等性原本是數學上的概念,即使公式 f x f f x 能夠成立的數學性質。用在程式設計領域,則意為對同乙個系統,使用同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的。介面的增刪改查操作 1.查詢是天然的冪等操作 2.刪除一次和多次刪除都是把資料刪除。返回結果可能不一樣,刪除的資料不存在...
MySQL cluster集群 NDB集群學習
公司主業務用的mysql集群是官方自帶的mysql cluster,mysql自帶的集群模式,這個集群的模式和mgr pxc 主從 有點不一樣。一 儲存引擎不是innodb,mysql cluster用的是ndb引擎 二 資料儲存方式不同,mysql的其他集群方式資料是存在磁碟上的,中間資料的快取用...
zookeeper集群部署 kafka集群部署
wget wget 解壓到目錄 tar zxvf apache zookeeper 3.5.8 bin.tar.gz c usr local 進入目錄 cd usr local 建立軟連線 ln s usr local apache zookeeper 3.5.8 zookeeper 複製配置檔案 ...