一、Redis快速入門

Redis的常見命令和客戶端使用

一、初識Redis

Redis是一種鍵值型的NoSql數據庫,這里有兩個關鍵字:

  • 鍵值型

  • NoSql

其中鍵值型,是指Redis中存儲的數據都是以key、value對的形式存儲,而value的形式多種多樣,可以是字符串、數值、甚至json:

而NoSql則是相對于傳統關系型數據庫而言,有很大差異的一種數據庫。

1.認識NoSQL

NoSql可以翻譯做Not Only Sql(不僅僅是SQL),或者是No Sql(非Sql的)數據庫。是相對于傳統關系型數據庫而言,有很大差異的一種特殊的數據庫,因此也稱之為非關系型數據庫

結構化與非結構化

傳統關系型數據庫是結構化數據,每一張表都有嚴格的約束信息:字段名、字段數據類型、字段約束等等信息,插入的數據必須遵守這些約束:

而NoSql則對數據庫格式沒有嚴格約束,往往形式松散,自由。

可以是鍵值型:

也可以是文檔型:

甚至可以是圖格式:

關聯和非關聯

傳統數據庫的表與表之間往往存在關聯,例如外鍵:

而非關系型數據庫不存在關聯關系,要維護關系要么靠代碼中的業務邏輯,要么靠數據之間的耦合:

{id: 1,name: "張三",orders: [{id: 1,item: {id: 10, title: "榮耀6", price: 4999}},{id: 2,item: {id: 20, title: "小米11", price: 3999}}]
}

此處要維護“張三”的訂單與商品“榮耀”和“小米11”的關系,不得不冗余的將這兩個商品保存在張三的訂單文檔中,不夠優雅。還是建議用業務來維護關聯關系。

查詢方式

傳統關系型數據庫會基于Sql語句做查詢,語法有統一標準;

而不同的非關系數據庫查詢語法差異極大,五花八門各種各樣。

事務

傳統關系型數據庫能滿足事務ACID的原則。

而非關系型數據庫往往不支持事務,或者不能嚴格保證ACID的特性,只能實現基本的一致性。

總結

除了上述四點以外,在存儲方式、擴展性、查詢性能上關系型與非關系型也都有著顯著差異,總結如下:

  • 存儲方式

    • 關系型數據庫基于磁盤進行存儲,會有大量的磁盤IO,對性能有一定影響

    • 非關系型數據庫,他們的操作更多的是依賴于內存來操作,內存的讀寫速度會非常快,性能自然會好一些

  • 擴展性

    • 關系型數據庫集群模式一般是主從,主從數據一致,起到數據備份的作用,稱為垂直擴展。

    • 非關系型數據庫可以將數據拆分,存儲在不同機器上,可以保存海量數據,解決內存大小有限的問題。稱為水平擴展。

    • 關系型數據庫因為表之間存在關聯關系,如果做水平擴展會給數據查詢帶來很多麻煩

2.認識Redis

Redis誕生于2009年全稱是Remote Dictionary Server 遠程詞典服務器,是一個基于內存的鍵值型NoSQL數據庫。

特征

  • 鍵值(key-value)型,value支持多種不同數據結構,功能豐富

  • 單線程,每個命令具備原子性

  • 低延遲,速度快(基于內存、IO多路復用、良好的編碼)。

  • 支持數據持久化

  • 支持主從集群、分片集群

  • 支持多語言客戶端

作者:Antirez

Redis的官方網站地址:Redis - The Real-time Data Platform

3.安裝Redis

大多數企業都是基于Linux服務器來部署項目,而且Redis官方也沒有提供Windows版本的安裝包。因此課程中我們會基于Linux系統來安裝Redis.

此處選擇的Linux版本為CentOS 7.

⑴.依賴庫

Redis是基于C語言編寫的,因此首先需要安裝Redis所需要的gcc依賴:

yum install -y gcc tcl

⑵.上傳安裝包并解壓

然后將課前資料提供的Redis安裝包上傳到虛擬機的任意目錄:

