Redis集群解决方案----JAVA应用

SSM入门项目-4-Redis解决缓存问题 搭建Redis服务1,服务搭建并开放接口这部分的内容晚上有很多资料,我弄了很久,最后看一下效果。 这代表redis的服务运行起来了,如果想要我们的java能够调用,还有把redis对外的接口暴露出来,6379。2,测试我下载了一个免费的数据库可视化工具叫Redis Desktop Manager,写一个方法测试一下。2.1,测试代码在进行测试之前,需要导入jedis的依赖,我的测试代码写在了co 阅读详情

   上篇文章 Redis集群解决方案 已经已经介绍了Redis应用场景及性能、Redis单机部署以及集群部署的操作,下面将讲解如何使用JAVA客户端调用搭建好的Redis集群环境。

    先搭建一个Java工程JRedisUtils,导入Redis3.0相应的jar,点击此处下载(commons-pool2-2.4.2.jar jedis-3.0.0.jar jedis-3.0.0-javadoc.jar jedis-3.0.0-sources.jar)

   现在直接贴上代码:

 

package com.jredis.util;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


/**
 * Redis分布式调用API
 * @author pengtian
 * @Date 2016年11月17日18:10:52
 */
public class JRedisClient {
	
	
	
    private static String RESULT_OK = "OK";
	private static Set<HostAndPort> clusterNodes = null;
	private static JedisPoolConfig config = null;
	private static JedisCluster jedisCluster=null;
	
	private JRedisClient() {}  
    private static JRedisClient jredisClient=null;  
    //静态工厂方法   
    public static synchronized  JRedisClient getInstance() {  
         if (jredisClient == null) {    
        	 jredisClient = new JRedisClient();  
        	 jredisClient.clusterInit();
         } else{
        	 System.out.println("JRedisClient已经实列化");
         }   
         return jredisClient;  
    }  
	
   /**
    * 获取操作redis的客户端
    * @return
    */
    public JedisCluster getJedisCluster(){
    	if(jedisCluster==null){
    		JRedisClient.getInstance();
    	}
    	return jedisCluster;
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*//JRedisClient jRedisClient =new JRedisClient("192.168.113.134",7006);
		System.out.println("set===>"+jRedisClient.set("key3", "key3333333333333333333"));
		System.out.println("get===>"+jRedisClient.get("key3"));*/
		
		JRedisClient jredisClient =JRedisClient.getInstance();
		jredisClient =JRedisClient.getInstance();
		/*System.out.println(jredisClient.set("FP_100000","FP_100000000000000"));
		System.out.println(jredisClient.get("FP_100000"));
		List<String> list = new ArrayList<String>();
		list.add("LIST1");
		list.add("LIST2");
		list.add("LIST3");
		jredisClient.list("LIST", 3600, list);*/
		
	/*	System.out.println("===>"+jredisClient.lrange("LIST", 0, -1));
		System.out.println("===>"+jredisClient.lrange("LIST", 0, 1));
		List<String> listGet = jredisClient.lrange("LIST",0, 2);
		for(int i=0;i<listGet.size();i++){
			System.out.println("===>"+listGet.get(i).toString());
		}
		*/
		for(int i=1;i<=10;i++){
			jredisClient.set("kEY_"+i,1000,i+"");
		}
		
		for(int i=1;i<=10;i++){
			System.out.println(i+"==>"+jredisClient.get("kEY_"+i));
		}
		
		/*for(int i=1;i<=10000;i++){
			System.out.println(i+"==>"+jredisClient.del("kEY_"+i));
		}*/
		
		/*TreeSet<String> keys = jredisClient.keys("kEY_*"); 
		if(keys.size()>0){  
		   System.out.println("SIZE:"+keys.size());  
		   for(String str:keys){
			   System.out.println("==============>"+str);   
		   }
		} else{
			System.out.println("No keys");  
		}*/
		

	}
	
	
	



