引入依赖
在 pom.xml
引入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
在 application.yml
对 Redis 进行配置。
# redis 配置
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
配置类
创建一个 Redis 的配置类,生成一个操作 Redis 的 Bean 对象,交给 Spring IoC 管理。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置key的序列化方式
template.setKeySerializer(RedisSerializer.string());
// 设置value的序列化方式
template.setValueSerializer(RedisSerializer.json());
// 设置hash的key的序列化方式
template.setHashKeySerializer(RedisSerializer.string());
// 设置hash的value的序列化方式
template.setHashValueSerializer(RedisSerializer.json());
template.afterPropertiesSet();
return template;
}
}
测试
编写测试类,测试 Redis 的五种数据结构以及事务操作。
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString() {
String redisKey = "test:count";
redisTemplate.opsForValue().set(redisKey,1);
System.out.println(redisTemplate.opsForValue().get(redisKey));//1
}
@Test
public void testHash() {
String redisKey = "test:user";
redisTemplate.opsForHash().put(redisKey,"id",1);
redisTemplate.opsForHash().put(redisKey,"name","sjh");
System.out.println(redisTemplate.opsForHash().get(redisKey,"id"));// 1
System.out.println(redisTemplate.opsForHash().get(redisKey,"name"));// sjh
}
@Test
public void testList() {
String redisKey = "test:list";
redisTemplate.opsForList().leftPush(redisKey,"小明");
redisTemplate.opsForList().leftPush(redisKey,"小红");
redisTemplate.opsForList().leftPush(redisKey,"小李");
System.out.println(redisTemplate.opsForList().size(redisKey));// 3
System.out.println(redisTemplate.opsForList().range(redisKey,0,2));// [小李, 小红, 小明]
redisTemplate.opsForList().rightPop(redisKey);
System.out.println(redisTemplate.opsForList().range(redisKey,0,2));// [小李, 小红]
}
@Test
public void testSet() {
String redisKey = "test:teachers";
redisTemplate.opsForSet().add(redisKey,"刘备","关羽","张飞","赵云");
System.out.println(redisTemplate.opsForSet().size(redisKey));// 4
System.out.println(redisTemplate.opsForSet().pop(redisKey));// 张飞
}
@Test
public void testZset() {
String redisKey = "test:students";
redisTemplate.opsForZSet().add(redisKey, "刘备", 10);
redisTemplate.opsForZSet().add(redisKey, "张飞", 20);
redisTemplate.opsForZSet().add(redisKey, "关羽", 30);
System.out.println(redisTemplate.opsForZSet().zCard(redisKey));// 3
System.out.println(redisTemplate.opsForZSet().score(redisKey, "刘备"));// 10.0
System.out.println(redisTemplate.opsForZSet().range(redisKey, 0, 2));// [刘备, 张飞, 关羽]
}
@Test
public void testKeys() {
redisTemplate.delete("test:user");
System.out.println(redisTemplate.hasKey("test:user"));// 0
// 设置10秒后过期
redisTemplate.expire("test:students",10, TimeUnit.SECONDS);
}
// 多次访问同一个 key
@Test
public void testBindKey() {
String redisKey = "test:count";
BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
for (int i = 0; i < 5; i++) {
operations.increment();
}
System.out.println(operations.get());// 6
}
@Test
public void testTransaction() {
Object obj = redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations redisOperations) throws DataAccessException {
String redisKey = "test:tx";
// 启用事务
redisOperations.multi();
redisOperations.opsForSet().add(redisKey,"a");
redisOperations.opsForSet().add(redisKey,"b");
redisOperations.opsForSet().add(redisKey,"c");
System.out.println(redisOperations.opsForSet().members(redisKey));// [],提交事务前不会生效,因此结果为空。
// 提交事务
return redisOperations.exec();
}
});
System.out.println("事务执行结果:");
System.out.println(obj);// [1, 1, 1, [c, b, a]],三个 1 分别代表三次执行语句的执行结果(影响的行数)
}
}