java 对Redis调用有好多种方式,可以用java的客户端Jedis进行相应的交互操作。
Spring和Redis的集成,封装了一个比较强大的RedisTemplate;
1. 依赖
依然是采用Jedis进行连接池管理,因此除了引入 spring-data-redis之外,再加上jedis依赖,pom文件中添加 <!-- 引入 redis 依赖 -->
application.properties里面配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring.redis.database=1
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.pool.max-active=1000
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=10
spring.redis.pool.min-idle=2
spring.redis.timeout=0
使用
import java.io.IOException;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.pojo.SysUser;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
@RestController
@RequestMapping("redis")
public class RedisContronller {
@Autowired
private StringRedisTemplate strRedis;
@RequestMapping("test")
public String test() throws IOException {
strRedis.opsForValue().set("name", "lnndjj");
//
SysUser user =new SysUser();
user.setId("1111111");
user.setNickname("lnndjj");
user.setPassword("lnnpwd");
user.setRegistTime(new Date());
ObjectMapper objectMapper=new ObjectMapper();
//把对象转成json
String jsonUser =objectMapper.writeValueAsString(user);
//把json转成对象
SysUser u= objectMapper.readValue(jsonUser, SysUser.class);
//把json转成List
JavaType javaType=objectMapper.getTypeFactory().constructParametricType(List.class ,SysUser.class);
List<SysUser> userList=objectMapper.readValue(jsonUser, javaType);
return strRedis.opsForValue().get("name") ;
}
}
常用方法
stringRedis.opsForValue().set("liunn", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
stringRedis.boundValueOps("liunn").increment(-1);//val做-1操作
stringRedis.opsForValue().get("liunn")//根据key获取缓存中的val
stringRedis.boundValueOps("liunn").increment(1);//val +1
stringRedis.getExpire("liunn")//根据key获取过期时间
stringRedis.getExpire("liunn",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
stringRedis.delete("liunn");//根据key删除缓存
stringRedis.hasKey("liunn");//检查key是否存在,返回boolean值,哈希,就是键值对。
stringRedis.opsForSet().add("liunnTestOne", "1","2","3");//向指定key中存放set集合
stringRedis.expire("liunn",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedis.opsForSet().isMember("liunn", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合
StringRedisTemplate与RedisTemplate区别点
-
两者的关系是StringRedisTemplate继承RedisTemplate。
-
两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
- 其实他们两者之间的区别主要在于他们使用的序列化类:
RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。
StringRedisTemplate使用的是StringRedisSerializer
- 使用时注意事项:
当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
- RedisTemplate使用时常见问题:
redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null。可以使用 StringRedisTemplate 试试。
RedisTemplate中定义了5种数据结构操作
redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set