Redis实践(三)基于jedis开发java应用:redis的8种方式设置key,value

优雅的使用RedisTemplate操作Redis 背景 在最近的项目中,有一个需求是对一个很大的数据库进行查询,数据量大概在几千万条。但同时对查询速度的要求也比较高。 这个数据库之前在没有使用Presto的情况下,使用的是Hive,使用Hive进行一个简单的查询,速度可能在几分钟。当然几分钟也并不完全是跑SQL的时间,这里面包含发请求,查询数据并且返回数据的时间的总和。但是即使这样,这样的速度明显不能满足交互式的查询需求。 我们的下一个解决方案就是Presto,在使用了Presto之后,查询速度降到了秒级。但是对于一个前端查询界面的交互式查询来说,十几秒仍 阅读详情

前面已经进行了redis的部署实践,下面要进行redis的java开发实践

一、目标

  搭建java开发环境,采用eclipse开发工具

  验证redis的写数据的8种方式的效率

二、环境准备

开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。 Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Java redis 驱动:
        首先你需要下载驱动包,下载 jedis.jar,我在本次实践中用的jedis的jar包是2.8.0 版本的。同时,要保证java工程可以正常运行,还需要下载commons-pool2-2.3.jar以及 
hamcrest-core-1.3.jar。

        然后,在redis服务上,配置好6379,6380 两个端口的配置文件,启动redis(因为后面需要用分布式的调用,所以需要启动两个redis实例)

三、java工程

在elipse中创建工程,并且将上面三个jar包放到lib目录中,并且添加到buildpath

 

    下面,对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比,代码如下:(主要从网上获取,少量改动)

package com.cwqsolo.redis.test;

import java.util.Arrays; 
import java.util.List; 

import redis.clients.jedis.Jedis; 
import redis.clients.jedis.JedisPoolConfig; 
import redis.clients.jedis.JedisShardInfo; 
import redis.clients.jedis.Pipeline; 
import redis.clients.jedis.ShardedJedis; 
import redis.clients.jedis.ShardedJedisPipeline; 
import redis.clients.jedis.ShardedJedisPool; 
import redis.clients.jedis.Transaction; 


//RedisDemo  用来测试redis的使用接口
public class RedisDemo { 

    private static Jedis jedis; 
    private static ShardedJedis sharding; 
    static ShardedJedisPool pool;

    public static void init() throws Exception { 
        List<JedisShardInfo> shards = Arrays.asList( 
                new JedisShardInfo("192.168.136.144",6379),
                new JedisShardInfo("192.168.136.144",6380)
                ); //使用相同的ip:port,仅作测试 


        jedis = new Jedis("192.168.136.144"); 
        sharding = new ShardedJedis(shards); 
        JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置
        pool = new ShardedJedisPool(config, shards); 
    } 


    public static void CleanUp() throws Exception { 
        jedis.disconnect(); 
        sharding.disconnect(); 
        pool.destroy(); 
    } 


