亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Java中使用redisTemplate操作緩存的方法示例

 更新時(shí)間:2019年01月18日 14:23:24   作者:detectiveHLH  
這篇文章主要介紹了在Java中使用redisTemplate操作緩存的方法示例,在Redis中可以存儲(chǔ)String、List、Set、Hash、Zset。感興趣的可以了解一下

背景

在最近的項(xiàng)目中,有一個(gè)需求是對(duì)一個(gè)很大的數(shù)據(jù)庫(kù)進(jìn)行查詢,數(shù)據(jù)量大概在幾千萬(wàn)條。但同時(shí)對(duì)查詢速度的要求也比較高。

這個(gè)數(shù)據(jù)庫(kù)之前在沒(méi)有使用Presto的情況下,使用的是Hive,使用Hive進(jìn)行一個(gè)簡(jiǎn)單的查詢,速度可能在幾分鐘。當(dāng)然幾分鐘也并不完全是跑SQL的時(shí)間,這里面包含發(fā)請(qǐng)求,查詢數(shù)據(jù)并且返回?cái)?shù)據(jù)的時(shí)間的總和。但是即使這樣,這樣的速度明顯不能滿足查詢需求。

我們的下一個(gè)解決方案就是Presto,在使用了Presto之后,查詢速度降到了秒級(jí)。但是對(duì)于一個(gè)前端查詢界面的交互式查詢來(lái)說(shuō),十幾秒仍然是一個(gè)不能接受的時(shí)間。

雖然Presto相比Hive已經(jīng)快了很多(FaceBook官方宣稱的是10倍),但是對(duì)分頁(yè)的支持不是很友好。我在使用的時(shí)候是自己在后端實(shí)現(xiàn)的分頁(yè)。

在這種情況下應(yīng)用緩存實(shí)屬無(wú)奈之舉。講道理,優(yōu)化應(yīng)從底層開始,自底而上。上層優(yōu)化的方式和效率感覺(jué)都很有局限。

<!--more-->

為什么要使用緩存

前端查詢中,單次查詢的匹配數(shù)據(jù)量有可能會(huì)達(dá)到上百甚至上千條,在前端中肯定是需要分頁(yè)展示的。就算每次查詢10條數(shù)據(jù),整個(gè)查詢也要耗時(shí)6-8s的時(shí)間。想象一下,每翻一頁(yè)等10s的場(chǎng)景。

所以,此時(shí)使用redis緩存。減少請(qǐng)求數(shù)據(jù)庫(kù)的次數(shù)。將匹配的數(shù)據(jù)一并存入數(shù)據(jù)庫(kù)。這樣只有在第一次查詢時(shí)耗費(fèi)長(zhǎng)一點(diǎn),一旦查詢完成,用戶點(diǎn)擊下一頁(yè)就是毫秒級(jí)別的操作了。

使用redisTemplate

Spring封裝了一個(gè)比較強(qiáng)大的模板,也就是redisTemplate,方便在開發(fā)的時(shí)候操作Redis緩存。在Redis中可以存儲(chǔ)String、List、Set、Hash、Zset。下面將針對(duì)List和Hash分別介紹。

List

Redis中的List為簡(jiǎn)單的字符串列表,常見(jiàn)的有下面幾種操作。

hasKey

判斷一個(gè)鍵是否存在,只需要調(diào)用hasKey就可以了。假設(shè)這個(gè)Key是test,具體用法如下。

if (redisTemplate.hasKey("test")) {
  System.out.println("存在");
} else {
  System.out.println("不存在");
}

range

該函數(shù)用于從redis緩存中獲取指定區(qū)間的數(shù)據(jù)。具體用法如下。

if (redisTemplate.hasKey("test")) {
  // 該鍵的值為 [4, 3, 2, 1]
  System.out.println(redisTemplate.opsForList().range("test", 0, 0)); // [4]
  System.out.println(redisTemplate.opsForList().range("test", 0, 1)); // [4, 3]
  System.out.println(redisTemplate.opsForList().range("test", 0, 2)); // [4, 3, 2]
  System.out.println(redisTemplate.opsForList().range("test", 0, 3)); // [4, 3, 2, 1]
  System.out.println(redisTemplate.opsForList().range("test", 0, 4)); // [4, 3, 2, 1]
  System.out.println(redisTemplate.opsForList().range("test", 0, 5)); // [4, 3, 2, 1]
  
  System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [4, 3, 2, 1] 如果結(jié)束位是-1, 則表示取所有的值
}

