Spring集成Redis详解代码示例
程序员文章站
2024-04-01 20:48:22
本文章从头开始介绍spring集成redis的示例。
eclipse工程结构
如下图为我的示例工程的结构图,采用maven构建。其中需要集成spring,因此需要bea...
本文章从头开始介绍spring集成redis的示例。
eclipse工程结构
如下图为我的示例工程的结构图,采用maven构建。其中需要集成spring,因此需要beans.xml文件配置spring的依赖注入,redis.properties配置连接服务器的配置信息。
其中工程中beans.xml和redis.properties文件直接放在了根目录,有需要的读者可以放到resource目录中。
pom依赖
如下为示例pom依赖,spring集成redis需要依赖的包为:jedis包,spring-context模块及依赖的包,spring-data-redis模块包,spring-test包用于junit测试,pom.xml文件内容如下:
<project xmlns="https://maven.apache.org/pom/4.0.0" xmlns:xsi="https://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="https://maven.apache.org/pom/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.test</groupid> javatest</artifactid> <version>0.0.1-snapshot</version> <packaging>jar</packaging> <name>javatest</name> <url>https://maven.apache.org</url> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> </properties> <dependencies> <dependency> <groupid>junit</groupid> junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupid>redis.clients</groupid> jedis</artifactid> <version>2.5.1</version> </dependency> <dependency> <groupid>org.springframework</groupid> spring-context</artifactid> <version>4.2.6.release</version> <scope>runtime</scope> </dependency> <dependency> <groupid>org.springframework</groupid> spring-test</artifactid> <version>4.2.6.release</version> <scope>runtime</scope> </dependency> <dependency> <groupid>org.springframework.data</groupid> spring-data-redis</artifactid> <version>1.7.2.release</version> </dependency> </dependencies> </project>
spring配置
spring配置文件beans.xml的配置如下:
<!--?xml version="1.0" encoding="utf-8"?--> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:aop="https://www.springframework.org/schema/aop" xmlns:context="https://www.springframework.org/schema/context" xmlns:jee="https://www.springframework.org/schema/jee" xmlns:p="https://www.springframework.org/schema/p" xmlns:tx="https://www.springframework.org/schema/tx" xmlns:xsi="https://www.w3.org/2001/xmlschema-instance" xsi:schemalocation=" https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加载classpath下的redis配置文件 --> <context:property-placeholder location="classpath:redis.properties"> <bean class="redis.clients.jedis.jedispoolconfig" id="poolconfig"> <property name="maxidle" value="${redis.maxidle}"> <property name="testonborrow" value="${redis.testonborrow}"> </property></property></bean> <bean class="org.springframework.data.redis.connection.jedis.jedisconnectionfactory" id="connectionfactory" p:host-name="${redis.host}" p:password="${redis.pass}" p:pool-config-ref="poolconfig" p:port="${redis.port}"> <!-- spring提供的模板类 --> <bean class="org.springframework.data.redis.core.stringredistemplate" id="redistemplate"> <property name="connectionfactory" ref="connectionfactory"> </property></bean> <bean class="com.redis.test.userdao" id="userdao"> <property name="redistemplate" ref="redistemplate"> </property></bean> </bean></context:property-placeholder></beans>
在beans.xml配置文件中,需要先加载redis.properties文件。
redis配置信息
redis的配置信息在redis.properties文件中配置:
# redis地址和端口和连接密码 redis.host=localhost redis.port=6379 redis.pass= redis.maxidle=300 redis.testonborrow=true
此示例,连接redis服务器时没有设置连接密码,因此不用填值。
java代码
user.java
package com.redis.test; import java.io.serializable; public class user implements serializable { private static final long serialversionuid = 3409768855488864675l; private string id; private string name; private string password; public user() { } public user(string id, string name, string password) { this.id = id; this.name = name; this.password = password; } public string getid() { return id; } public void setid(string id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public string getpassword() { return password; } public void setpassword(string password) { this.password = password; } public string tostring() { return "user [id=" + id + ", name=" + name + ", password=" + password + "]"; } }
abstractredisbasedao.java
package com.redis.test; import org.springframework.data.redis.core.redistemplate; import org.springframework.data.redis.serializer.redisserializer; public abstract class abstractredisbasedao<k, v=""> { protected redistemplate<k, v=""> redistemplate; public redistemplate<k, v=""> getredistemplate() { return redistemplate; } public void setredistemplate(redistemplate<k, v=""> redistemplate) { this.redistemplate = redistemplate; } /** * 获取 redisserializer */ protected redisserializer<string> getredisserializer() { return redistemplate.getstringserializer(); } }
iuserdao.java
package com.redis.test; import java.util.list; public interface iuserdao { /** 新增 */ boolean add(user user); /** 批量新增,pipeline方式 */ boolean add(list<user> list); /** 删除 */ void delete(string key); /** 批量删除 */ void delete(list<string> keys); /** 更新 */ boolean update(user user); /** 读取 */ user get(string keyid); }
userdao.java
package com.redis.test; import java.util.list; import org.springframework.dao.dataaccessexception; import org.springframework.data.redis.connection.redisconnection; import org.springframework.data.redis.core.rediscallback; import org.springframework.data.redis.serializer.redisserializer; import org.springframework.util.assert; public class userdao extends abstractredisbasedao<string, user=""> implements iuserdao { public boolean add(final user user) { boolean result = redistemplate.execute(new rediscallback<boolean>() { public boolean doinredis(redisconnection connection) throws dataaccessexception { redisserializer<string> serializer = getredisserializer(); byte[] key = serializer.serialize(user.getid()); // 将id序列化成key byte[] value = serializer.serialize(user.getname()); return connection.setnx(key, value); } } ); return result; } public boolean add(final list<user> list) { assert.notempty(list); boolean result = redistemplate.execute(new rediscallback<boolean>() { public boolean doinredis(redisconnection connection) throws dataaccessexception { redisserializer<string> serializer = getredisserializer(); for (int i = 0; i < list.size(); i++) { user user = list.get(i); byte[] key = serializer.serialize(user.getid()); // 将id序列化成key byte[] value = serializer.serialize(user.getname()); connection.setnx(key, value); } return true; } } , false, true); return result; } public void delete(string key) { redistemplate.delete(key); } public void delete(list<string> keys) { redistemplate.delete(keys); } public boolean update(final user user) { string key = user.getid(); if(get(key) == null) { throw new nullpointerexception("数据行不存在,key = " + key); } boolean result = redistemplate.execute(new rediscallback<boolean>() { public boolean doinredis(redisconnection connection) throws dataaccessexception { redisserializer<string> serializer = getredisserializer(); byte[] key = serializer.serialize(user.getid()); // 将id序列化成key byte[] value = serializer.serialize(user.getname()); connection.set(key, value); return true; } } ); return result; } public user get(final string keyid) { user user = redistemplate.execute(new rediscallback<user>() { public user doinredis(redisconnection connection) throws dataaccessexception { redisserializer<string> serializer = getredisserializer(); byte[] key = serializer.serialize(keyid); byte[] value = connection.get(key); if(value == null) { return null; } string name = serializer.deserialize(value); return new user(keyid, name, null); } } ); return user; } }
redistest.java(junit测试类)
package com.redis.test; import java.util.arraylist; import java.util.list; import org.junit.test; import org.springframework.beans.factory.annotation.autowired; import org.springframework.test.context.contextconfiguration; import org.springframework.test.context.junit4.abstractjunit4springcontexttests; import org.springframework.util.assert; /** * junit在spring context环境下测试 */ @contextconfiguration(locations={"classpath*:beans.xml"}) public class redistest extends abstractjunit4springcontexttests { @autowired private iuserdao userdao; /** 增加单个用户 */ @test public void testadduser() { user user = new user("user1", "password1", null); boolean result = userdao.add(user); assert.istrue(result); system.out.println("添加结果:" + result); } /** 批量新增普通方式,5286ms */ @test public void testaddusers1() { list<user> list = new arraylist<user>(); for (int i = 10; i < 50000; i++) { user user = new user(); user.setid("user" + i); user.setname("password" + i); list.add(user); } long begin = system.currenttimemillis(); for (user user : list) { userdao.add(user); } system.out.println(system.currenttimemillis() - begin); } /** 批量新增pipeline方式,484ms */ @test public void testaddusers2() { list<user> list = new arraylist<user>(); for (int i = 50000; i < 100000; i++) { user user = new user(); user.setid("user" + i); user.setname("password" + i); list.add(user); } long begin = system.currenttimemillis(); boolean result = userdao.add(list); assert.istrue(result); system.out.println(system.currenttimemillis() - begin); } /** 更新 */ @test public void testupdate() { user user = new user(); user.setid("user1"); user.setname("new_password"); boolean result = userdao.update(user); assert.istrue(result); } /** 删除 */ @test public void testdelete() { string key = "user1"; userdao.delete(key); } /** 批量删除 */ @test public void testdeletes() { list<string> list = new arraylist<string>(); for (int i = 0; i < 10; i++) { list.add("user" + i); } userdao.delete(list); } /** 读取 */ @test public void testgetuser() { string id = "user1"; user user = userdao.get(id); assert.notnull(user); system.out.println(user); } }
总结
以上就是本文关于spring集成redis详解代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!