    //测试普通同步方式, 设置10w个key,value,看用时多少。
    public void test1Normal() { 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            String result = jedis.set("1n" + i, "1n" + i); 
        } 
        long end = System.currentTimeMillis(); 
        System.out.println("普通同步方式::Simple SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

  //测试事务方式Transactions, 设置10w个key,value,看用时多少。
    public void test2Trans() { 
        long start = System.currentTimeMillis(); 
        Transaction tx = jedis.multi(); 
        for (int i = 0; i < 100000; i++) { 
            tx.set("1t" + i, "1t" + i); 
        } 
        //System.out.println(tx.get("t1000").get()); 

        List<Object> results = tx.exec(); 
        long end = System.currentTimeMillis(); 
        System.out.println("事务方式::Transaction SET: " + ((end - start)/1000.0) + " seconds"); 
    } 


    //采用管道方式,异步方式,一次发送多个指令,
    public void test3Pipelined() { 
        Pipeline pipeline = jedis.pipelined(); 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("p" + i, "p" + i); 
        } 
        //System.out.println(pipeline.get("p1000").get()); 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        System.out.println("管道方式异步::Pipelined SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //管道中调用事务, 
    public void test4combPipelineTrans() { 
        long start = System.currentTimeMillis(); 
        Pipeline pipeline = jedis.pipelined(); 
        pipeline.multi(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("" + i, "" + i); 
        } 
        //与管道的区别在这里
        pipeline.exec(); 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        System.out.println("管道中调用事务::Pipelined transaction: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式直连同步调用,用到了分片
    public void test5shardNormal() { 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            String result = sharding.set("sn" + i, "n" + i); 
        } 
        long end = System.currentTimeMillis(); 
        System.out.println("分布式直连同步::Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式直连异步调用
    public void test6shardpipelined() { 
	//采用sharding 对象
        ShardedJedisPipeline pipeline = sharding.pipelined(); 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("sp" + i, "p" + i); 
        } 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        System.out.println("分布式直连异步::Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式连接池同步调用, 线程安全
    public void test7shardSimplePool() { 
        ShardedJedis one = pool.getResource(); 

        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            String result = one.set("spn" + i, "n" + i); 
        } 
        long end = System.currentTimeMillis(); 
        pool.returnResource(one); 
        System.out.println("分布式连接池同步调用::Simple@Pool SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式连接池异步调用
    public void test8shardPipelinedPool() { 
        ShardedJedis one = pool.getResource(); 

        ShardedJedisPipeline pipeline = one.pipelined(); 

        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("sppn" + i, "n" + i); 
        } 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        pool.returnResource(one); 
        System.out.println("分布式连接池异步调用::Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds"); 
    } 
    
    
  
    public static void main(String[] args) {
         
	RedisDemo testDemo = new RedisDemo();
	try {
	testDemo.init();
	}catch (Exception Exc) {
		
		Exc.printStackTrace();
		System.exit(0);
	}
	
	System.out.println("init complete sucessfully!!!"); 

	//测试普通同步方式
	testDemo.test1Normal();
	//测试事务方式Transactions
	testDemo.test2Trans();
	//采用管道方式,异步方式
	testDemo.test3Pipelined();
	//管道中调用事务,
	testDemo.test4combPipelineTrans();
	//分布式直连同步调用,用到了分片
	testDemo.test5shardNormal();
	//分布式直连异步调用
	testDemo.test6shardpipelined();
	//分布式连接池同步调用, 线程安全
	testDemo.test7shardSimplePool();
	//分布式连接池异步调用, 线程安全
	testDemo.test8shardPipelinedPool();
	

	try {
	    testDemo.CleanUp();
		}catch (Exception Exc) {
			
			Exc.printStackTrace();
			System.exit(0);
		}
       
    }
    
    
} 
整个代码,都是对redis进行key,value的设定,数据大小为10w,通过8种不同的接口进行测试,比较一下调用的效率

下面是运行的结果。


从图中可以看出,异步调用的效率非常高。

用 Redis 实现点赞功能:优雅设计 Key / Value 当然,具体的实现方式和优化策略还需要根据业务需求和实际情况进行调整和完善。让我们一起探讨,共同提升技术水平,打造更加优秀的应用系统。在实际应用中,我们可以根据业务需求进行优化和调整。同时,我们也应该注意 Redis 的使用限制和最佳实践,以确保系统的稳定性和性能。让我们一起探讨,共同提升技术水平,打造更加优秀的应用系统。在实际应用中,我们可以根据业务需求和系统架构进行更加复杂的优化和扩展。如果你对这个主题有更多疑问或者想要分享你的经验,欢迎在评论中与我们互动。 阅读详情

相关推荐

深入解析DDR5 RFM机制:从JESD79-5标准到硬件实现

本文深入解析了DDR5内存标准中的关键机制——RFM(Refresh Management)。文章从JESD79-5标准出发,详细阐述了RFM如何通过RAA计数器实现从被动定时到主动响应的智能刷新管理,并探讨了其硬件实现细节、命令调度挑战及系统级设计考量,为芯片设计工程师优化DDR5内存子系统性能与可靠性提供了实践指导。

fff88的博客 486

Redis关于String类型的value值常用命令操作

系统:linux 版本:Redis-5.0.4 使用命令help @string查看String类型的value值有哪些命令,命令有很多,今天简单几种常用的。 1.set命令:set后面除了接key值value值之外,还可以接延迟时间和NX/XX。 首先设置k1的值为hello,然后设置k1的值为world 并后缀nx,发现k1的值,并没有任何变化。设置k1的值为world 并后缀xx,发现k1的值改变为world。 set k1 world nx:如果不存在k1,那么设置k1的值为w

lyy9902的博客 3422

MultiOTP Credential Provider避坑指南:从安装到RDP双因素认证的全流程解析

本文详细解析了MultiOTP Credential Provider从安装到实现RDP双因素认证(MFA)的全流程,重点分享了Docker部署、Active Directory集成及网络级认证(NLA)兼容性等环节的实战避坑经验,旨在帮助运维人员高效、稳定地部署离线双因素认证方案,提升Windows远程桌面安全性。

weixin_29255731的博客 641

Java开发中对Redis的基本操作

注意:在开发过程中,如果想一次存储多个对象,那么就将对象转换成json格式,然后把json以字符串的形式存储到redis中;想要取json中的值时,需要获取redis中的对象相关信息,这里的index指的是想要获取key所对应的value中第几位值。这里的key指的是对象,而field指的是该对象中的属性。字符串的修改就等于新增的方法jedis.set。拿到json串,然后通过。出现PONG则成功!中间存放的是失效秒数。

m0_67094505的博客 2106

《中国图书馆图书分类法》(第五版)详表(中图分类号查询表)

中文法分类

记录我目之所及的世界 4万+

Unity 升级 xLua 版本,编译不同平台链接库

Unity 升级 xLua 详解

LymanCao的专栏 1800

Redis 集合(Set)方法使用详解

本文主要是介绍集合(Set)中常见方法的使用,包括对应的java使用方式,SADD、SREM、SMOVE、SMEMBERS、SCARD、SISMEMBER、SRANDMEMBER、SPOP、SINTER、SINTERSTORE、SUNION、SUNIONSTORE、SDIFF、SDIFFSTORE

嘉禾嘉宁papa 1万+

你的App合规吗?手把手教你用Camille生成隐私调用报告给老板看

本文详细介绍了如何使用开源工具Camille进行Android App隐私合规检测,并生成高管易懂的隐私调用报告。通过动态插桩技术和多维度分析,Camille能有效识别高风险API调用,并将其映射到具体法律条款,帮助技术团队与法务、产品等非技术部门高效沟通,确保App符合《个保法》等法规要求。

weixin_33726318的博客 422

# Redis缓存中存入值(key-value)进入后,通过key查不到value值

Redis缓存中存入值(key-value)进入后,通过key查不到value值 1. 检查RedisAPI工具类中是否set进去 请注意过期时间:seconds import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * Redis */ public class RedisAPI { public JedisP

思祺班Java 1010

10.28华为OD机试真题 新系统 - AI推理任务并行额度最大值 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - AI推理任务并行额度最大值 (Java/Py/C/C++/Js/Go)

算法大师! 271

32、高光谱遥感技术在军事领域的应用解析

高光谱遥感技术凭借其高分辨率和精细光谱分析能力,在军事领域广泛应用于战场详细侦察、伪装目标识别及目标实际温度与发射率的检测,显著提升了目标识别精度和作战支持能力。同时,该技术在内陆水体成分反演、海洋环境监测和农业管理等领域也展现出巨大潜力。尽管面临数据量大、处理复杂、技术融合不足和仪器性能限制等挑战,未来通过人工智能融合、高效算法研发和先进仪器开发,高光谱遥感技术将在多领域实现更深入应用与发展。

blue的专栏 229

Springboot集成jedis 类似jFinal方式序列化key和value

在使用jFinal的时候redis是集成过的,直接简单暴力的使用,关于key和value的序列化已经处理过了 Cache bbs = Redis.use(); 然后bbs.set 或者bbs.get超级简单,在使用springboot的时候根据jFinal的处理方式。这里感谢jFinal,感谢开源,这里算是盗用代码 首先是配置jedis,百度方法很多,这里就简单的过一下 redis...

leo 863

【四足机器人项目实战】四足机器人运动学、动力学模型

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人实际模型的物理难点二、四足机器人运动学模型1.方法一:DH法建立运动学模型(1)运动学建模构型方法(2)运动学模型描述方法1、基于DH法四足机器人单腿运动学模型公式推导(0)DH法科普1)原理2)实现过程3)评价(1)四足机器人的建模规则、坐标系定义及实物参数确定1)标准Denavit-Hartenberg法建模规则2)单腿运动学模型坐标系定义示意图及简化模型3)