delete

刪除某個(gè)鍵。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");

redisTemplate.opsForList().rightPushAll("test", test);
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [1, 2, 3, 4]
redisTemplate.delete("test");
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // []

size

獲取該鍵的集合長(zhǎng)度。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");

redisTemplate.opsForList().rightPushAll("test", test);
System.out.println(redisTemplate.opsForList().size("test")); // 4

leftPush

我們把存放這個(gè)值的地方想象成如圖所示的容器。

container

并且取數(shù)據(jù)總是從左邊取,但是存數(shù)據(jù)可以從左也可以從右。左就是leftPush,右就是rightPush。leftPush如下圖所示。

left-push

用法如下。

for (int i = 0; i < 4; i++) {
  Integer value = i + 1;
  redisTemplate.opsForList().leftPush("test", value.toString());
  System.out.println(redisTemplate.opsForList().range("test", 0, -1));
}

控制臺(tái)輸出的結(jié)果如下。

[1]
[2, 1]
[3, 2, 1]
[4, 3, 2, 1]

leftPushAll

基本和leftPush一樣,只不過(guò)是一次性的將List入棧。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
redisTemplate.opsForList().leftPushAll("test", test);
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [4, 3, 2, 1]

當(dāng)然你也可以這樣

redisTemplate.opsForList().leftPushAll("test", test);
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [4, 3, 2, 1]

leftPushIfPresent

leftPush是同樣的操作,唯一的不同是,當(dāng)且僅當(dāng)key存在時(shí),才會(huì)更新key的值。如果key不存在則不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何操作。

redisTemplate.delete("test");

redisTemplate.opsForList().leftPushIfPresent("test", "1");
redisTemplate.opsForList().leftPushIfPresent("test", "2");
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // []

leftPop

該函數(shù)用于移除上面我們抽象的容器中的最左邊的一個(gè)元素。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
redisTemplate.opsForList().rightPushAll("test", test);

redisTemplate.opsForList().leftPop("test"); // [2, 3, 4]
redisTemplate.opsForList().leftPop("test"); // [3, 4]
redisTemplate.opsForList().leftPop("test"); // [4]
redisTemplate.opsForList().leftPop("test"); // []
redisTemplate.opsForList().leftPop("test"); // []

值得注意的是,當(dāng)返回為空后,在redis中這個(gè)key也不復(fù)存在了。如果此時(shí)再調(diào)用leftPushIfPresent,是無(wú)法再添加數(shù)據(jù)的。有代碼有真相。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
redisTemplate.opsForList().rightPushAll("test", test);

redisTemplate.opsForList().leftPop("test"); // [2, 3, 4]
redisTemplate.opsForList().leftPop("test"); // [3, 4]
redisTemplate.opsForList().leftPop("test"); // [4]
redisTemplate.opsForList().leftPop("test"); // []
redisTemplate.opsForList().leftPop("test"); // []

redisTemplate.opsForList().leftPushIfPresent("test", "1"); // []
redisTemplate.opsForList().leftPushIfPresent("test", "1"); // []

rightPush

rightPush如下圖所示。

right-push

用法如下。

for (int i = 0; i < 4; i++) {
  Integer value = i + 1;
  redisTemplate.opsForList().leftPush("test", value.toString());
  System.out.println(redisTemplate.opsForList().range("test", 0, -1));
}

控制臺(tái)輸出的結(jié)果如下。

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

rightPushAll

同rightPush,一次性將List存入。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
redisTemplate.opsForList().leftPushAll("test", test);
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [1, 2, 3, 4]

當(dāng)然你也可以這樣。

redisTemplate.opsForList().rightPushAll("test", "1", "2", "3", "4");
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [1, 2, 3, 4]

rightPushIfPresent

rightPush是同樣的操作,唯一的不同是,當(dāng)且僅當(dāng)key存在時(shí),才會(huì)更新key的值。如果key不存在則不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何操作。

redisTemplate.delete("test");