例如,我放到了/usr/local/src 目錄:

實際上放在這里

解壓縮:

tar -xzf redis-6.2.6.tar.gz

解壓后:

進入redis目錄:

cd redis-6.2.6

運行編譯命令:

make && make install

如果沒有出錯,應該就安裝成功了。

⑶.啟動

redis的啟動方式有很多種,例如:

  • 默認啟動

  • 指定配置啟動

  • 開機自啟

⑷.默認啟動

安裝完成后,在任意目錄輸入redis-server命令即可啟動Redis:

redis-server

如圖:

這種啟動屬于前臺啟動,會阻塞整個會話窗口,窗口關閉或者按下CTRL + C則Redis停止。不推薦使用。


在 Xshell 中,若要退出當前正在運行的 Redis 服務(前臺運行狀態),可直接按下快捷鍵?Ctrl + C,這會向 Redis 進程發送中斷信號,使其停止運行,從而返回到命令行交互界面。


⑸.指定配置啟動

如果要讓Redis以后臺方式啟動,則必須修改Redis配置文件,就在我們之前解壓的redis安裝包下(/usr/local/src/redis-6.2.6),名字叫redis.conf:

cp redis.conf redis.conf.bck

由于我之前把安裝包放在/root/下載/soft下

所以改成

cp /root/下載/soft/redis-6.2.6/redis.conf redis.conf.bck

或者,你也可以先切換到包含?redis.conf?文件的目錄,然后再進行復制操作:

cd /root/下載/soft/redis-6.2.6
cp redis.conf redis.conf.bck

然后修改redis.conf文件中的一些配置:

vi redis.conf

然后修改redis.conf文件中的一些配置:

# 允許訪問的地址,默認是127.0.0.1,會導致只能在本地訪問。修改為0.0.0.0則可以在任意IP訪問,生產環境不要設置為0.0.0.0
bind 0.0.0.0
# 守護進程,修改為yes后即可后臺運行
daemonize yes 
# 密碼,設置后訪問Redis必須輸入密碼
requirepass 123321



Redis的其它常見配置:

# 監聽的端口
port 6379
# 工作目錄,默認是當前目錄,也就是運行redis-server時的命令,日志、持久化等文件會保存在這個目錄
dir .
# 數據庫數量,設置為1,代表只使用1個庫,默認有16個庫,編號0~15
databases 1
# 設置redis能夠使用的最大內存
maxmemory 512mb
# 日志文件,默認為空,不記錄日志,可以指定日志文件名
logfile "redis.log"

啟動Redis:

# 進入redis安裝目錄 
cd /root/下載/soft/redis-6.2.6
# 啟動
redis-server redis.conf

停止服務:

# 利用redis-cli來執行 shutdown 命令,即可停止 Redis 服務,
# 因為之前配置了密碼,因此需要通過 -u 來指定密碼
redis-cli -u abc123 shutdown

⑹.開機自啟

我們也可以通過配置來實現開機自啟。

首先,新建一個系統服務文件:

vi /etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /root/download/soft/redis-6.2.6/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target

然后重載系統服務:

systemctl daemon-reload

現在,我們可以用下面這組命令來操作redis了:

# 啟動
systemctl start redis
# 停止
systemctl stop redis
# 重啟
systemctl restart redis
# 查看狀態
systemctl status redis

到時候重新整理一下,這個要重新寫






4.Redis桌面客戶端

安裝完成Redis,我們就可以操作Redis,實現數據的CRUD了。這需要用到Redis客戶端,包括:

  • 命令行客戶端

  • 圖形化桌面客戶端

  • 編程客戶端

⑴.Redis命令行客戶端

Redis安裝完成后就自帶了命令行客戶端:redis-cli,使用方式如下:

redis-cli [options] [commonds]

其中常見的options有:

  • -h 127.0.0.1:指定要連接的redis節點的IP地址,默認是127.0.0.1

  • -p 6379:指定要連接的redis節點的端口,默認是6379

  • -a abc123:指定redis的訪問密碼

