引入spring-data-redis啟動器,屏蔽lettuce用戶端;
為了在springboot中使用redis,首先要添加redis啟動器;
這裡我們使用jedis,需要在
pom.xml
中屏蔽自帶的lettuce;
關于lettuce、jedis的差别見 Redis的三個架構:Jedis,Redisson,Lettuce
<!--redis內建-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<!--排除lettuce-->
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--使用jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
配置redis伺服器位址
在
application.yml
中配置redis伺服器位址
spring:
#....省略其他配置....
redis:
#這裡不填寫的話預設是 localhost和 6379
host: 127.0.0.1
port: 6379
password: root
注解方式使用
基于注解方式使用redis,操作友善,适合簡單的redis應用;
1、在主程式開啟注解
在
application.java
主程式開啟注解@EnableCaching
@SpringBootApplication
@MapperScan("com.example.test.dao")
@EnableTransactionManagement
@EnableCaching //開啟redis緩存
public class Application extends SpringBootServletInitializer {
//以下省略
2、在服務層使用注解
我們常用的注解是@Cacheable和 @CacheEvict,前者新增緩存,後者删除緩存;
@Cacheable
當redis緩存中沒有對應的資料時,向資料庫查詢,并将查詢結果新增到redis緩存;
@CacheEvict
此方法執行後,删除對應的redis緩存;
@Service
public class UserServiceImpl implements UserService{
@Autowired
private SysuserMapper mapper;
@Cacheable(cacheNames = "Sysuserinfo",key = "#uid",unless = "#result==null")
@Override
public Sysuser select(Integer uid){
Sysuser user= mapper.selectByPrimaryKey(uid);
return user;
}
@CacheEvict(cacheNames = "Sysuserinfo",key = "#uid")
@Override
public boolean delete(Integer uid){
int resul=mapper.deleteByPrimaryKey(uid);
return resul>0;
}
}
cacheNames 和 key
cacheNames 和 key 組成一個索引,指向一個值;

這裡@Cacheable、@CacheEvict注解的cacheNames 和 key 兩個屬性相同,是以操作的是redis資料庫中的同一條資料;
unless屬性
當滿足此條件時,不執行本次緩存操作;
unless = "#result==null"
展現在這裡就是:當查詢到的結果為null時,不執行此次緩存操作;
Template模闆方式使用
注解方式生成的redis緩存,是以預設模闆存儲的,無法被閱讀,也和一些其他工具不相容;
使用模闆方式,可是設定緩存的格式;
1、建立一個redis設定類
建立
redisConfig.java
,設定key和value的序列化方式;
@Configuration
public class RedisConfig {
//這種方式bean name固定是這個
@Bean(name = "redisTemplate")
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> template=new RedisTemplate<>();
//設定序列化方式
template.setKeySerializer(new StringRedisSerializer()); //key設定string序列化方式
template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //value設定json序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//這一步是redis基本配置 包括前面設定端口和ip
template.setConnectionFactory(factory);
return template;
}
}
redisSerializer的實作類:
在接口上按ctrl+H可以檢視所有實作類
2、使用template
和使用jedis差不多,先從緩存資料庫中取,緩存穿透再去資料庫取;
在删除和修改時,則是根據key删除對應的緩存;
@Service
public class UserServiceImpl implements UserService{
@Autowired
protected SysuserMapper mapper;
@Autowired
private RedisTemplate<String,Object> template;
@Override
public Sysuser get(Integer uid){ //方法:查詢使用者
Sysuser user= null;
ValueOperations<String,Object> operations=template.opsForValue();
Object object=operations.get(""+uid); //先嘗試從緩存中取
if(object==null){
user=mapper.selectByPrimaryKey(uid); //緩存穿透 再去資料庫取
operations.set(""+uid,user); //并存到緩存資料庫中
}else {
user=(Sysuser)object;
}
return user;
}
@Override
public boolean update(Integer uid,String uname){ //方法:更新使用者名
Sysuser sysuser=new Sysuser();
sysuser.setUid(uid);
sysuser.setUname(uname);
int result=mapper.updateByPrimaryKey(sysuser);
if(result>0){
template.delete(""+uid); //删除緩存
return true;
}
return false;
}
}
可以看到,更改序列化方式後,資料格式和之前不同了:
這裡使用到的opsForValue是用來處理字元串的;
另外還有opsForHash、opsForList、opsForSet、opsForZset來操作其他類型的資料;