redisTemplate.opsForList().rightPushIfPresent("test", "1");
redisTemplate.opsForList().rightPushIfPresent("test", "2");
System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // []

rightPop

該函數(shù)用于移除上面我們抽象的容器中的最右邊的一個(gè)元素。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
redisTemplate.opsForList().rightPushAll("test", test);

redisTemplate.opsForList().rightPop("test"); // [1, 2, 3]
redisTemplate.opsForList().rightPop("test"); // [1, 2]
redisTemplate.opsForList().rightPop("test"); // [1]
redisTemplate.opsForList().rightPop("test"); // []
redisTemplate.opsForList().rightPop("test"); // []

與leftPop一樣,返回空之后,再調(diào)用rightPushIfPresent,是無(wú)法再添加數(shù)據(jù)的。

index

獲取list中指定位置的元素。

if (redisTemplate.hasKey("test")) {
  // 該鍵的值為 [1, 2, 3, 4]
  System.out.println(redisTemplate.opsForList().index("test", -1)); // 4
  System.out.println(redisTemplate.opsForList().index("test", 0)); // 1
  System.out.println(redisTemplate.opsForList().index("test", 1)); // 2
  System.out.println(redisTemplate.opsForList().index("test", 2)); // 3
  System.out.println(redisTemplate.opsForList().index("test", 3)); // 4
  System.out.println(redisTemplate.opsForList().index("test", 4)); // null
  System.out.println(redisTemplate.opsForList().index("test", 5)); // null
}

值得注意的有兩點(diǎn)。一個(gè)是如果下標(biāo)是-1的話,則會(huì)返回List最后一個(gè)元素,另一個(gè)如果數(shù)組下標(biāo)越界,則會(huì)返回null。

trim

用于截取指定區(qū)間的元素,可能你會(huì)理解成與range是一樣的作用。看了下面的代碼之后應(yīng)該就會(huì)立刻理解。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
redisTemplate.opsForList().rightPushAll("test", test); // [1, 2, 3, 4]

redisTemplate.opsForList().trim("test", 0, 2); // [1, 2, 3]

其實(shí)作用完全不一樣。range是獲取指定區(qū)間內(nèi)的數(shù)據(jù),而trim是留下指定區(qū)間的數(shù)據(jù),刪除不在區(qū)間的所有數(shù)據(jù)。trimvoid,不會(huì)返回任何數(shù)據(jù)。

remove

用于移除鍵中指定的元素。接受3個(gè)參數(shù),分別是緩存的鍵名,計(jì)數(shù)事件,要移除的值。計(jì)數(shù)事件可以傳入的有三個(gè)值,分別是-101。

-1代表從存儲(chǔ)容器的最右邊開始,刪除一個(gè)與要移除的值匹配的數(shù)據(jù);0代表刪除所有與傳入值匹配的數(shù)據(jù);1代表從存儲(chǔ)容器的最左邊開始,刪除一個(gè)與要移除的值匹配的數(shù)據(jù)。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");
test.add("4");
test.add("3");
test.add("2");
test.add("1");

redisTemplate.opsForList().rightPushAll("test", test); // [1, 2, 3, 4, 4, 3, 2, 1]

// 當(dāng)計(jì)數(shù)事件是-1、傳入值是1時(shí)
redisTemplate.opsForList().remove("test", -1, "1"); // [1, 2, 3, 4, 4, 3, 2]

// 當(dāng)計(jì)數(shù)事件是1,傳入值是1時(shí)
redisTemplate.opsForList().remove("test", 1, "1"); // [2, 3, 4, 4, 3, 2]

// 當(dāng)計(jì)數(shù)事件是0,傳入值是4時(shí)
redisTemplate.opsForList().remove("test", 0, "4"); // [2, 3, 3, 2]

rightPopAndLeftPush

該函數(shù)用于操作兩個(gè)鍵之間的數(shù)據(jù),接受三個(gè)參數(shù),分別是源key、目標(biāo)key。該函數(shù)會(huì)將源key進(jìn)行rightPop,再將返回的值,作為輸入?yún)?shù),在目標(biāo)key上進(jìn)行l(wèi)eftPush。具體代碼如下。

List<String> test = new ArrayList<>();
test.add("1");
test.add("2");
test.add("3");
test.add("4");