其中的commonds就是Redis的操作命令,例如:

  • ping:與redis服務端做心跳測試,服務端正常會返回pong

不指定commond時,會進入redis-cli的交互控制臺:

⑵.圖形化桌面客戶端

GitHub上的大神編寫了Redis的圖形化桌面客戶端,地址:GitHub - RedisInsight/RedisDesktopManager

不過該倉庫提供的是RedisDesktopManager的源碼,并未提供windows安裝包。

在下面這個倉庫可以找到安裝包:Releases · lework/RedisDesktopManager-Windows · GitHub

⑶.安裝

在課前資料中可以找到Redis的圖形化桌面客戶端:

解壓縮后,運行安裝程序即可安裝:

雙擊即可運行

⑷.建立連接

點擊左上角的連接到Redis服務器按鈕:

在彈出的窗口中填寫Redis服務信息:

點擊確定后,在左側菜單會出現這個鏈接:

Redis默認有16個倉庫,編號從0至15. 通過配置文件可以設置倉庫數量,但是不超過16,并且不能自定義倉庫名稱。

如果是基于redis-cli連接Redis服務,可以通過select命令來選擇數據庫:

# 選擇 0號庫
select 0

二、Redis常見命令

Redis是典型的key-value數據庫,key一般是字符串,而value包含很多不同的數據類型:

Redis為了方便我們學習,將操作不同數據類型的命令也做了分組,在官網( https://redis.io/commands?)可以查看到不同的命令:

不同類型的命令稱為一個group,我們也可以通過help命令來查看各種不同group的命令:

接下來,我們就學習常見的五種基本數據類型的相關命令。

1.Redis通用命令

通用指令是部分數據類型的,都可以使用的指令,常見的有:

  • KEYS:查看符合模板的所有key

  • DEL:刪除一個指定的key

  • EXISTS:判斷key是否存在

  • EXPIRE:給一個key設置有效期,有效期到期時該key會被自動刪除

  • TTL:查看一個KEY的剩余有效期

通過help [command] 可以查看一個命令的具體用法,例如:


2.String類型

String類型,也就是字符串類型,是Redis中最簡單的存儲類型。

其value是字符串,不過根據字符串的格式不同,又可以分為3類:

  • string:普通字符串

  • int:整數類型,可以做自增、自減操作

  • float:浮點類型,可以做自增、自減操作

不管是哪種格式,底層都是字節數組形式存儲,只不過是編碼方式不同。字符串類型的最大空間不能超過512m.

String的常見命令

String的常見命令有:

  • SET(set):添加或者修改已經存在的一個String類型的鍵值對

  • GET(get):根據key獲取String類型的value

  • MSET(mset):批量添加多個String類型的鍵值對

  • MGET(mget):根據多個key獲取多個String類型的value

  • INCR(incr):讓一個整型的key自增1

  • INCRBY(incrby):讓一個整型的key自增并指定步長,例如:incrby num 2 讓num值自增2

  • INCRBYFLOAT:讓一個浮點類型的數字自增并指定步長

  • SETNX:添加一個String類型的鍵值對,前提是這個key不存在,否則不執行

  • SETEX:添加一個String類型的鍵值對,并且指定有效期

set





setnx

Key結構

Redis沒有類似MySQL中的Table的概念,我們該如何區分不同類型的key呢?

例如,需要存儲用戶、商品信息到redis,有一個用戶id是1,有一個商品id恰好也是1,此時如果使用id作為key,那就會沖突了,該怎么辦?

我們可以通過給key添加前綴加以區分,不過這個前綴不是隨便加的,有一定的規范:

Redis的key允許有多個單詞形成層級結構,多個單詞之間用':'隔開,格式如下:

	項目名:業務名:類型:id

這個格式并非固定,也可以根據自己的需求來刪除或添加詞條。這樣以來,我們就可以把不同類型的數據區分開了。從而避免了key的沖突問題。

例如我們的項目名稱叫 heima,有user和product兩種不同類型的數據,我們可以這樣定義key:

  • user相關的key:heima:user:1

  • product相關的key:heima:product:1

如果Value是一個Java對象,例如一個User對象,則可以將對象序列化為JSON字符串后存儲:

KEYVALUE
heima:user:1{"id":1, "name": "Jack", "age": 21}
heima:product:1{"id":1, "name": "小米11", "price": 4999}

并且,在Redis的桌面客戶端中,還會以相同前綴作為層級結構,讓數據看起來層次分明,關系清晰:

3.Hash類型

Hash類型,也叫散列,其value是一個無序字典,類似于Java中的HashMap結構。

String結構是將對象序列化為JSON字符串后存儲,當需要修改對象某個字段時很不方便:

Hash結構可以將對象中的每個字段獨立存儲,可以針對單個字段做CRUD:

Hash的常見命令有:

  • HSET key field value:添加或者修改hash類型key的field的值

  • HGET key field:獲取一個hash類型key的field的值

  • HMSET:批量添加多個hash類型key的field的值

  • HMGET:批量獲取多個hash類型key的field的值

  • HGETALL:獲取一個hash類型的key中的所有的field和value

  • HKEYS:獲取一個hash類型的key中的所有的field

  • HINCRBY:讓一個hash類型key的字段值自增并指定步長

  • HSETNX:添加一個hash類型的key的field值,前提是這個field不存在,否則不執行




4.List類型

Redis中的List類型與Java中的LinkedList類似,可以看做是一個雙向鏈表結構。既可以支持正向檢索和也可以支持反向檢索。

特征也與LinkedList類似:

  • 有序

  • 元素可以重復

  • 插入和刪除快

  • 查詢速度一般

常用來存儲一個有序數據,例如:朋友圈點贊列表,評論列表等。

List的常見命令有:

  • LPUSH key element ... :向列表左側插入一個或多個元素

  • LPOP key:移除并返回列表左側的第一個元素,沒有則返回nil

  • RPUSH key element ... :向列表右側插入一個或多個元素

  • RPOP key:移除并返回列表右側的第一個元素

  • LRANGE key star end:返回一段角標范圍內的所有元素

  • BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil


5.Set類型

Redis的Set結構與Java中的HashSet類似,可以看做是一個value為null的HashMap。因為也是一個hash表,因此具備與HashSet類似的特征:

  • 無序

  • 元素不可重復

  • 查找快

  • 支持交集、并集、差集等功能

Set的常見命令有:

  • SADD key member ... (sadd):向set中添加一個或多個元素

  • SREM key member ... (srem):?移除set中的指定元素

  • SCARD key(scard): 返回set中元素的個數

  • SISMEMBER key member(sismember):判斷一個元素是否存在于set中

  • SMEMBERS(smembers):獲取set中的所有元素

  • SINTER key1 key2 ... (sinter):求key1與key2的交集

例如兩個集合:s1和s2:

求交集:SINTER s1 s2

求s1與s2的不同:SDIFF s1 s2

練習:

1.將下列數據用Redis的Set集合來存儲:

  • 張三的好友有:李四、王五、趙六

  • 李四的好友有:王五、麻子、二狗

2.利用Set的命令實現下列功能:

  • 計算張三的好友有幾人

  • 計算張三和李四有哪些共同好友

  • 查詢哪些人是張三的好友卻不是李四的好友

  • 查詢張三和李四的好友總共有哪些人

  • 判斷李四是否是張三的好友

  • 判斷張三是否是李四的好友

  • 將李四從張三的好友列表中移除

6.SortedSet類型

Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層數據結構卻差別很大。SortedSet中的每一個元素都帶有一個score屬性,可以基于score屬性對元素排序,底層的實現是一個跳表(SkipList)加 hash表。

SortedSet具備下列特性:

  • 可排序

  • 元素不重復

  • 查詢速度快

因為SortedSet的可排序特性,經常被用來實現排行榜這樣的功能。


SortedSet的常見命令有:

  • ZADD key score member:添加一個或多個元素到sorted set ,如果已經存在則更新其score值

  • ZREM key member:刪除sorted set中的一個指定元素

  • ZSCORE key member : 獲取sorted set中的指定元素的score值

  • ZRANK key member:獲取sorted set 中的指定元素的排名

  • ZCARD key:獲取sorted set中的元素個數

  • ZCOUNT key min max:統計score值在給定范圍內的所有元素的個數

  • ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值

  • ZRANGE key min max:按照score排序后,獲取指定排名范圍內的元素

  • ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內的元素

  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默認都是升序,如果要降序則在命令的Z后面添加REV即可,例如:

  • 升序獲取sorted set 中的指定元素的排名:ZRANK key member

  • 降序獲取sorted set 中的指定元素的排名:ZREVRANK key memeber


練習題:

將班級的下列學生得分存入Redis的SortedSet中:

Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76

并實現下列功能:

  • 刪除Tom同學

  • 獲取Amy同學的分數

  • 獲取Rose同學的排名

  • 查詢80分以下有幾個學生

  • 給Amy同學加2分

  • 查出成績前3名的同學

  • 查出成績80分以下的所有同學

三、Redis的Java客戶端

在Redis官網中提供了各種語言的客戶端,地址:https://redis.io/docs/latest/develop/clients/

其中Java客戶端也包含很多:

標記為*的就是推薦使用的java客戶端,包括:

  • Jedis和Lettuce:這兩個主要是提供了Redis命令對應的API,方便我們操作Redis,而SpringDataRedis又對這兩種做了抽象和封裝,因此我們后期會直接以SpringDataRedis來學習。

  • Redisson:是在Redis基礎上實現了分布式的可伸縮的java數據結構,例如Map、Queue等,而且支持跨進程的同步機制:Lock、Semaphore等待,比較適合用來實現特殊的功能需求。

1.Jedis客戶端

Jedis的官網地址: GitHub - redis/jedis: Redis Java client

快速入門

我們先來個快速入門:

1)引入依賴:

<!--jedis-->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>
<!--單元測試-->
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope>
</dependency>

Spring Data Redis 集成了jedis 和lettuce

2)建立連接

新建一個單元測試類,內容如下:

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {private Jedis jedis;@BeforeEachvoid setUo(){//1.建立連接jedis = new Jedis("192.168.238.128", 6379);//2.設置密碼jedis.auth("abc123");//3.選擇庫jedis.select(0);}@Testvoid testString(){//存入數據String result = jedis.set("name", "胡歌");System.out.println("result="+result);//獲取數據String name = jedis.get("name");System.out.println("name="+name);}@AfterEachvoid tearDown(){if(jedis!=null){jedis.close();}}
}


再測試一個

    @Testvoid testHash(){//插入hash數據jedis.hset("user:1","name","Jack");jedis.hset("user:1","age","21");//獲取Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}

連接池

Jedis本身是線程不安全的,并且頻繁的創建和銷毀連接會有性能損耗,因此我們推薦大家使用Jedis連接池代替Jedis的直連方式。

配置一個連接池

package org.example1;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class JedisConnectionFactory {private static final JedisPool jedisPool;static{//配置連接池JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMaxIdle(0);poolConfig.setMaxWaitMillis(1000);//創建連接池對象jedisPool = new JedisPool(poolConfig, "192.168.238.128", 6379, 1000, "abc123");}public static Jedis getJedis(){return jedisPool.getResource();}}

2.SpringDataRedis客戶端

SpringData是Spring中數據操作的模塊,包含對各種數據庫的集成,其中對Redis的集成模塊就叫做SpringDataRedis,官網地址:Spring Data Redis

  • 提供了對不同Redis客戶端的整合(Lettuce和Jedis)

  • 提供了RedisTemplate統一API來操作Redis

  • 支持Redis的發布訂閱模型

  • 支持Redis哨兵和Redis集群

  • 支持基于Lettuce的響應式編程

  • 支持基于JDK、JSON、字符串、Spring對象的數據序列化及反序列化

  • 支持基于Redis的JDKCollection實現

SpringDataRedis中提供了RedisTemplate工具類,其中封裝了各種對Redis的操作。并且將不同數據類型的操作API封裝到了不同的類型中:

快速入門

SpringBoot已經提供了對SpringDataRedis的支持,使用非常簡單。

首先,新建一個maven項目,然后按照下面步驟執行:

1)引入依賴
  <!--redis依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--common-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!--Jackson依賴--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
2)配置Redis
spring:data:redis:# Redis 服務器地址host: 192.168.238.128# Redis 服務器端口port: 6379# Redis 服務器密碼password: abc123# 連接超時時間timeout: 5000mslettuce:pool:# 連接池最大連接數(使用負值表示沒有限制)max-connections: 8# 連接池最大空閑連接數max-idle-connections: 8# 連接池最小空閑連接數min-idle-connections: 0# 連接池最大阻塞等待時間(使用負值表示沒有限制)max-wait-time: 100msshutdown-timeout: 100ms
3)注入RedisTemplate

因為有了SpringBoot的自動裝配,我們可以拿來就用:

@SpringBootTest
class RedisStringTests {@Autowiredprivate RedisTemplate redisTemplate;
}
4)編寫測試
package org.example1;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class SpringbootRedisDemoApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString(){//寫入一條數據redisTemplate.opsForValue().set("name","胡歌");//獲取string數據Object name = redisTemplate.opsForValue().get("name");System.out.println("name="+name);}}

  • 默認序列化問題RedisTemplate?未配置時,使用?JdkSerializationRedisSerializer,會將 Java 對象(包括字符串)序列化為二進制字節流,導致在 Redis 客戶端顯示為類似?\xAC\xED?這樣的二進制內容。
  • StringRedisSerializer?的作用:它直接按字符串的字節序列處理數據,不會進行復雜的序列化操作,確保鍵值對以純文本形式存儲和讀取,便于直觀查看和管理。

自定義序列化

RedisTemplate可以接收任意Object作為值寫入Redis:

只不過寫入前會把Object序列化為字節形式,默認是采用JDK序列化,得到的結果是這樣的:

缺點:

  • 可讀性差

  • 內存占用較大

我們可以自定義RedisTemplate的序列化方式,代碼如下:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){// 創建RedisTemplate對象RedisTemplate<String, Object> template = new RedisTemplate<>();// 設置連接工廠template.setConnectionFactory(connectionFactory);// 創建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 設置Key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 設置Value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}

這里采用了JSON序列化來代替默認的JDK序列化方式。最終結果如圖:

整體可讀性有了很大提升,并且能將Java對象自動的序列化為JSON字符串,并且查詢時能自動把JSON反序列化為Java對象。不過,其中記錄了序列化時對應的class名稱,目的是為了查詢時實現自動反序列化。這會帶來額外的內存開銷。

StringRedisTemplate

為了節省內存空間,我們可以不使用JSON序列化器來處理value,而是統一使用String序列化器,要求只能存儲String類型的key和value。當需要存儲Java對象時,手動完成對象的序列化和反序列化。

因為存入和讀取時的序列化及反序列化都是我們自己實現的,SpringDataRedis就不會將class信息寫入Redis了。

這種用法比較普遍,因此SpringDataRedis就提供了RedisTemplate的子類:StringRedisTemplate,它的key和value的序列化方式默認就是String方式。

省去了我們自定義RedisTemplate的序列化方式的步驟,而是直接使用:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79031.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gitcode 上傳文件報錯文件太大has exceeded the limited size (10 MiB) in commit

登陸gitcoe&#xff0c;在項目設置->提交設置 ,勾選提交文件限制&#xff0c;修改限制的大小。 修改完后&#xff0c;重新提交代碼。

【運維】構建基于Python的自動化運維平臺:用Flask和Celery打造高效管理工具

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著企業IT基礎設施的復雜性不斷增加,手動運維已無法滿足高效管理的需求。本文詳細介紹如何基于Python構建一個自動化運維平臺,利用Flask…

基于大模型預測的產鉗助產分娩全方位研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 二、產鉗助產分娩概述 2.1 產鉗助產定義與歷史 2.2 適用情況與臨床意義 三、大模型預測原理與數據基礎 3.1 大模型技術原理 3.2 數據收集與處理 3.3 模型訓練與驗證 四、術前預測與準備 4.1 大模型術前風險預…

css使用aspect-ratio制作4:3和9:16和1:1等等比例布局

文章目錄 1. 前言2. 用法2.1 基本語法2.2. 與max-width、max-height等屬性結合使用2.3. 動態計算比例 3. 應用場景4. 兼容性和替代方案5. 總結 1. 前言 在網頁制作過程中&#xff0c;有時候我們只知道寬度&#xff0c;或者只知道高度&#xff0c;這時候需要制作一個4:3和9:16這…

【國產化】在銀河麒麟ARM環境下離線安裝docker

1、前言 采用離線安裝的方式。 關于離線安裝的方式官網有介紹&#xff0c;但是說的很簡單&#xff0c;網址&#xff1a;Binaries | Docker Docs 官網介紹的有幾種主流linux系統的安裝方式&#xff0c;但是沒有kylin的&#xff0c;所以在此記錄一下。 在安裝過程中也遇到了些…

從一城一云到AI CITY,智慧城市進入新階段

AI將如何改變城市面貌&#xff1f;AI能否為城市創造新的商業價值&#xff1f;AI的落地應用將對日常生活有什么樣的影響&#xff1f; 幾乎在每一場和城市發展相關的論壇上&#xff0c;都會出現以上幾個問題。城市既是AI技術創新融合應用的綜合性載體&#xff0c;普羅大眾對AI產…

鴻蒙知識總結

判斷題 1、 在http模塊中&#xff0c;多個請求可以使用同一個httpRequest對象&#xff0c;httpRequest對象可以復用。&#xff08;錯誤&#xff09; 2、訂閱dataReceiverProgress響應事件是用來接收HTTP流式響應數據。&#xff08;錯誤&#xff09; 3、ArkTS中變量聲明時不需要…

[人機交互]理解用戶

一.解釋什么是認知&#xff0c;以及它對交互設計的重要性 1.1什么是認知 認知是指與knowing相關的能力&#xff0c;行為和過程&#xff08;考填空&#xff09; -如何感知物理刺激&#xff1f;如注意、知覺等 -如何認識自我、他人以及環境&#xff1f;如意識、記憶等 -如何…

微信小程序備案的一些記錄

小程序如果沒有備案是搜索不到小程序的。 小程序備案需要填寫主體負責人的信息&#xff0c;需要主體負責人的手機號驗證碼&#xff0c; 需要填寫管理員的信息&#xff0c;同樣也需要驗證手機號碼&#xff0c; 填寫完畢之后&#xff0c;提交進行初審&#xff0c;初審之后會打…

SpringCloud服務拆分:Nacos服務注冊中心 + LoadBalancer服務負載均衡使用

SpringCloud中Nacos服務注冊中心 LoadBalancer服務負載均衡使用 前言Nacos工作流程nacos安裝docker安裝window安裝 運行nacos微服務集成nacos高級特性1.服務集群配置方法效果圖模擬服務實例宕機 2.權重配置3.環境隔離 如何啟動集群節點本地啟動多個節點方法 LoadBalancer集成L…

網絡安全系列--《文章1:網絡安全基礎與核心概念》

課程1&#xff1a;網絡安全基礎與核心概念 學習內容 1. 網絡安全定義 網絡安全是通過技術、管理及法律手段保護網絡系統的硬件、軟件及數據&#xff0c;使其免受破壞、篡改或泄露&#xff0c;確保系統穩定運行并提供可靠服務。其核心目標包括保密性、完整性、可用性、可控性及…

C++:掃雷游戲

一.掃雷游戲項目設計 1.文件結構設計 首先我們要先定義三個文件 ①test.c //文件中寫游戲的測試邏輯 ②game.c //文件中寫游戲中函數的實現等 ③game.h //文件中寫游戲需要的數據類型和函數聲明等 2.掃雷游戲的主體結構 使?控制臺實現經典的掃雷游戲 ?游戲可以通過菜單…

[人機交互]識別需要和建立需求

*一.需要選擇的產品特征&#xff08;或屬性&#xff09;可概括為兩類 1.1外部特征&#xff08;屬性&#xff09; 對用戶而言&#xff0c;可見及可度量的屬性 1.2內部特征&#xff08;屬性&#xff09; 對用戶而言是不可見或不可度量的 二.什么是需求 需求是有關目標的陳述…

Lua學習筆記

文章目錄 前言1. Lua的數據類型2. Lua的控制結構2.1 循環2.1.1 for2.1.1.1 數值循環2.1.1.2 迭代循環2.1.2 while2.1.3 repeat-until 2.2 條件語句2.3 函數 3. Lua中的變量作用域 前言 Lua是一種輕量級的、高效的、可擴展的腳本語言&#xff0c;由巴西里約熱內盧天主教大學&am…

學習c語言的鏈表的概念、操作(另一篇鏈表的筆記在其他的欄目先看這個)

在學習Linux之間我們先插入一下鏈表的知識 學習鏈表&#xff08;一種數據結構思想&#xff09; 鏈表和數組的區別和實現&#xff1a; 鏈表&#xff08;鏈表是個好東西&#xff09; 鏈表概念&#xff08;什么是鏈表&#xff09;&#xff1f; 鏈表就是數據結構->數據的存儲…

NVM完全指南:安裝、配置與最佳實踐

發布于 2025年5月7日 ? 閱讀時間&#xff1a;10分鐘 &#x1f4a1; TL;DR: 本文詳細介紹了如何完整卸載舊版Node.js&#xff0c;安裝NVM&#xff0c;配置阿里云鏡像源&#xff0c;以及設置node_global與node_cache目錄&#xff0c;打造高效Node.js開發環境。 &#x1f4cb; 目…

轉換算子和行動算子的區別

轉換算子和行動算子主要是在分布式計算框架&#xff08;如 Apache Spark&#xff09;里常用的概念&#xff0c;它們在功能、執行機制、返回結果等方面存在明顯區別&#xff0c;以下為你詳細介紹&#xff1a; 定義與功能 返回結果 如何在使用轉換算子和行動算子時避免出現內存溢…

Windows命令行軟件管理器:Chocolatey

文章目錄 Windows命令行軟件管理器&#xff1a;Chocolatey1.Chocolatey使用1.1 安裝1.2 常用命令1.3 使用流程 2.常用shell命令匯總 Windows命令行軟件管理器&#xff1a;Chocolatey Chocolatey 是一款強大的 Windows 命令行軟件管理器&#xff0c;目前在 GitHub 上已斬獲 10.…

MySQL 8.0 OCP(1Z0-908)英文題庫(11-20)

目錄 第11題題目分析正確答案 第12題題目分析正確答案 第13題題目分析正確答案 第14題題目分析正確答案 第15題題目分析正確答案 第16題題目分析正確答案 第17題題目分析正確答案&#xff1a; 第18題題目分析正確答案 第19題題目分析正確答案 第20題題目分析正確答案 第11題 W…

mac 使用 Docker 安裝向量數據庫Milvus獨立版的保姆級別教程

Milvus 特點&#xff1a;開源的云原生向量數據庫&#xff0c;支持多種索引類型和GPU加速&#xff0c;能夠在億級向量規模下實現低延遲高吞吐。具有靈活的部署選項和強大的社區支持。 適用場景&#xff1a;適合處理超大規模數據和高性能需求的應用&#xff0c;如圖像搜索、推薦…