Spring Boot整合Redis提供了 RedisTemplate与StringRedisTemplate两个类,其中StringRedisTemplate是RedisTemplate的子类,两个方法基本一致,不同之处主要体现在操作的数据类型不同,RedisTemplate中两个泛型都是Object,意味着存储的key和value都可以是一个对象,而StringRedisTemplate的两个泛型都是String,意味着StringRedisTemplate的key和value都只能是字符串。
StringRedisTemplate<String,String>
RedisTemplate<Object,Object>
引入redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置设置
spring:
redis:
host: 192.168.2.167
port: 6379 #端口
password: 123456 #密码
database: 0
StringRedisTemplate应用
StringRedisTemplate主要应用于键和值都是String的情况
创建测试类测试:
package com.example.springredis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
@SpringBootTest
class SpringRedisApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void test1(){
Set<String> keys = stringRedisTemplate.keys("*");
keys.forEach(System.out::println);
}
}
操作Keys
直接使用stringRedisTemplate,点方法就可以
stringRedisTemplate.type("name"); //获取类型
stringRedisTemplate.delete("name"); //删除指定key
stringRedisTemplate.hasKey("name");//判断key是否存在
stringRedisTemplate.getExpire("name");//查看过期时间 -1 代表永不超时 -2 代表过期
操作String
使用stringRedisTemplate.opsForValue()操作的就是字符串类型
stringRedisTemplate.opsForValue().set("gender","女");
String gender = stringRedisTemplate.opsForValue().get("gender");
System.out.println(gender);
//设置一个key超时时间
stringRedisTemplate.opsForValue().set("code","000098",120, TimeUnit.SECONDS);
操作List
使用stringRedisTemplate.opsForList()操作的就是list类型
stringRedisTemplate.opsForList().leftPush("names","张三");
stringRedisTemplate.opsForList().leftPushAll("names","张三","李四","王五");
List<String> list=new ArrayList<>();
list.add(0,"老大");
list.add(1,"老二");
list.add(2,"老三");
stringRedisTemplate.opsForList().leftPushAll("names",list);
List<String> names = stringRedisTemplate.opsForList().range("names", 0, -1);
names.forEach(System.out::println);
操作Set
使用stringRedisTemplate.opsForSet()操作的就是set类型
stringRedisTemplate.opsForSet().add("userNames","张三","张三","李四","王五");
Set<String> userNames = stringRedisTemplate.opsForSet().members("userNames");
Long size = stringRedisTemplate.opsForSet().size("userNames");
System.out.println(size);
userNames.forEach(System.out::println);
操作zSet
使用stringRedisTemplate.opsForZSet()操作的就是zSet类型
stringRedisTemplate.opsForZSet().add("zsets", "java", 500);
stringRedisTemplate.opsForZSet().add("zsets", "spring", 200);
stringRedisTemplate.opsForZSet().add("zsets", "redis", 300);
Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);
zsets.forEach(System.out::println);
System.out.println("========================");
Set<ZSetOperations.TypedTuple<String>> zsets1 = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets",200,500);
zsets1.forEach(item -> {
System.out.println("item"+item);
System.out.println(item.getValue());
System.out.println(item.getScore());
});
操作Hash
使用stringRedisTemplate.opsForHash()操作的就是hash类型
stringRedisTemplate.opsForHash().put("maps","name","张三");
Object o = stringRedisTemplate.opsForHash().get("maps", "name");
System.out.println(o);
Set<Object> name = stringRedisTemplate.opsForHash().keys("maps");
name.forEach(System.out::println);
List<Object> maps = stringRedisTemplate.opsForHash().values("maps");
maps.forEach(System.out::println);
RedisTemplate应用
RedisTemplate主要应用于存储的值是对象的情况,但如果使用对象,所有的对象都必须进行序列化才可以存储。
RedisTemplate存储的时候会对键和值进行序列化操作。
操作普通对象
User u1 = new User("zs", 20, "15386880458");
redisTemplate.opsForValue().set("u1", u1);
User user =(User) redisTemplate.opsForValue().get("u1");
System.out.println(user);
操作List
@Test
public void test2() {
User u1 = new User("zs", 20, "15386880458");
User u2 = new User("lisi", 20, "15386880458");
redisTemplate.opsForList().leftPush("users",u1);
redisTemplate.opsForList().leftPush("users",u2);
List userlist = redisTemplate.opsForList().range("users", 0, -1);
userlist.forEach(System.out::println);
}
操作Hash
@Test
public void test4() {
User u1 = new User(100, "lxd", 20);
User u2 = new User(101, "cdp", 21);
User u3 = new User(102, "luhui", 21);
List<User> list = new ArrayList<>(); //从数据库中获取到集合数据
list.add(u1);
list.add(u2);
list.add(u3);
redisTemplate.opsForHash().put("data", "userList", list);
List<User> userList = (List<User>) redisTemplate.opsForHash().get("data", "userList");
for (User user : userList) {
System.out.println(user);
}
}
自定义Template
springboot项目整合Redis记录了RedisTemplate和StringRedisTemplate的使用效果,由于分别使用了不同的序列化器,所以在Redis中存储的形式也不相同。redisTemplate使用的是默认的序列化器jdk序列化方式,而StringRedisTemplate使用了String序列化方式,如果使用默认的这种序列化方式,存入redis中的key就变成带有转义字符的,这种情况就可以自定义RedisTemplate类,一般为了开发的方便,直接定义RedisTemplate<String, Object>类型,配置内容如下,企业实际开发中,直接可以使用:
使用的依赖,springboot已经集成,无需再导入
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
配置类:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//自定义Jackson序列化配置
Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jsonRedisSerializer.setObjectMapper(objectMapper);
//key使用String的序列化方式
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
//hash的key也是用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value的key使用jackson的序列化方式
template.setValueSerializer(jsonRedisSerializer);
//hash的value也是用jackson的序列化方式
template.setHashValueSerializer(jsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}