	/**
	 * 配置Redis分布式节点
	 */
	private void genClusterNode() {
	    clusterNodes = new HashSet<HostAndPort>();
	    clusterNodes.add(new HostAndPort("192.168.113.133", 7000));
	    clusterNodes.add(new HostAndPort("192.168.113.133", 7011));
	    clusterNodes.add(new HostAndPort("192.168.113.133", 7001));
	    clusterNodes.add(new HostAndPort("192.168.113.134", 7006));
	    clusterNodes.add(new HostAndPort("192.168.113.134", 7007));
	    clusterNodes.add(new HostAndPort("192.168.113.131", 7009));
	    clusterNodes.add(new HostAndPort("192.168.113.131", 7008));
	}
	
	/**
	 * 实列化JRedis 线程池相关配置
	 */
	private void genJedisConfig() {
		 config = new JedisPoolConfig();
		 //pool 最大线程数
	     config.setMaxTotal(100000);
	     // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
	     config.setMaxIdle(100);
	     //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
	     config.setMaxWaitMillis(180);
	     // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
	     config.setTestOnBorrow(true);
	}
	
    /**
     * JRedis分布式初始化
     */
	private void clusterInit() {
		if(jedisCluster == null){
			/*  配置Redis分布式节点 **/
		    genClusterNode();
		    /* 实列化JRedis 线程池相关配置 **/
		    genJedisConfig();
		    
		    jedisCluster = new JedisCluster(clusterNodes, 5000, config);
		}
	}
	
	
	/**
	 * 字符串类型数据存储
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean  set(String key, String value)
    {
		return this.set(key,0,value);
	}
	
	/**
	 * 字符串数据类型存储并设置有效期
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean  set(String key, int seconds,String value)
    {
		boolean isOk = false;
		String returnResult = "";
		if(seconds>0){
			returnResult= jedisCluster.setex(key, seconds, value);
		}else{
			returnResult = jedisCluster.set(key, value);
		}
		if(RESULT_OK.equals(returnResult)){
			isOk = true;
		}
		return isOk;
	}
    
	/**
	 * 获取存储的字符串类型数据
	 * @param key
	 * @return
	 */
	public String get(String key) {
		return jedisCluster.get(key);
	}
	
	/**
	 * Map<String,String>类型数据存储
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean hmset(String key, Map<String,String> hashMap){
		return this.hmset(key, 0, hashMap);
	}
	
	/**
	 * Map<String,String>类型数据存储,并设置有效期
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean hmset(String key,int seconds, Map<String,String> hashMap){
		boolean isOk = false;
		String returnResult = "";
		returnResult = jedisCluster.hmset(key, hashMap);
		if(seconds>0){
		 this.expire(key, seconds);
		}
		if(RESULT_OK.equals(returnResult)){
			isOk = true;
		}
		return isOk;
	}
	/**
	 * 获取Map中的指定KEY值
	 * @param key
	 * @param field
	 * @return String
	 */
	public String  hget(String key,String field){
		return jedisCluster.hget(key, field);
	}
	
	/**
	 * 获取指定key中Map
	 * @param key
	 * @return Map
	 */
	public Map  hget(String key){
		return jedisCluster.hgetAll(key);
	}
	
	/**
	 * 计数递增
	 * @param key
	 * @return
	 */
	public long incr(String key){
	
		return jedisCluster.incr(key);
	}
	
	/**
	 * 计数递减
	 * @param key
	 * @return
	 */
	public long decr(String key){
		return 	jedisCluster.decr(key);
	}
	
	
	
	/**
	 * 设置KEY的有效期
	 * @param key
	 * @param seconds
	 * @return
	 */
	public long expire(String key,int seconds){
		return jedisCluster.expire(key, seconds);
	}
	
	/**
	 * 删除指定KEY
	 * @param key
	 * @return
	 */
	public long del(String key){
		return jedisCluster.del(key);
	}
	
	/**
	 * 存储List<String>数据
	 * @param key
	 * @param seconds
	 * @param list
	 */
	public long list(String key,List<String> list){
		return this.list(key, 0, list);
		
	}
	