qq_35635374的博客 1万+

Java中使用Redis(即学即用)

一、为什么需要用Redis? Redis(Remote Dictionary Server),一个基于内存的高性能key-value数据库。针对关系型数据库性能瓶颈来设计的,处理关系型数据库不擅长做的业务场景。Redis 多用于项目的高速缓存,可以让项目性能更好。 Redis的应用场景 二、安装Redis 1、下面提供其中一个版本的Redis: 链接:https://pan.baidu.com/s/1Z3QRpdMzUyPh8ODZJDgGEA 提取码:j8vl 复制这段内容后打开百度...

心有谦谦结 9568

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怀旧版电脑GBC模拟器

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

Redis 的 Key 和 Value 设计原则

在使用 Redis 时,合理设计 Key 和 Value 至关重要。

m0_57836225的博客 1564

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Redis基础篇】5种常见数据结构、SpringDataRedis的Java客户端操作、Jedis、key和value配置序列化器、手动序列化和反序列化、Redis下载与安装、Key的命名规范

Redis是一个基于内存的key-value非结构数据库。Redis 是使用最为广泛的存储中间件。Redis中文网Spring Data Redis是Spring Data项目的一部分,旨在简化Spring应用程序中的数据访问。Spring Data Redis专门提供与Redis集成。

