SpringBoot2.1簡單使用Redis的StringRedisTemplate
pom檔案依賴:
<!--redis資料庫-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0整合redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</ groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
yml檔案:
spring:
redis:
host: localhost
password:
port: 6379
jedis:
pool:
#最大連線數
max-active: 8
#最大阻塞等待時間(負數表示沒限制)
max-wait : -1ms
#最大空閒
max-idle: 8
#最小空閒
min-idle: 0
#連線超時時間
timeout: 10000
# 0號資料庫
database: 0
測試類:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DigitalmallApplicationTests {
@Autowired
StringRedisTemplate srt;
@Test
public void contextLoads () {
/*Car c=new Car();
c.setGoodId(1000l);
c.setNum(1000);
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
c.setSo(list);*/
User u=new User();
u.setId(1001);
u.setName("我是name");
srt.opsForValue().set("1001:car",JSON.toJSONString(u));
String s = srt.opsForValue().get("1001:car");
System.err.println(s+">>>>>");
}
}
RedisTemplate使用需要自動生成key等其他的配置,在這裡不再列出
補充(引用其他人的博文):
關於RedisTemplate和StringRedisTemplate的區別:
最近在開始在學習Redis以及如何在Java當中去使用Redis,Redis是什麼我這裡就不說了。
我主要想說的是Redis和Java當中Spring結合起來的時候,使用到的RedisTemplate和StringRedisTemplate
他們兩者之間的區別,以及該怎麼使用。
RedisTemplate看這個類的名字字尾是Template,如果瞭解過Spring如何連線關係型資料庫的,大概不會難猜出這個類是做什麼的 ,它跟JdbcTemplate一樣封裝了對Redis的一些常用的操作,當然StringRedisTemplate跟RedisTemplate功能類似那麼肯定就會有人問,為什麼會需要兩個Template呢,一個不就夠了嗎?其實他們兩者之間的區別主要在於他們使用的序列化類。
- RedisTemplate使用的是 JdkSerializationRedisSerializer
- StringRedisTemplate使用的是 StringRedisSerializer
RedisTemplate使用的序列類在在操作資料的時候,比如說存入資料會將資料先序列化成位元組陣列
然後在存入Redis資料庫,這個時候開啟Redis檢視的時候,你會看到你的資料不是以可讀的形式 展現的,而是以位元組陣列顯示,類似下面
當然從Redis獲取資料的時候也會預設將資料當做位元組陣列轉化,這樣就會導致一個問題,當需要獲取的 資料不是以位元組陣列存在redis當中而是正常的可讀的字串的時候,比如說下面這種形式的資料
注:使用的軟體是RedisDesktopManager RedisTemplate就無法獲取導資料,這個時候獲取到的值就是NULL。這個時候StringRedisTempate就派上了用場
當Redis當中的資料值是以可讀的形式顯示出來的時候,只能使用StringRedisTemplate才能獲取到裡面的資料。 所以當你使用RedisTemplate獲取不到資料的時候請檢查一下是不是Redis裡面的資料是可讀形式而非位元組陣列
另外我在測試的時候即使把StringRedisTemplate的序列化類修改成RedisTemplate的JdkSerializationRedisSerializer 最後還是無法獲取被序列化的物件資料,即使是沒有轉化為物件的位元組陣列,程式碼如下
-
@Test
-
public void testRedisSerializer(){
-
User u =
new User();
-
u.setName(
"java");
-
u.setSex(
"male");
-
redisTemplate.opsForHash().put(
"user:",
"1",u);
-
/*檢視redisTemplate 的Serializer*/
-
System.out.println(redisTemplate.getKeySerializer());
-
System.out.println(redisTemplate.getValueSerializer());
-
-
/*檢視StringRedisTemplate 的Serializer*/
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
-
/*將stringRedisTemplate序列化類設定成RedisTemplate的序列化類*/
-
stringRedisTemplate.setKeySerializer(
new JdkSerializationRedisSerializer());
-
stringRedisTemplate.setValueSerializer(
new JdkSerializationRedisSerializer());
-
-
/*即使在更換stringRedisTemplate的的Serializer和redisTemplate一致的
-
* JdkSerializationRedisSerializer
-
* 最後還是無法從redis中獲取序列化的資料
-
* */
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
-
User user = (User) redisTemplate.opsForHash().get(
"user:",
"1");
-
User user2 = (User) stringRedisTemplate.opsForHash().get(
"user:",
"1");
-
System.out.println(
"dsd");
-
}
總結: 當你的redis資料庫裡面本來存的是字串資料或者你要存取的資料就是字串型別資料的時候,那麼你就使用StringRedisTemplate即可, 但是如果你的資料是複雜的物件型別,而取出的時候又不想做任何的資料轉換,直接從Redis裡面取出一個物件,那麼使用RedisTemplate是 更好的選擇。
附註:
這個段程式碼程式碼使用的Spring和Junit測試的,具體配置檔案和其他程式碼見 點選開啟github最近在開始在學習Redis以及如何在Java當中去使用Redis,Redis是什麼我這裡就不說了。
我主要想說的是Redis和Java當中Spring結合起來的時候,使用到的RedisTemplate和StringRedisTemplate
他們兩者之間的區別,以及該怎麼使用。
RedisTemplate看這個類的名字字尾是Template,如果瞭解過Spring如何連線關係型資料庫的,大概不會難猜出這個類是做什麼的 ,它跟JdbcTemplate一樣封裝了對Redis的一些常用的操作,當然StringRedisTemplate跟RedisTemplate功能類似那麼肯定就會有人問,為什麼會需要兩個Template呢,一個不就夠了嗎?其實他們兩者之間的區別主要在於他們使用的序列化類。
- RedisTemplate使用的是 JdkSerializationRedisSerializer
- StringRedisTemplate使用的是 StringRedisSerializer
RedisTemplate使用的序列類在在操作資料的時候,比如說存入資料會將資料先序列化成位元組陣列
然後在存入Redis資料庫,這個時候開啟Redis檢視的時候,你會看到你的資料不是以可讀的形式 展現的,而是以位元組陣列顯示,類似下面
當然從Redis獲取資料的時候也會預設將資料當做位元組陣列轉化,這樣就會導致一個問題,當需要獲取的 資料不是以位元組陣列存在redis當中而是正常的可讀的字串的時候,比如說下面這種形式的資料
注:使用的軟體是RedisDesktopManager RedisTemplate就無法獲取導資料,這個時候獲取到的值就是NULL。這個時候StringRedisTempate就派上了用場
當Redis當中的資料值是以可讀的形式顯示出來的時候,只能使用StringRedisTemplate才能獲取到裡面的資料。 所以當你使用RedisTemplate獲取不到資料的時候請檢查一下是不是Redis裡面的資料是可讀形式而非位元組陣列
另外我在測試的時候即使把StringRedisTemplate的序列化類修改成RedisTemplate的JdkSerializationRedisSerializer 最後還是無法獲取被序列化的物件資料,即使是沒有轉化為物件的位元組陣列,程式碼如下
-
@Test
-
public void testRedisSerializer(){
-
User u =
new User();
-
u.setName(
"java");
-
u.setSex(
"male");
-
redisTemplate.opsForHash().put(
"user:",
"1",u);
-
/*檢視redisTemplate 的Serializer*/
-
System.out.println(redisTemplate.getKeySerializer());
-
System.out.println(redisTemplate.getValueSerializer());
-
-
/*檢視StringRedisTemplate 的Serializer*/
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
-
/*將stringRedisTemplate序列化類設定成RedisTemplate的序列化類*/
-
stringRedisTemplate.setKeySerializer(
new JdkSerializationRedisSerializer());
-
stringRedisTemplate.setValueSerializer(
new JdkSerializationRedisSerializer());
-
-
/*即使在更換stringRedisTemplate的的Serializer和redisTemplate一致的
-
* JdkSerializationRedisSerializer
-
* 最後還是無法從redis中獲取序列化的資料
-
* */
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
System.out.println(stringRedisTemplate.getValueSerializer());
-
-
User user = (User) redisTemplate.opsForHash().get(
"user:",
"1");
-
User user2 = (User) stringRedisTemplate.opsForHash().get(
"user:",
"1");
-
System.out.println(
"dsd");
-
}
總結: 當你的redis資料庫裡面本來存的是字串資料或者你要存取的資料就是字串型別資料的時候,那麼你就使用StringRedisTemplate即可, 但是如果你的資料是複雜的物件型別,而取出的時候又不想做任何的資料轉換,直接從Redis裡面取出一個物件,那麼使用RedisTemplate是 更好的選擇。