List<String> test2 = new ArrayList<>();
test2.add("1");
test2.add("2");
test2.add("3");

redisTemplate.opsForList().rightPushAll("test", test); // [1, 2, 3, 4]
redisTemplate.opsForList().rightPushAll("test2", test2); // [1, 2, 3]

redisTemplate.opsForList().rightPopAndLeftPush("test", "test2");

System.out.println(redisTemplate.opsForList().range("test", 0, -1)); // [1, 2, 3]
System.out.println(redisTemplate.opsForList().range("test2", 0, -1)); // [4, 1, 2, 3]

Hash

存儲(chǔ)類型為hash其實(shí)很好理解。在上述的List中,一個(gè)redis的Key可以理解為一個(gè)List,而在Hash中,一個(gè)redis的Key可以理解為一個(gè)HashMap。

put

用于寫入數(shù)據(jù)。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString()); // [1, 2, 3, 4]
redisTemplate.opsForHash().put("test", "isAdmin", true); // true

putALl

用于一次性向一個(gè)Hash鍵中添加多個(gè)key。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
List<String> list2 = new ArrayList<>();
list2.add("5");
list2.add("6");
list2.add("7");
list2.add("8");
Map<String, String> valueMap = new HashMap<>();
valueMap.put("map1", list.toString());
valueMap.put("map2", list2.toString());

redisTemplate.opsForHash().putAll("test", valueMap); // {map2=[5, 6, 7, 8], map1=[1, 2, 3, 4]}

putIfAbsent

用于向一個(gè)Hash鍵中寫入數(shù)據(jù)。當(dāng)key在Hash鍵中已經(jīng)存在時(shí),則不會(huì)寫入任何數(shù)據(jù),只有在Hash鍵中不存在這個(gè)key時(shí),才會(huì)寫入數(shù)據(jù)。

同時(shí),如果連這個(gè)Hash鍵都不存在,redisTemplate會(huì)新建一個(gè)Hash鍵,再寫入key。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
redisTemplate.opsForHash().putIfAbsent("test", "map", list.toString());
System.out.println(redisTemplate.opsForHash().entries("test")); // {map=[1, 2, 3, 4]}

get

用于獲取數(shù)據(jù)。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString());
redisTemplate.opsForHash().put("test", "isAdmin", true);

System.out.println(redisTemplate.opsForHash().get("test", "map")); // [1, 2, 3, 4]
System.out.println(redisTemplate.opsForHash().get("test", "isAdmin")); // true

Boolean bool = (Boolean) redisTemplate.opsForHash().get("test", "isAdmin");
System.out.println(bool); // true

String str = redisTemplate.opsForHash().get("test", "map").toString();
List<String> array = JSONArray.parseArray(str, String.class);
System.out.println(array.size()); // 4

值得注意的是,使用get函數(shù)獲取的數(shù)據(jù)都是Object類型。

所以需要使用類型與上述例子中的布爾類型的話,則需要強(qiáng)制轉(zhuǎn)換一次。List類型則可以使用fastjson這種工具來(lái)進(jìn)行轉(zhuǎn)換。轉(zhuǎn)換的例子已列舉在上述代碼中。

delete

用于刪除一個(gè)Hash鍵中的key??梢岳斫鉃閯h除一個(gè)map中的某個(gè)key。

 List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
List<String> list2 = new ArrayList<>();
list2.add("5");
list2.add("6");
list2.add("7");
list2.add("8");
Map<String, String> valueMap = new HashMap<>();
valueMap.put("map1", list.toString());
valueMap.put("map2", list2.toString());

redisTemplate.opsForHash().putAll("test", valueMap); // {map2=[5, 6, 7, 8], map1=[1, 2, 3, 4]}
redisTemplate.opsForHash().delete("test", "map1"); // {map2=[5, 6, 7, 8]}

values

用于獲取一個(gè)Hash類型的鍵的所有值。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString());
redisTemplate.opsForHash().put("test", "isAdmin", true);

System.out.println(redisTemplate.opsForHash().values("test")); // [[1, 2, 3, 4], true]

entries

用于以Map的格式獲取一個(gè)Hash鍵的所有值。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString());
redisTemplate.opsForHash().put("test", "isAdmin", true);