2301_77358195的博客 1232

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java开发中 Redis设置Key/value的规则定义和注意事项

Redis 设置key/value规则 对于redis的存储key/value键值对,很多人应该都踩过坑,这里总结了一套规则;这篇文章主要讲解定义key/value键值对时的定义规则和注意事项。 1、redis value 值格式 在Java常规开发中,我们需要有面向对象的思想,相对于对象来说,比较常用且能快速转换的格式就是 JSON 了;比较常用的Java处理JSON数据有三个比较流行的类库Fa...

weixin_44114198的博客 5638

Redis设置Key/value的规则定义和注意事项(附工具类)

Redis设置Key/value的规则定义和注意事项(附工具类) 对于redis的存储key/value键值对,经过多次踩坑之后,我们总结了一套规则;这篇文章主要讲解定义key/value键值对时的定义规则和注意事项。 前面一篇文章讲了如何定义Redis的客户端和Dubbo集成存储器;当我们真正开始开发的时候,就会突然发现,有点不知道如何去定义Redis的Key和Value值格式,...

YClimb的专栏 3万+

java 枚举获取key_Redis设置Key/value的规则定义和注意事项(附工具类)

1、redis value 值格式在Java常规开发中,我们需要有面向对象的思想,相对于对象来说,比较常用且能快速转换的格式就是 JSON 了;比较常用的Java处理JSON数据有三个比较流行的类库FastJSON、Gson和Jackson,他们的优劣点这里我就不一一介绍了,本文用阿里的FastJSON。上面提到了JSON,这是因为在Redis的存储中,我们使用它来存储value值,为什么要这样做...

weixin_33910305的博客 918

Jedis操作redis

Redis是一个开源的Key-Value数据缓存,和Memcached类似。 Redis多种类型的value,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 Jedis 是 Redis 官方首选的 Java 客户端开发包。 添加依赖 <dependency> <groupId>re...

java1703的博客 191

java连接redis设置密码_jedis设置密码连接Redis

引入Maven依赖你可以到 https://mvnrepository.com/网站去搜索jedis的maven依赖,如下:redis.clientsjedis2.9.0Java代码使用 JedisShardInfo 的 setPassword() 方法设置密码,具体实例如下:packagecom.huangx;importjava.util.LinkedList;importjava.u...

weixin_39969976的博客 3351

java redis key value_Java连接Redis (key-value存储系统)详解

Redis简介:redis是一个性能非常优秀的内存数据库,通过key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的...

weixin_27966471的博客 558

jedis调用redis之String数据Key-Value

package com.alex.xiyoubang;import redis.clients.jedis.Jedis;/** * jedis对key_value的操作 * @author Alex * */ public class RedisKY { static Jedis jedis = new Jedis("192.168.1.171", 6379); public

3547

java key value 数据类型_java获取redis中各种数据类型key对应的value代码简单封装

目前在做自动化测试时,设计到需要获取存储在redis中的值,总结了操作代码如下:需要jar包:jedis-2.7.3.jar、commons-pool2-2.4.1.jarcode如下:[java]view plaincopyprint?packagecn.migu.utils;importjava.util.Iterator;importjava.util.List;importcn.m...

weixin_30994671的博客 539

【redis、Jedis】

【redis、Jedis】 redis redis:是一款高性能的NOSQL系列的非关系型数据库。 NoSQL,泛指非关系型数据库,主要分为四大类: **1.key-value存储数据库。**该类数据库使用哈希表,在哈希表中包含特定的key和与其对应的指向特定数据的指针。常用的有Redis。 **2.列存储数据库。**该类数据库主要用来应对分布式存储的海量数据,一个键指向了多个列。常用的有HBase。 **3.文档型数据库。**该类数据库将结构化、半结构化的文档以特定格式存储,如json格式。一个文档相当于

weixin_46932548的博客 345
上一篇: Zabbix实践(四) zabbix的通知推送解决方案
下一篇: Redis实践(四)高可用的集群+哨兵部署 下的jedis开发
虎纠卫
博客等级 码龄24年 440粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值