	/**
	 * 存储List<String>数据并设置有效期
	 * @param key
	 * @param seconds
	 * @param list
	 */
	public long list(String key,int seconds,List<String> list){
		long returnResult = 0;
		String[] strArray = null;
		if(list!=null&&!list.isEmpty()){
			strArray = new String[list.size()];
			for(int i=0;i<list.size();i++){
				strArray[i]=list.get(i).toString();
			}
		}
		returnResult = jedisCluster.lpush(key,strArray);
		if(seconds>0){
			 this.expire(key, seconds);
		}
		return returnResult;
	}
	
	/**
	 * 获取List<String>
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<String> lrange(String key,long start,long end){
		return jedisCluster.lrange(key, start, end);
	}
	
	/**
	 * KEYS 获取String数据类型的值
	 * @param pattern
	 * @return
	 */
    public TreeSet<String> keys(String pattern){  
        TreeSet<String> keys = new TreeSet<String>();  
        Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();  
        for(String k : clusterNodes.keySet()){  
            JedisPool jp = clusterNodes.get(k);  
            Jedis connection = jp.getResource();  
            try {  
                keys.addAll(connection.keys(pattern));  
            } catch(Exception e){  
            	e.printStackTrace();
            } finally{  
                connection.close();//用完一定要close这个链接!!!  
            }  
        }  
        return keys;  
    }  

	
	
 

}

单元执行Main函数,控制台打印如下内容,代表搭建的Redis集群正常:

JRedisClient已经实列化
1==>1
2==>2
3==>3
4==>4
5==>5
6==>6
7==>7
8==>8
9==>9
10==>10

接下来去Redis集群中查看下是否有数据:


STM32 FMC驱动AD7606实战:从硬件连接到时序调试全流程解析 本文详细解析了STM32 FMC驱动AD7606的全流程,包括硬件连接、FMC接口配置、驱动程序设计和时序调试。通过实战案例,展示了如何利用STM32的FMC总线实现与AD7606的高效数据传输,特别强调了电源设计、信号连接和PCB布局等关键要点,为嵌入式数据采集系统开发提供了实用指导。 阅读详情

相关推荐

Revit实战:从零到一,手把手教你用族(Family)搭建一个完整的水闸BIM模型

本文详细介绍了如何使用Revit的族(Family)功能从零开始构建一个完整的水闸BIM模型。通过参数化族设计,实现闸门开度调整自动关联流量计算等智能化功能,提升水利工程BIM模型的工程价值和应用效率。文章涵盖族库规划、核心构件创建、高级技巧及BIM数据深度应用,为水利工程数字化提供实用指南。

weixin_28738165的博客 262

Linux下安装redis及遇到的问题解决

1.Linux安装redis $ wget http://download.redis.io/releases/redis-5.0.3.tar.gz $ tar xzf redis-5.0.3.tar.gz $ cd redis-5.0.3 $ make 启动redis服务端: $ src/redis-server 启动redis客户端 client: $ src/redis-cli redis&amp;...

小C的博客 629

Diebold-Mariano检验

给定两个预测的预测结果,我们希望比较他们的预测结果,以用于预测模型精度的比较。 Diebold-Mariano检验本质是一个t检验,用于检验替代预测的两个损失序列的平均值是否相等。即,它是一系列损失差的零均值的t检验。在存在自相关的情况下,它使用损失差分时间序列标准差的自相关一致性估计。 注意,在使用DM检验式时,假设损失序列是平稳的。 另外,DM检验在小样本数据时往往会拒绝零假设。对于小样本数据,推荐Harvey, Leybourne and Newbold (HLN)检验【1】; 参考文献 【1】htt

weixin_43948357的博客 6565

pecl 安装amqp 报错:Package “amqp“ does not have REST info xml available

php 使用 pecl 安装 amqp 时报错 Package "amqp" does not have REST info xml available 的解决方案

qq_29836409的博客 984

手把手教你用STM32实现SPWM逆变器控制(附完整代码)

本文提供了一份基于STM32实现SPWM逆变器控制的完整实战指南。文章从硬件选型(如STM32F103C8T6、IR2104驱动器)入手,详细解析了利用定时器TIM1生成SPWM波形的核心原理与代码实现,并涵盖了驱动电路、全桥功率电路及LC滤波器的设计要点与调试技巧,旨在帮助读者从零构建一个可靠的单相全桥逆变器系统。

