Redis集群版在Java中的应用
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包
Redis集群版在Java中的应用相关推荐
- python redis 集群_python与java中使用redis集群
1.python使用 from rediscluster import StrictRedisCluster redis_nodes = [{'host':'192.168.78.62','port' ...
- Redis集群搭建及java连接redis
Redis集群搭建及java连接redis Redis集群分为三种: 1.主从关系模式2.Sentinel哨兵关系模式3.Cluster去中心化模式 1.主从关系模式 1.1.什么是主从模式? (1) ...
- 阿里云Redis集群版简要介绍
阿里云云数据库Redis集群版火热抢购,详情参见>> 产品简介 云数据库 Redis 提供集群版实例,轻松突破 Redis 自身单线程瓶颈,可极大满足对于 Redis 大容量或高性能的业务 ...
- redis集群安装和java应用
首先是在linux下装redis3.0 以下是我在centos 6.5安装成功的.内容主要是http://redisdoc.com/topic/cluster-tutorial.html 的内容加上走 ...
- 快速搭建redis单机版和redis集群版
单机版 第一步:需要安装redis所需的C语言环境,若虚拟机联网,则执行 yum install gcc-c++ 第二步:redis的源码包上传到linux系统 第三步:解压缩redis tar ...
- redis集群版配置三种方式
redis的三种集群方式 redis有三种集群方式:主从复制,哨兵模式和集群. 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令: 主服务器接收到SYNC命名后,开始执行BGSAV ...
- Linux系统搭建Solr和Redis集群详细步骤
1 搭建Solr集群(SolrCloud) 1.1 Zookeeper介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoo ...
- 淘淘商城第39讲——使用Spring来管理单机版Redis与集群版Redis
我们知道Jedis在处理Redis的单机版和集群版时是完全不同的,有可能在开发的时候使用的是单机版,但是当项目上线后使用的则是集群版,这就需要能够方便的在单机版和集群版之间进行切换了.我们的做法便是定 ...
- lua脚本在redis集群中执行报错--Lua script attempted to access a non local key in a cluster node...
EVAL.EVALSHA命令 Redis从2.6.0版本开始提供了eval命令,通过内置的Lua解释器,可以让用户执行一段Lua脚本并返回数据.因为Redis单线程模型的特点,可以保证多个命令的原子性 ...
最新文章
- 《数据库系统概念》7-函数、存储过程、触发器
- Beta阶段第二次冲刺
- 递归行为时间复杂度估算
- 【IT资讯】华为“鸿蒙”所涉及的微内核究竟是什么
- 过去一年25个amazing node.js 开源项目(2018版本)
- vs2010帮助文件安装完全攻略
- 除以13(信息学奥赛一本通-T1175)
- asp.net 微信小程序源码 微信分销源码 源文件完全开源 源码
- tp5小程序生成二维码保存到七牛云
- arduino 有源 蜂鸣器_arduino实验–有源蜂鸣器报警
- 网络打不其他计算机的共享文件,快速解决“电脑无法访问共享文件夹”的4种方法!...
- 如何下载哔哩哔哩的视频
- 缠论三大套利技术模型
- 没有粉丝能开快手小店吗?做好有何技巧?
- 4ye含泪用python爬取了自己的公众号粉丝数据
- linux如何解压.z文件,linux文件解压缩命令(史上最全教程)
- 个人用户如何保证企业邮箱安全?【网易企业邮箱】
- 《涨知识啦30》-太阳能电池基本工作原理
- 良心推荐5款Python编辑器,请择优选用!
- 网站关键词的选择和优化设置技巧
热门文章
- java窗口向mysql加信息_Java中如何实现向DBC方式向表中添加数据
- mysql基础_MySQL基础
- mall-applet小程序项目是一套电商系统
- 探果(简称tamguo)是基于java开发的在线题库系统
- 3种语言白色汇汇通微盘程序源码
- slf4j日志的最优使用方式
- Window Services的调试和非托管dll的引用及其他一些注意问题
- lnmp 0.4 安装指南
- UITouch 触摸事件处理(实例)
- 微服务四个常见问题,以及SpringCloud Netflix和SpringCloud Alibaba和Apache Dubbo zookeeper区别