1、配置redis集群
<?xml version="1.0" encoding="UTF-8"?> <redisCluster> <!--userRoute --> <clusterGroup name="userRoute" selectdb="1"> <server host="10.177.129.16" port="6379"></server> <server host="10.177.129.15" port="6379"></server> </clusterGroup> <!--sessionRoute --> <clusterGroup name="sessionRoute" selectdb="2"> <server host="10.177.129.16" port="6379"></server> <server host="10.177.129.15" port="6379"></server> </clusterGroup> <!--publicData --> <clusterGroup name="publicData"> <server host="10.177.129.16" port="6379"></server> <server host="10.177.129.15" port="6379"></server> </clusterGroup> </redisCluster>
2、創建redis連接屬性實體類
package net.itxm.cms.syscore.pojo; /** * redis連接屬性 * */ public class RedisCluster { private String selectdb; private String hostIp; private String port; public String getSelectdb() { return selectdb; } public void setSelectdb(String selectdb) { this.selectdb = selectdb; } public String getHostIp() { return hostIp; } public void setHostIp(String hostIp) { this.hostIp = hostIp; } public String getPort() { return port; } public void setPort(String port) { this.port = port; } }
3、解析redis集群配置
package net.itxm.itreasury.test.jedis; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; /** * 解析redis集群配置 * */ public class RedisConfig { public static Map<String,List<RedisCluster>> redisGroupMap = null; //有參構造函數 public RedisConfig() { } //獲取所有clusterGroup組的鍵值對 public static Map<String,List<RedisCluster>> getRedisGroupMap(){ //讀取xml文件 Document document=readXmlFile(); //獲得clusterGroup節點的key 和 list if(redisGroupMap == null) { redisGroupMap=getMapByItemsGroup(document); } return redisGroupMap; } //讀取redisConfig配置文件 private static Document readXmlFile(){ //創建讀入對象 SAXReader reader = new SAXReader(); //創建document實例 Document doc=null; try { //從類路徑下加載文件redisConfig.xml Resource resource = new ClassPathResource("redisClusterConfig.xml"); //指定文件資源對應的編碼格式(UTF-8),這樣才能正確讀取文件的內容,而不會出現亂碼 EncodedResource encodeResource = new EncodedResource(resource,"UTF-8"); doc = reader.read(encodeResource.getReader()); } catch (IOException e) { System.out.println("無法讀取系統配置文件redisConfig.xml,可能該文件不存在"); } catch (DocumentException e) { System.out.println("解析redisConfig.xml文件出現異常"); } return doc; } //讀取xml節點,返回節點為redisGroup的Map private static Map<String,List<RedisCluster>> getMapByItemsGroup(Document document){ Map<String,List<RedisCluster>> itemmap=new HashMap<String,List<RedisCluster>>(); try{ //獲得根節點 Element root=document.getRootElement(); //獲得根節點下所有子節點clusterGroup的list List itemsList=root.selectNodes("./clusterGroup"); for(int i=0;i<itemsList.size();i++){ //獲得節點Items Element items=(Element)itemsList.get(i); String groupName=items.attribute("name").getText(); String selectdb = items.attribute("selectdb")==null?"":items.attribute("selectdb").getText(); // if(groupName!=null&&groupName.equals(this.getGroupName())){ //獲得clusterGroup下所有子節點service的list List itemList=items.elements(); //獲得service節點的值 List<RedisCluster> redisClusterList = getItemList(itemList,selectdb); itemmap.put(groupName, redisClusterList); // } } } catch(Exception e){ } return itemmap; } //獲得所有Item下節點的redis服務節點 private static List<RedisCluster> getItemList(List itemList,String selectdb){ List<RedisCluster> redisClusterList = new ArrayList<RedisCluster>(); for(int i=0;i<itemList.size();i++){ //獲得節點server Element item=(Element)itemList.get(i); String hostIp = item.attribute("host").getText(); String port = item.attribute("port").getText(); RedisCluster redisCluster =new RedisCluster(); redisCluster.setHostIp(hostIp); redisCluster.setPort(port); redisCluster.setSelectdb(selectdb); redisClusterList.add(redisCluster); } return redisClusterList; } public static void main(String[] args) { getRedisGroupMap(); //JedisUtil.insertPublicDataObject("user1", "張三", JedisUtil.ONLINE_USER); //JedisUtil.insertPublicDataObject("user2", "李四", JedisUtil.ONLINE_USER); //JedisUtil.insertPublicDataObject("user3", "王五", JedisUtil.ONLINE_USER); Set s = JedisUtil.getAllSet(JedisUtil.ONLINE_USER); Iterator it = s.iterator(); while (it.hasNext()) { String key = (String) it.next(); String value = JedisUtil.getString(key,JedisUtil.ONLINE_USER); System.out.println(key + value); } String test = JedisUtil.getString("user1",JedisUtil.ONLINE_USER); System.out.println(test); } }
4、操作redis數據庫的工具類
package net.itxm.cms.syscore.utils; import java.lang.reflect.Type; import java.util.List; import java.util.Set; import java.util.zip.CRC32; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisConnectionException; import com.google.gson.Gson; import com.isoftstone.cms.syscore.pojo.RedisCluster; public class JedisUtil { // 數據庫 public static final String STORE_LOGINUSER = "4";// 商戶登陸用戶 public static final String STORE_INFO = "5";// 商戶狀態 商戶購買服務有效期 public static final String CHECK_CODE = "6";// 驗證碼 public static final String MENU = "7";// 全部菜單 public static final String SERVICE = "8";// 服務收費信息 public static final String STORE_LOGINKEY = "9";// 初始化登錄公鑰 私鑰對 // 固定key public static final String ALL_MENU_KEY = "ALL_MENU_KEY"; public static final String BUY_SERVICE_KEY = "BUY_SERVICE_KEY";// 服務收費購買key public static final String ALL_SERVICE_KEY = "ALL_SERVICE_KEY";//所有服務 public static final String MENU_AUTHORITY = "MENU_AUTHORITY";// 菜單權限 public static final String STORE_MENU_KEY = "STORE_MENU_KEY";// 需要商戶分配的業務菜單 public static final String STORE_SERVICE_KEY = "STORE_SERVICE_KEY";// 商戶收費key public static final String SYSTE_MENU_KEY = "SYSTE_MENU_KEY";// 系統管理菜單key // jedis服務組業務類型 public static final String CONT_CLUSTERNAME_PUBLICDATA = "publicData"; public static final String CONT_CLUSTERNAME_SESSIONROUTE = "sessionRoute"; public static final String CONT_CLUSTERNAME_USERROUTE = "userRoute"; // 操作方式 0 插入 1獲取 2 刪除 public static final long INSERT_OPERATION = 0; public static final long GET_OPERATION = 1; public static final long DELETE_OPERATION = 2; // 驗證碼過期秒數 public static final int CHECKCODE_EXPIRESECONDS = 5*60; // session過期秒數 public static final int EXPIRESECONDS = 30 * 60; private static void closeJedis(Jedis jedis) { try { jedis.quit(); } catch (JedisConnectionException e) { e.printStackTrace(); } jedis.disconnect(); } /** * 根據Key獲取字符串 * * @param key * @param jedisGroup */ public static String getString(String key, String selectdb) { Jedis jedis = getPublicDataJedis(key, GET_OPERATION, selectdb); return jedis.get(key); } /** * 獲取所有數據set * @param selectdb * @return */ public static Set getAllSet(String selectdb) { Jedis jedis = getDataJedis(GET_OPERATION, selectdb); return jedis.keys("*"); } /** * 默認取配置文件的第一個數據庫 * @param operation * @param selectdb * @return */ private static Jedis getDataJedis(long operation, String selectdb) { if (RedisConfig.redisGroupMap == null) { RedisConfig.redisGroupMap = RedisConfig.getRedisGroupMap(); } List<RedisCluster> clustersList = RedisConfig.redisGroupMap.get(CONT_CLUSTERNAME_PUBLICDATA); int clusterNo = 0;//默認存到第一個 RedisCluster cluster = clustersList.get(clusterNo); Jedis jedis = new Jedis(cluster.getHostIp(), Integer.valueOf(cluster.getPort())); jedis.select(Integer.valueOf(selectdb)); return jedis; } /** * 刪除數據 * * @param key * @param jedisGroup */ public static void deleteObject(String key, String jedisGroup) { Jedis jedis = getJedis(key, jedisGroup, DELETE_OPERATION); jedis.del(key); closeJedis(jedis); } /** * 刪除公共數據 * * @param key * @param objClass * @param selectdb */ public static void deletePublicDataObject(String key, String selectdb) { Jedis jedis = getPublicDataJedis(key, DELETE_OPERATION, selectdb); jedis.del(key); closeJedis(jedis); } /** * 獲取jedis的庫實例 * * @param key * @param jedisGroup * @param operation * @return */ private static Jedis getJedis(String key, String jedisGroup, long operation) { if (RedisConfig.redisGroupMap == null) { RedisConfig.redisGroupMap = RedisConfig.getRedisGroupMap(); } List<RedisCluster> clustersList = RedisConfig.redisGroupMap.get(jedisGroup); int arrayLength = clustersList.size(); // 根據key值算出該信息應該存入到那個 int clusterNo = getRedisNo(key, arrayLength); RedisCluster cluster = clustersList.get(clusterNo); Jedis jedis = new Jedis(cluster.getHostIp(), Integer.valueOf(cluster.getPort())); jedis.select(Integer.valueOf(cluster.getSelectdb())); return jedis; } /** * redis key值獲取對象 * * @param key * @param objClass * @param jedisGroup * @return */ public static Object getObject(String key, Class objClass, String jedisGroup) { Jedis jedis = getJedis(key, jedisGroup, GET_OPERATION); String sObj = jedis.get(key); closeJedis(jedis); Gson gson = new Gson(); return gson.fromJson(sObj, objClass); } /** * 獲取公共數據jedis的庫實例 * * @param key * @param jedisGroup * @param operation * @return */ private static Jedis getPublicDataJedis(String key, long operation, String selectdb) { if (RedisConfig.redisGroupMap == null) { RedisConfig.redisGroupMap = RedisConfig.getRedisGroupMap(); } List<RedisCluster> clustersList = RedisConfig.redisGroupMap.get(CONT_CLUSTERNAME_PUBLICDATA); int arrayLength = clustersList.size(); // 根據key值算出該信息應該存入到那個 int clusterNo = getRedisNo(key, arrayLength); RedisCluster cluster = clustersList.get(clusterNo); Jedis jedis = new Jedis(cluster.getHostIp(), Integer.valueOf(cluster.getPort())); jedis.select(Integer.valueOf(selectdb)); return jedis; } /** * publicdata redis key值獲取對象 * * @param key * @param objClass * @param jedisGroup * @return */ public static Object getPublicDataObject(String key, Class objClass, String selectdb) { Jedis jedis = getPublicDataJedis(key, GET_OPERATION, selectdb); String sObj = jedis.get(key); closeJedis(jedis); Gson gson = new Gson(); return gson.fromJson(sObj, objClass); } /** * publicdata redis key值獲取對象 List<Entity> * * @param key * @param objClass * @param jedisGroup * @return */ public static Object getPublicDataObjectByType(String key, Type type, String selectdb) { Jedis jedis = getPublicDataJedis(key, GET_OPERATION, selectdb); String sObj = jedis.get(key); closeJedis(jedis); Gson gson = new Gson(); return gson.fromJson(sObj, type); } /** * 獲取redis服務器庫編號 * * @param hashKey * @return */ public static int getRedisNo(String key, int arraySize) { long hashKey = hash(key); int redisNo = (int) (hashKey % arraySize); return redisNo; } /** * 根據key值算出hash值 * * @param k * @return */ public static long hash(String k) { CRC32 crc32 = new CRC32(); crc32.update(k.getBytes()); return crc32.getValue(); } /** * redis 根據key值將對象插入到不同的庫中 * * @param key * @param insertObj * @param jedisGroup */ public static void insertObject(String key, Object insertObj, String jedisGroup) { Jedis jedis = getJedis(key, jedisGroup, INSERT_OPERATION); Gson gson = new Gson(); jedis.set(key, gson.toJson(insertObj)); closeJedis(jedis); } /** * redis 根據key值將對象插入到不同的庫中 * * @param key * @param insertObj * @param jedisGroup * @param expire */ public static void insertObject(String key, Object insertObj, String jedisGroup, int expireSeconds) { Jedis jedis = getJedis(key, jedisGroup, INSERT_OPERATION); Gson gson = new Gson(); jedis.setex(key, expireSeconds, gson.toJson(insertObj)); closeJedis(jedis); } /** * publicdata redis 根據key值將對象插入到不同的庫中 * * @param key * @param insertObj * @param jedisGroup */ public static void insertPublicDataObject(String key, Object insertObj, String selectdb) { Jedis jedis = getPublicDataJedis(key, INSERT_OPERATION, selectdb); Gson gson = new Gson(); jedis.set(key, gson.toJson(insertObj)); closeJedis(jedis); } /** * publicdata redis 根據key值將對象插入到不同的庫中, * * @param key * @param insertObj * @param jedisGroup * @param expireSeconds */ public static void insertPublicDataObject(String key, Object insertObj, String selectdb, int expireSeconds) { Jedis jedis = getPublicDataJedis(key, INSERT_OPERATION, selectdb); Gson gson = new Gson(); jedis.setex(key, expireSeconds, gson.toJson(insertObj)); closeJedis(jedis); } /** * 更新redis中key的超時時間 * * @param key * @param jedisGroup * @param expireSeconds */ public static void resetExpireSeconds(String key, String jedisGroup, int expireSeconds) { Jedis jedis = getJedis(key, jedisGroup, GET_OPERATION); jedis.expire(key, expireSeconds); closeJedis(jedis); } }
5、所需jar包