weixin_29208327的博客 589

从零开始,用Cadence Virtuoso手把手仿真一个1.5V LDO(附完整电路与仿真脚本)

本文详细介绍了如何使用Cadence Virtuoso从零开始仿真一个1.5V LDO,包括环境准备、电路导入、Testbench构建、核心仿真类型分析以及高级调试技巧。通过完整的电路与仿真脚本,帮助读者掌握LDO设计与仿真的关键技术,提升电路设计能力。

weixin_31309419的博客 445

redis最新版本(6.0以上版本)安装失败原因

https://www.php.cn/blog/detail/21263.html

weixin_42340926的博客 1228

Freemarker整合poi导出带有图片的Excel教程

Freemarker整合poi导出带有图片的Excel教程 https://blog.csdn.net/x541211190/article/details/105675771根据此人博客可完成此功能,但原文中有一处错误需要纠正,当单元格合并时,计算起始单元格有错误。 源代码: /** * 构造合并单元格集合 * * @param createRowIndex: * @param cellRangeAddresses: * @param startIndex: * @param c

weixin_39403349的博客 1002

redis入门教程(redis6)

一、下载安装 1.下载官网:https://redis.io/download,点击Download 6.2.6,我这里下载的最新的6.2.6版本 2.安装 (1)redis是C语言写的,必须先安装gcc yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim 验证gcc是否成功安装 gcc --version (2)安装redis tar xzf redi

tttalk的博客 1246

【电路设计实战】BUCK降压电路:从原理到PCB布局的降噪与效率优化

本文深入剖析了BUCK降压电路的工作原理,并针对其固有的开关噪声问题,提供了从核心元件选型到PCB布局的全面优化方案。文章重点探讨了电感、电容等关键元件的选型要点,强调了低ESR电容和肖特基二极管的重要性,并详细阐述了如何通过最小化功率回路、保护敏感信号线等PCB布局实战技巧,有效抑制噪声、提升效率与稳定性。

weixin_29304021的博客 220

十五、SAP-物料需求计划(MRP)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1092

redis的安装配置使用(一)

下载地址:http://redis.io/download下载文件:redis-2.4.14.tar.gz官方教程:http://redis.io/topics/quickstart 关于redis.conf文件里面信息内容请访问:http://ericer.blog.163.com/blog/static/17385417620119811162774/ 解压:root@ubuntu:/usr/

小崔的博客 2万+

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1129

Redis集群

Redis集群

爱的叹息的专栏 1310

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java缓存加速实战:Redis集群集成的4步高效部署方案

掌握Java缓存Redis集成高效方案,4步完成Redis集群部署,提升系统性能与响应速度。适用于高并发场景,支持数据持久化与负载均衡,显著降低数据库压力。实战步骤清晰,值得收藏。

LogicWander的博客 635

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

redis 集群高可用调研方案

redis 集群部署 Redis集群的原理和搭建 - 掘金 redis集群和原理 运维派-Linux运维技术社区,Linux教程,云计算学习平台,Devops工具下载站 redis sentinel 实现集群 https://my.oschina.net/xinxingegeya/blog/646641Sentinel实现Redis集群的高可用 Redis-sentinel哨兵模式集群方案配置_眼眸刻着你的微笑的技术博客_51CTO博客 Redis-sen...

kobe8.cn 1346

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java + Redis3.0.2集群的应用(二)——Spring集成Jedis

上一章完成了redis集群环境的搭建后,接下来的任务就是如何在java应用中使用redis缓存了,这里主要使用Spring集成jedis完成对缓存的操作:

SirLZF的博客 1694

java jedis cluster_redis集群环境搭建以及java中jedis客户端集群代码实现

