Spring Data Redis示例
说明
关于Redis:一个基于键值对存储的NoSQL内存数据库,可存储复杂的数据结构,如List
, Set
, Hashes
。
关于Spring Data Redis:简称SDR, 能让Spring应用更加方便配置和访问Redis。
本工程基于spring boot ,spring data redis, spring io platform实现。
POM配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.edu.hdu</groupId> <artifactId>examples.sdr</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>examples.sdr</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>Athens-SR2</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.4.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Compile --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <finalName>examples.sdr</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.3.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
配置RedisTemplate Bean
主要生成两个bean,JedisConnectionFactory 和 RedisTemplate,RedisTemplate bean用于后续注入到PersonRepoImpl中操作Redis数据库。
@Configuration public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory connectionFactory = new JedisConnectionFactory(); connectionFactory.setHostName("127.0.0.1"); connectionFactory.setPort(6379); return new JedisConnectionFactory(); } @Bean @Autowired public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); return template; } }
使用RedisTemplate操作Redis
这里我们通过RedisTemplate得到HashOperations
对象,使用该对象来存取Redis数据。
package cn.edu.hdu.examples.sdr.repo.impl; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Repository; import cn.edu.hdu.examples.sdr.bean.Person; import cn.edu.hdu.examples.sdr.repo.PersonRepo; @Repository public class PersonRepoImpl implements PersonRepo { @Autowired private RedisTemplate<String, Object> redisTemplate; private static String PERSON_KEY = "Person"; @Override public void save(Person person) { this.redisTemplate.opsForHash().put(PERSON_KEY, person.getId(), person); } @Override public Person find(String id) { return (Person) this.redisTemplate.opsForHash().get(PERSON_KEY, id); } @Override public Map<Object, Object> findAll() { return this.redisTemplate.opsForHash().entries(PERSON_KEY); } @Override public void delete(String id) { this.redisTemplate.opsForHash().delete(PERSON_KEY, id); } }
测试
使用如下代码进行测试,运行前,请先运行本地redis服务;
1、查看当前所有用户
2、存入三个用户
3、查看ID为3的用户
4、查看所有用户
5、删除ID为2的用户后,查看剩余的用户
@SpringBootApplication public class Application implements CommandLineRunner { @Autowired private PersonRepo personRepo; public void testHash(){ Map<Object, Object> personMatrixMap = personRepo.findAll(); System.out.println("@@当前Redis存储的所有用户:" + personMatrixMap); Person person = new Person(); person.setId("1"); person.setAge(55); person.setGender(Gender.Female); person.setName("Oracle"); personRepo.save(person); Person person2 = new Person(); person2.setId("2"); person2.setAge(60); person2.setGender(Gender.Male); person2.setName("TheArchitect"); personRepo.save(person2); Person person3 = new Person(); person3.setId("3"); person3.setAge(25); person3.setGender(Gender.Male); person3.setName("TheOne"); personRepo.save(person3); System.out.println("查找ID为3的用户 : " + personRepo.find("3")); personMatrixMap = personRepo.findAll(); System.out.println("当前Redis存储的所有用户:" + personMatrixMap); personRepo.delete("2"); personMatrixMap = personRepo.findAll(); System.out.println("删除ID为2的用户后,剩余的所有用户: " + personMatrixMap); } @Override public void run(String... args) throws Exception { this.testHash(); } public static void main(String[] args) { // Close the context so it doesn't stay awake listening for redis SpringApplication.run(Application.class, args).close(); } }
结果打印:
@@当前Redis存储的所有用户:{}
查找ID为3的用户 : Person [id=3, name=TheOne, gender=Male, age=25]
当前Redis存储的所有用户:{2=Person [id=2, name=TheArchitect, gender=Male, age=60], 3=Person [id=3, name=TheOne, gender=Male, age=25], 1=Person [id=1, name=Oracle, gender=Female, age=55]}
删除ID为2的用户后,剩余的所有用户: {3=Person [id=3, name=TheOne, gender=Male, age=25], 1=Person [id=1, name=Oracle, gender=Female, age=55]}
也可以打开redis-cli手动输入key, 查看当前Redis存储结果:
剩下的两个用户为:{3=Person [id=3, name=TheOne, gender=Male, age=25], 1=Person [id=1, name=Oracle, gender=Female, age=55]}
例子源码
https://github.com/peterchenhdu/spring-data-redis-example
参考资料
https://examples.javacodegeeks.com/enterprise-java/spring/spring-data-redis-example/