天天看點

Spring Boot 整合redis的兩種方式

引入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 組成一個索引,指向一個值;

Spring Boot 整合redis的兩種方式

這裡@Cacheable、@CacheEvict注解的cacheNames 和 key 兩個屬性相同,是以操作的是redis資料庫中的同一條資料;

unless屬性

當滿足此條件時,不執行本次緩存操作;

unless = "#result==null"
           

展現在這裡就是:當查詢到的結果為null時,不執行此次緩存操作;

Template模闆方式使用

注解方式生成的redis緩存,是以預設模闆存儲的,無法被閱讀,也和一些其他工具不相容;

Spring Boot 整合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的實作類:

Spring Boot 整合redis的兩種方式
在接口上按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;
    }
}
           

可以看到,更改序列化方式後,資料格式和之前不同了:

Spring Boot 整合redis的兩種方式

這裡使用到的opsForValue是用來處理字元串的;

另外還有opsForHash、opsForList、opsForSet、opsForZset來操作其他類型的資料;

繼續閱讀