RedisTemplate和JedisPool的效率对比

    技术2022-07-13  65

    1、准备环境

    1.1、安装本地Redis,并启动服务

    如果还没安装的,可以参考博客:Windows系统本地安装Redis并设置服务自启动(图文)

    1.2、创建Maven项目,并导入依赖

    在pom.xml文件中加入以下依赖

    <!-- 配置编译环境 --> <build> <plugins> <!-- 处理项目JDK编译版本的问题 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 设置maven内置服务器为tomcat7 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> <!-- 属性 --> <properties> <!-- 指定spring的版本 --> <spring.version>5.1.9.RELEASE</spring.version> <!-- 指定redis数据库的版本 --> <redis.spring.version>1.8.23.RELEASE</redis.spring.version> </properties> <!-- 依赖 --> <dependencies> <!-- spring的IOC依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- spring单元测试的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- junit测试依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- junit版本超过4.11,需要手动加hamcrest的依赖 --> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <!-- redis和spring整合的依赖 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${redis.spring.version}</version> </dependency> <!-- 管理redis数据库连接的jedis连接池依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- pool连接池依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies>

    1.3、准备Redis数据库参数的属性文件

    在resources目录下创建redisConfig.properties属性文件,配置内容如下:

    redis.host=127.0.0.1 redis.port=6379 redis.database=0 redis.password=dearest redis.timeout=60000 redis.maxTotal=50 redis.maxIdle=20 redis.minIdle=8 redis.maxWaitMillis=60000 redis.testOnBorrow=true redis.testOnReturn=true

    1.4、准备Redis数据库在Spring框架中的xml配置文件

    在resources目录下spring目录,在spring目录中创建applicationContext-redis.xml配置文件,配置内容如下:

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:redisConfig.properties" /> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxTotal}" /> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="minIdle" value="${redis.minIdle}" /> <property name="maxWaitMillis" value="${redis.maxWaitMillis}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> <property name="testOnReturn" value="${redis.testOnReturn}" /> </bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="poolConfig" ref="jedisPoolConfig" /> <constructor-arg name="host" value="${redis.host}" /> <constructor-arg name="port" value="${redis.port}" /> <constructor-arg name="password" value="${redis.password}" /> <constructor-arg name="database" value="${redis.database}" /> <constructor-arg name="timeout" value="${redis.timeout}" /> </bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="poolConfig" ref="jedisPoolConfig" /> <property name="hostName" value="${redis.host}" /> <property name="port" value="${redis.port}" /> <property name="database" value="${redis.database}" /> <property name="password" value="${redis.password}" /> </bean> <!-- 序列化方式 --> <bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> <!-- 序列化方式 --> <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" /> <!-- Redis模板 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> <property name="keySerializer" ref="stringRedisSerializer" /> <property name="hashKeySerializer" ref="stringRedisSerializer" /> <property name="valueSerializer" ref="jdkSerializationRedisSerializer" /> <property name="hashValueSerializer" ref="jdkSerializationRedisSerializer" /> </bean> </beans>

    2、开始测试

    2.1、创建测试类

    package com.zdrl.web.controller; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; @RunWith(value = SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml") public class Demo { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private JedisPool jedisPool; private final int num = 100000; @Test public void method1 () { long time = 0; System.out.println("RedisTemplate:"); for (int i = 0; i <= num; i++) { long time1 = System.currentTimeMillis(); redisTemplate.opsForValue().set(i + "", i + ""); long time2 = System.currentTimeMillis(); time += (time2 - time1); if (i == 10) { System.out.println("10次:总时间" + time); } else if (i == 100) { System.out.println("100次:总时间" + time); } else if (i == 500) { System.out.println("500次:总时间" + time); } else if (i == 1000) { System.out.println("1000次:总时间" + time); } else if (i == 5000) { System.out.println("5000次:总时间" + time); } else if (i == 10000) { System.out.println("10000次:总时间" + time); } else if (i == 100000) { System.out.println("100000次:总时间" + time); } } } @Test public void method2 () { long time = 0; Jedis jedis = jedisPool.getResource(); System.out.println("JedisPool:"); for (int i = 0; i <= num; i++) { long time1 = System.currentTimeMillis(); jedis.set(i + "", i + ""); long time2 = System.currentTimeMillis(); time += (time2 - time1); if (i == 10) { System.out.println("10次:总时间" + time); } else if (i == 100) { System.out.println("100次:总时间" + time); } else if (i == 500) { System.out.println("500次:总时间" + time); } else if (i == 1000) { System.out.println("1000次:总时间" + time); } else if (i == 5000) { System.out.println("5000次:总时间" + time); } else if (i == 10000) { System.out.println("10000次:总时间" + time); } else if (i == 100000) { System.out.println("100000次:总时间" + time); } } } }

    2.2、测试结果

    RedisTemplate的执行效率如下:

    JedisPool的执行效率如下:

    3、结论

    JedisPool的效率比RedisTemplate简直快不要太多。 当然,我这是在本地Redis测试,有时间的朋友,可以测试一下服务器上两者的执行效率。

    Processed: 0.014, SQL: 9