Map<String, String> map = redisTemplate.opsForHash().entries("test");
System.out.println(map.get("map")); // [1, 2, 3, 4]
System.out.println(map.get("map") instanceof String); // true
System.out.println(redisTemplate.opsForHash().entries("test")); // {a=[1, 2, 3, 4], isAdmin=true}

hasKey

用于獲取一個(gè)Hash鍵中是否含有某個(gè)鍵。

ist<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString());
redisTemplate.opsForHash().put("test", "isAdmin", true);

System.out.println(redisTemplate.opsForHash().hasKey("test", "map")); // true
System.out.println(redisTemplate.opsForHash().hasKey("test", "b")); // false
System.out.println(redisTemplate.opsForHash().hasKey("test", "isAdmin")); // true

keys

用于獲取一個(gè)Hash鍵中所有的鍵。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString());
redisTemplate.opsForHash().put("test", "isAdmin", true);

System.out.println(redisTemplate.opsForHash().keys("test")); // [a, isAdmin]

size

用于獲取一個(gè)Hash鍵中包含的鍵的數(shù)量。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");

redisTemplate.opsForHash().put("test", "map", list.toString());
redisTemplate.opsForHash().put("test", "isAdmin", true);

System.out.println(redisTemplate.opsForHash().size("test")); // 2

increment

用于讓一個(gè)Hash鍵中的某個(gè)key,根據(jù)傳入的值進(jìn)行累加。傳入的數(shù)值只能是double或者long,不接受浮點(diǎn)型

redisTemplate.opsForHash().increment("test", "a", 3);
redisTemplate.opsForHash().increment("test", "a", -3);
redisTemplate.opsForHash().increment("test", "a", 1);
redisTemplate.opsForHash().increment("test", "a", 0);

System.out.println(redisTemplate.opsForHash().entries("test")); // {a=1}

multiGet

用于批量的獲取一個(gè)Hash鍵中多個(gè)key的值。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
List<String> list2 = new ArrayList<>();
list2.add("5");
list2.add("6");
list2.add("7");
list2.add("8");

redisTemplate.opsForHash().put("test", "map1", list.toString()); // [1, 2, 3, 4]
redisTemplate.opsForHash().put("test", "map2", list2.toString()); // [5, 6, 7, 8]

List<String> keys = new ArrayList<>();
keys.add("map1");
keys.add("map2");

System.out.println(redisTemplate.opsForHash().multiGet("test", keys)); // [[1, 2, 3, 4], [5, 6, 7, 8]]
System.out.println(redisTemplate.opsForHash().multiGet("test", keys) instanceof List); // true

scan

獲取所以匹配條件的Hash鍵中key的值。我查過(guò)一些資料,大部分寫的是無(wú)法模糊匹配,我自己嘗試了一下,其實(shí)是可以的。如下,使用scan模糊匹配hash鍵的key中,帶SCAN的key。

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
List<String> list2 = new ArrayList<>();
list2.add("5");
list2.add("6");
list2.add("7");
list2.add("8");
List<String> list3 = new ArrayList<>();
list3.add("9");
list3.add("10");
list3.add("11");
list3.add("12");
Map<String, String> valueMap = new HashMap<>();
valueMap.put("map1", list.toString());
valueMap.put("SCAN_map2", list2.toString());
valueMap.put("map3", list3.toString());

redisTemplate.opsForHash().putAll("test", valueMap); // {SCAN_map2=[5, 6, 7, 8], map3=[9, 10, 11, 12], map1=[1, 2, 3, 4]}

Cursor<Map.Entry<String, String>> cursor = redisTemplate.opsForHash().scan("test", ScanOptions.scanOptions().match("*SCAN*").build());
if (cursor.hasNext()) {
  while (cursor.hasNext()) {
    Map.Entry<String, String> entry = cursor.next();
    System.out.println(entry.getValue()); // [5, 6, 7, 8]
  }
}

引入redisTemplate

如果大家看懂了怎么用,就可以將redisTemplate引入項(xiàng)目中了。

引入pom依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <version>2.0.5.RELEASE</version>
</dependency>

新建配置文件

然后需要新建一個(gè)RedisConfig配置文件。

package com.detectivehlh;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

/**
 * RedisConfig
 *
 * @author Lunhao Hu
 * @date 2019-01-17 15:12
 **/
