SpringBoot:SpringBoot簡單集成Redis進行開發

一、在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;
  1. String類型的存取
redisTemplate.opsForValue().set("test", "hello");

System.out.println(redisTemplate.opsForValue().get("test").toString());
  1. 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);
  1. 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);
}
  1. 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);
}
  1. 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);
}
  1. 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");
}
  1. 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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章