一、在pom中添加springboot对Redis的支持
Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis。spring-boot-starter-data-redis依赖于spring-data-redis 和 lettuce 。
Spring Boot 1.0 默认使用的是 Jedis 客户端,2.0 替换成 Lettuce,但如果从 Spring Boot 1.5.X 切换过来,几乎感受不大差异,这是因为 spring-boot-starter-data-redis 为我们隔离了其中的差异性。
Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、在application.yml中添加Redis的简单配置信息
spring:
redis:
# Redis 服务器地址
host: 192.168.172.18
# Redis 服务器连接端口
port: 6379
# Redis 服务器连接密码(默认为空)
password:
# Redis 数据库索引(默认为0)
database: 1
#看依赖版本进行选择
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制),默认 8
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认 -1
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
#看依赖版本进行选择
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制),默认 8
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认 -1
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
三、通过配置类开启缓存
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
}
四、使用RedisTemplate进行数据的操作
@Autowired
private RedisTemplate redisTemplate;
- String类型的存取
redisTemplate.opsForValue().set("test", "hello");
System.out.println(redisTemplate.opsForValue().get("test").toString());
- Hash类型的存取
Redis的Hash类型set 的时候需要传入三个参数,第一个为 key,第二个为 field,第三个为存储的值。一般情况下 Key 代表一组数据,field 为 key 相关的属性,而 value 就是属性对应的值。
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
hash.put("test","test-1","java-1");
hash.put("test","test-2","java-2");
String value=(String) hash.get("test","test-1");
System.out.println("test : test-1 :"+value);
- List类型的存取
Redis的List类型 的应用场景非常多,也是 Redis 最重要的数据结构之一。 使用 List 可以轻松的实现一个队列,List 典型的应用场景就是消息队列,可以利用 List 的 PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。
也可以使用 range 来读取。range 后面的两个参数就是插入数据的位置,输入不同的参数就可以取出队列中对应的数据。
String key="list";
redisTemplate.delete(key);
ListOperations<String, String> list = redisTemplate.opsForList();
list.leftPush(key,"just");
list.leftPush(key,"do");
list.leftPush(key,"it");
//list value :it
String value=list.leftPop(key);
System.out.println("list value :"+value);
//list range :just
//list range :do
//list range :it
List<String> values=list.range(key,0,3);
for (String v:values){
System.out.println("list range :"+v);
}
- Set类型的存取
Redis的Set类型对外提供的功能与List 类似是一个列表的功能,特殊之处在于 Set是可以自动去重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择,并且 Set提供了判断某个成员是否在一个 Set集合内的重要接口,这个也是 List 所不能提供的。
SetOperations<String,String> set = redisTemplate.opsForSet();
set.add(key,"just");
set.add(key,"do");
set.add(key,"do");
set.add(key,"it");
//set value :do
//set value :just
//set value :it
Set<String> values = set.members(key);
for (String value:values){
System.out.println("set value :"+value);
}
Redis 为集合提供了求交集、并集、差集等操作,可以非常方便的使用。
SetOperations<String, String> set = redisTemplate.opsForSet();
String key1="setMore1";
set.add(key1,"just");
set.add(key1,"do");
set.add(key1,"do");
set.add(key1,"it");
String key2="setMore2";
set.add(key2,"java");
set.add(key2,"do");
//diffs set value :just
//diffs set value :it
Set<String> diffs=set.difference(key1,key2);
for (String v:diffs){
System.out.println("diffs set value :"+v);
}
String key3="setMore3";
set.add(key3,"just");
set.add(key3,"do");
set.add(key3,"java");
String key4="setMore4";
set.add(key4,"it");
set.add(key4,"do");
set.add(key4,"hello");
//unions value :it
//unions value :java
//unions value :do
//unions value :just
//unions value :hello
Set<String> unions=set.union(key3,key4);
for (String v:unions){
System.out.println("unions value :"+v);
}
- Zset类型的存取
Redis的Zset类型(sorted set)的使用场景与 Set 类似,区别是 Set 不是自动有序的,而 Zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序,即自动排序。
String key="zset";
redisTemplate.delete(key);
ZSetOperations<String, String> zset = redisTemplate.opsForZSet();
zset.add(key,"just",1);
zset.add(key,"now",5);
zset.add(key,"it",4);
zset.add(key,"do",3);
//zset value :just
//zset value :do
//zset value :it
Set<String> zsets=zset.range(key,0,2);
for (String v:zsets){
System.out.println("zset value :"+v);
}
//zsetB value :just
//zsetB value :do
Set<String> zsetB=zset.rangeByScore(key,0,3);
for (String v:zsetB){
System.out.println("zsetB value :"+v);
}
- Redis 删除操作
ValueOperations<String, String> operations=redisTemplate.opsForValue();
operations.set("deletekey", "springboot");
redisTemplate.delete("deletekey");
//false
boolean exists=redisTemplate.hasKey("deletekey");
if(exists){
System.out.println("exists is true");
}else{
System.out.println("exists is false");
}
- Redis 设置 超时失效
ValueOperations<String, String> operations=redisTemplate.opsForValue();
operations.set("test", "java",100,TimeUnit.MILLISECONDS);
Thread.sleep(1000);
//false
boolean exists=redisTemplate.hasKey("test");
if(exists){
System.out.println("true");
}else{
System.out.println("false");
}
五、Controller层调用缓存
@Cacheable注解中 value 的值就是缓存到 Redis 中的 key
@RestController
public class UserController {
@RequestMapping("/getUser")
@Cacheable(value="user-key")
public User getUser() {
............
return user;
}
}