简介
在java程序中操作Redis需要使用Redis的Java客户端,就如同使用JDBC操作MySQL数据库一样。
Redis 的 Java 客户端很多,官方推荐的有三种:
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis。
在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。
Jedis
1 2 3 4 5
| <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency>
|
使用 Jedis 操作 Redis 的步骤:
- 获取连接。
- 执行操作。
- 关闭连接。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| package edu.heuet.test;
import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.Set;
public class JedisTest {
@Test public void testRedis(){ Jedis jedis = new Jedis("localhost",6379); jedis.set("username","xiaoming");
String value = jedis.get("username"); System.out.println(value);
jedis.hset("myhash","addr","bj"); String hValue = jedis.hget("myhash", "addr"); System.out.println(hValue);
Set<String> keys = jedis.keys("*"); for (String key : keys) { System.out.println(key); }
jedis.close(); } }
|
Spring Data Redis
简介
- Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。

1 2 3 4 5
| <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.4.8</version> </dependency>
|
- Spring Boot提供了对应的Starter,maven坐标:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
|
使用方式
环境搭建
- 第一步:创建maven项目springdataredis_demo,配置pom.xml文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?xml version="1.0" encoding="UTF-8"?> <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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> </parent> <groupId>edu.heuet</groupId> <artifactId>springdataredis_demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.5</version> </plugin> </plugins> </build> </project>
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| package edu.heuet;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class App {
public static void main(String[] args) { SpringApplication.run(App.class,args); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| spring: application: name: springdataredis_demo redis: host: localhost port: 6379 database: 0 jedis: pool: max-active: 8 max-wait: 1ms max-idle: 4 min-idle: 0
|
spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。
可以通过修改Redis配置文件来指定数据库的数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package edu.heuet.config;
import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration public class RedisConfig extends CachingConfigurerSupport {
@Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate; }
}
|
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package edu.heuet.test;
import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest @RunWith(SpringRunner.class) public class SpringDataRedisTest {
@Autowired private RedisTemplate redisTemplate; }
|
操作字符串类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
@Test public void testString(){ redisTemplate.opsForValue().set("city123","beijing");
String value = (String) redisTemplate.opsForValue().get("city123"); System.out.println(value);
redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing"); System.out.println(aBoolean); }
|
操作哈希类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
@Test public void testHash(){ HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("002","name","xiaoming"); hashOperations.put("002","age","20"); hashOperations.put("002","address","bj");
String age = (String) hashOperations.get("002", "age"); System.out.println(age);
Set keys = hashOperations.keys("002"); for (Object key : keys) { System.out.println(key); }
List values = hashOperations.values("002"); for (Object value : values) { System.out.println(value); } }
|
操作列表类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
@Test public void testList(){ ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPush("mylist","a"); listOperations.leftPushAll("mylist","b","c","d");
List<String> mylist = listOperations.range("mylist", 0, -1); for (String value : mylist) { System.out.println(value); }
Long size = listOperations.size("mylist"); int lSize = size.intValue(); for (int i = 0; i < lSize; i++) { String element = (String) listOperations.rightPop("mylist"); System.out.println(element); } }
|
操作集合类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
@Test public void testSet(){ SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("myset","a","b","c","a");
Set<String> myset = setOperations.members("myset"); for (String o : myset) { System.out.println(o); }
setOperations.remove("myset","a","b");
myset = setOperations.members("myset"); for (String o : myset) { System.out.println(o); } }
|
操作有序集合类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
@Test public void testZset(){ ZSetOperations zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("myZset","a",10.0); zSetOperations.add("myZset","b",11.0); zSetOperations.add("myZset","c",12.0); zSetOperations.add("myZset","a",13.0);
Set<String> myZset = zSetOperations.range("myZset", 0, -1); for (String s : myZset) { System.out.println(s); }
zSetOperations.incrementScore("myZset","b",20.0);
myZset = zSetOperations.range("myZset", 0, -1); for (String s : myZset) { System.out.println(s); }
zSetOperations.remove("myZset","a","b");
myZset = zSetOperations.range("myZset", 0, -1); for (String s : myZset) { System.out.println(s); } }
|
通用操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
@Test public void testCommon(){ Set<String> keys = redisTemplate.keys("*"); for (String key : keys) { System.out.println(key); }
Boolean itcast = redisTemplate.hasKey("itcast"); System.out.println(itcast);
redisTemplate.delete("myZset");
DataType dataType = redisTemplate.type("myset"); System.out.println(dataType.name());
}
|