@Configuration
public class RedisConfig {
  @Bean
  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    //redis序列化
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    jackson2JsonRedisSerializer.setObjectMapper(om);

    StringRedisTemplate template = new StringRedisTemplate(factory);
    template.setValueSerializer(jackson2JsonRedisSerializer);
    template.setHashKeySerializer(jackson2JsonRedisSerializer);
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.setValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
  }
}

注入

將redisTemplate注入到需要使用的地方。

@Autowired
private RedisTemplate redisTemplate;

寫在后面

Github

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中多線程的超詳細(xì)介紹

    java中多線程的超詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于java中多線程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java配置多個(gè)過(guò)濾器優(yōu)先級(jí)以及幾個(gè)常用過(guò)濾器操作

    java配置多個(gè)過(guò)濾器優(yōu)先級(jí)以及幾個(gè)常用過(guò)濾器操作

    這篇文章主要介紹了java配置多個(gè)過(guò)濾器優(yōu)先級(jí)以及幾個(gè)常用過(guò)濾器的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java和scala實(shí)現(xiàn) Spark RDD轉(zhuǎn)換成DataFrame的兩種方法小結(jié)

    Java和scala實(shí)現(xiàn) Spark RDD轉(zhuǎn)換成DataFrame的兩種方法小結(jié)

    今天小編就為大家分享一篇Java和scala實(shí)現(xiàn) Spark RDD轉(zhuǎn)換成DataFrame的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Java8中Lambda表達(dá)式的理解與應(yīng)用

    Java8中Lambda表達(dá)式的理解與應(yīng)用

    Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式和Stream?API,如果有python或者javascript的語(yǔ)言基礎(chǔ),對(duì)理解Lambda表達(dá)式有很大幫助,下面這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • SpringBoot實(shí)現(xiàn)對(duì)超大文件進(jìn)行異步壓縮下載的使用示例

    SpringBoot實(shí)現(xiàn)對(duì)超大文件進(jìn)行異步壓縮下載的使用示例

    在Web應(yīng)用中,文件下載功能是一個(gè)常見(jiàn)的需求,本文介紹了SpringBoot實(shí)現(xiàn)對(duì)超大文件進(jìn)行異步壓縮下載的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下,
    2023-09-09
  • 詳解Java的MyBatis框架中SQL語(yǔ)句映射部分的編寫

    詳解Java的MyBatis框架中SQL語(yǔ)句映射部分的編寫

    這篇文章主要介紹了Java的MyBatis框架中SQL語(yǔ)句映射部分的編寫,文中分為resultMap和增刪查改實(shí)現(xiàn)兩個(gè)部分來(lái)講解,需要的朋友可以參考下
    2016-04-04
  • JVM的垃圾回收算法一起來(lái)看看

    JVM的垃圾回收算法一起來(lái)看看

    這篇文章主要為大家詳細(xì)介紹了JVM的垃圾回收算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解Java使用雙異步后如何保證數(shù)據(jù)一致性

    詳解Java使用雙異步后如何保證數(shù)據(jù)一致性

    這篇文章主要為大家詳細(xì)介紹了Java使用雙異步后如何保證數(shù)據(jù)一致性,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2024-01-01
  • 帶你走進(jìn)Maven的大門-最全Maven配置及集成idea工具總結(jié)

    帶你走進(jìn)Maven的大門-最全Maven配置及集成idea工具總結(jié)

    Maven項(xiàng)目對(duì)象模型(POM),是一個(gè)項(xiàng)目管理工具可以通過(guò)一小段描述信息來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件.那我們想要在IDEA中使用Maven得進(jìn)行一些配置,接下來(lái)我們具體看一下是如何配置使用的,需要的朋友可以參考下
    2021-06-06
  • SpringBoot配置類中@Configuration和@Bean的作用

    SpringBoot配置類中@Configuration和@Bean的作用

    這篇文章主要介紹了SpringBoot配置類中@Configuration和@Bean的作用,@Configuration 指明當(dāng)前類是一個(gè)配置類來(lái)替代之前的Spring配置文件,Spring boot的配置類,相當(dāng)于Spring的配置文件,需要的朋友可以參考下
    2023-11-11

最新評(píng)論