最近项目中用到了redis,所以就找了相关的资料学习了,然后搭建了redis集群,以及客户端的java代码实现。由于对linux不太熟悉,所以在Linux上搭建redis集群的时候碰到了很多问题,下面就大概总结下。redis相关网站:操作系统:centos 6.3redis版本:3.0.6java客户端版本: jedis 2.7.2redis客户端图形用户界面:RedisDesktopManage...

weixin_39959126的博客 975

【Java 面试 八股文】Redis篇

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。解决方案的话,我们通常都会用缓存空对象或者布隆过滤器来解决它。缓存空对象优点:实现简单,维护方便缺点:额外的内存消耗,可能造成短期的不一致布隆过滤优点:内存占用较少,没有多余key缺点:实现复杂,存在误判可能(有穿透的风险),无法删除数据。

Luo_LA的博客 2670

《探错笔记》之redis集群出现单节点宕机应用无法正常连接

项目中 redis集群出现单节点宕机,造成master迁移,但是发现应用无法正常连接redis 问题场景 Redis集群出现单节点异常造成master迁移时,底层基于Lettuce实现的应用程序无法正常连接Redis 分析 分析了代码,发现默认Lettuce是不会刷新拓扑io.lettuce.core.cluster.models.partitions.Partitions#slotCache,最终造成槽点查找节点依旧找到老的节点,自然访问不了了 解决方案 直接上代码,通过配置ClusterTopolo.

御前提笔小书童 2097

程序员面试必备之Java面试题:Redis常见面试题汇总!

掌握这些面试题能帮助您在Java面试中脱颖而出。重点复习数据类型、持久化、事务和缓存问题,结合实际项目经验(如使用Redis优化电商缓存)。练习时,可搭建本地Redis环境,用Java代码模拟场景。记住,面试中突出解决实际问题的能力,如如何用Redis降低数据库负载。祝您面试顺利!如有具体问题,欢迎进一步提问。另外,给大家分享一个220万字面试题题库,希望大家能够加油学习一下。

程序员高级码农的博客 1268

redis

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库.它们都有些共同的特征:不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。NoSQL代表MongDB、 Redis、Memcache.

daimenglaoshi的博客 471

Redis学习总结(下)——哨兵模式、集群、应用问题解决

这里写目录标题一、哨兵模式(sentinel)1.1 哨兵模式的简介1.2 启动哨兵模式1.2.1 部署哨兵节点(配置三个哨兵)1.2.2 演示故障转移二、集群2.1 Redis集群搭建2.2 slots(插槽)2.3 故障恢复2.4 1集群的Jedis开发三、应用问题解决3.1 缓存穿透3.2 缓存击穿 一、哨兵模式(sentinel) 1.1 哨兵模式的简介 主从切换技术的方法是︰当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是

weixin_44630656的博客 744

java后端学习笔记之Redis:0、基本介绍

目录 一、前言 二、基本介绍 1、课程简介 2、课程价值 3、课程优势 4、适应人群 5、简化版的100字 章节一:Redis基础 章节二:Redis高级 章节三:集群 章节四:企业级解决方案 一、前言 Android 的行情在慢慢下滑,未来还有更加丰富的技术人生,刚好公司项目需要,也不愿意这么早就把技术栈定死,而且还定在一个行情日渐下滑的技术栈上。所以我最近打算学一点...

鲁迷那的专栏—坚持实践后再写出来! 226

Redis面试大全

Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。

海哥python的博客 1153

分布式文件存储与数据缓存(二)| Redis

本文全面介绍了 Redis 数据库,包括其概述、在 Linux 和 Docker 环境下的安装方法,以及探讨了 Redis 的基本知识,如默认的 16 个数据库、单线程模型、IO 多路复用技术和管理操作。接着详细讨论了 Redis 的各种数据类型和常用命令,涵盖了键、字符串、列表、集合、哈希、有序集合、位图、地理空间和 Hyperloglog 数据类型,并针对每种类型列举了使用场景。 此外,文章还介绍了通过 Java 使用 Jedis 和 Spring-Data-Redis 进行 Redis 操作的方法,

weixin_65180200的博客 1649
上一篇: Redis集群方案
下一篇: redis lua限流写法
aspnetandjava
博客等级 码龄16年 43粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值