SpringBoot使用Redis方式
前言
本文使用Spring Data Redis操作本地的Redis數(shù)據(jù)庫,僅為學(xué)習(xí)中的記錄。
Redis
簡介
- Redis 是開源免費(fèi)的一個高性能的key-value數(shù)據(jù)庫。
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進(jìn)行使用。
- Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執(zhí)行。
- Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 因?yàn)镽edis數(shù)據(jù)保存在內(nèi)存中,所以跟MySQL之類的數(shù)據(jù)庫相比,在內(nèi)存中操作起來非常簡單,可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。而且Redis中數(shù)據(jù)是緊湊的以追加的方式產(chǎn)生的,因?yàn)镽edis數(shù)據(jù)并不需要進(jìn)行隨機(jī)訪問。
Redis索引
在redis中,索引從0開始,命令中含range時,起始索引是包含在內(nèi)的。
如有String<name , code_laoq>
,使用getrange name 1 3得到的字符串子串是ode。
而索引如果為負(fù)則表示是倒數(shù)的某個元素。如有List<weekday , [Monday,Tuesday,Wednesday,Thursday,Friday]>,使用lindex weekday -2
得到的是List倒數(shù)第二個元素即Thursday。
數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
- string是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應(yīng)一個value。
- string類型是二進(jìn)制安全的。意思是redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象 。
- string類型是Redis最基本的數(shù)據(jù)類型,一個鍵最大能存儲512MB。
Hash(哈希)
- Redis hash 是一個鍵值對集合,是string類型的field和value的映射表,適合用于存儲Object對象。
List(列表)
- Redis 列表是簡單的字符串列表,按照插入順序排序??梢蕴砑右粋€元素到列表的頭部(左邊)或者尾部(右邊)。
Set(集合)
- Redis的Set是string類型的無序集合,通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。
zset(sorted set:有序集合)
- Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。
- 不同的是每個元素都會關(guān)聯(lián)一個double類型的score。
- redis通過score來為集合中的成員進(jìn)行從小到大的排序。
zset的成員是唯一的,但score卻可以重復(fù)。
Redis命令
Redis 數(shù)據(jù)管理
- 刪除指定key的數(shù)據(jù)。
DEL key_name
- 檢查是否存在指定key的數(shù)據(jù),若 key 存在返回 1 ,否則返回 0 。
EXISTS key_name
- 查看指定key的類型,返回值為:none (key不存在)、string、list、set、zset或hash。
TYPE key_name
- 模糊查詢,和mysql類似。
keys *lock*
從查詢包含key中l(wèi)ock的數(shù)據(jù)
KEYS pattern
- 修改指定key的key值(其value不變),如果new_key_name存在則將其覆蓋
RENAME old_key_name new_key_name
- 當(dāng)new_key_name這個數(shù)據(jù)不存在時,修改指定key的key_name
RENAMENX old_key_name new_key_name
- 給指定key添加過期時間
EXPIRE key_name expiration --設(shè)置指定key在[expiration]秒后過期 EXPIREAT key_name timestamp --參數(shù)是UNIX時間戳(從1970年1月1日開始,到當(dāng)前時間所經(jīng)過的秒數(shù)) PEXPIRE key_name milliseconds --過期時間以毫秒計算 PEXPIREAT key milliseconds-timestamp --UNIX時間戳以毫秒計算
- 移除指定key的過期時間
PERSIST key_name
- 查看指定key的過期時間
TTL key_name --返回剩余的過期時間(以秒為單位) PTTL key_name --返回剩余的過期時間(以毫秒為單位)
- 將指定key移到指定數(shù)據(jù)庫中
MOVE key_name db_num
Redis 字符串(String)
- 修改key的值(無視類型),如果不存在就新增一條值為value的數(shù)據(jù)。
SET key_name value
- 將給定 key 的值設(shè)為 value ,并返回原來的value。如果key不存在就新增,但是返回null。
GETSET key_name value
- 為指定的 key 設(shè)置值及其過期時間為expiration(單位為秒)。如果 key 不存在就新增。
SETEX key_name out_time value
- 和 SETEX類似,但它以毫秒為單位設(shè)置 指定key 的生存時間。
PSETEX key_name expiration value
- 新增一條數(shù)據(jù),如果key已存在就不執(zhí)行。
SETNX key_name value
- 新增多條數(shù)據(jù),如果已存在就修改這些key的值。如果有的key存在有的key不存在呢?那就新增不存在的,修改已存在的。
MSET key_name1 value1 key_name2 value2 ... key_nameN valueN
- 新增多條數(shù)據(jù),如果任一key已存在則不進(jìn)行任何插入操作【殃及池魚,一條也不會插入】。
MSETNX key_name1 value1 key_name2 value2 ... key_nameN valueN
- 將 value 追加到指定key原value的末尾。如果不存在就新增。
APPEND key_name value
- 獲取指定 key 的值
GET key_name
- 獲取多個key的值
mget key_name1 key_name2 ... key_nameN
- 獲取指定key的子串
GETRANGE key_name start end
- 獲取指定 key 所儲存的字符串值的長度。
STRLEN key_name
Redis 哈希(Hash)
Redis 列表(List)操作命令
- 在List左邊插入數(shù)據(jù)。哪怕key不存在也可以插入。
LPUSH key_name value_1 value_2 ... value_n --每個數(shù)據(jù)用空格分隔
- 插入一條數(shù)據(jù)到已存在的List左邊。一次只能插入一條數(shù)據(jù);如果List不存在則不能插入
LPUSHX key_name value
- 在List右邊插入數(shù)據(jù)。value_2在value_1右邊,哪怕key不存在也可以插入。
RPUSH key_name value_1 value_2 ... value_n
- 插入一條數(shù)據(jù)到已存在的List右邊
RPUSHX key_name value
- 在List某一元素前/后插入一條數(shù)據(jù)。若List或者指定元素不存在則均無法插入數(shù)據(jù)
LINSERT key_name BEFORE existing_value new_value LINSERT key_name AFTER existing_value new_value
- 獲取List長度
LLEN key_name
- 通過索引獲取List中的元素。而這個索引值只要求為整數(shù)即可,若索引越界則會返回一個null。
LINDEX key_name index
- 獲取List指定范圍內(nèi)的元素。獲取的是閉區(qū)間[start,stop]中的元素。
LRANGE key_name start stop
- 批量移除List元素。根據(jù)COUNT 的值,移除List中與VALUE 相等的元素。
- count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 。
- count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 的絕對值。
- count = 0 : 移除表中所有與 VALUE 相等的值。
LREM key_name COUNT value
- 移除并獲取List最后一個元素
RPOP key_name
Redis 集合(Set)
- Redis 有序集合(sorted set)
引入Redis
導(dǎo)入Maven坐標(biāo)
在Java中使用MySQL用的是JDBC接口,而操作Redis也有接口,常見的有Jedis、Lettuce和Spring Data Redis,Spring Data Redis是封裝了前兩個接口。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置Redis數(shù)據(jù)庫信息
blog: #這里填項(xiàng)目的名稱縮寫,不要照抄 redis: host: localhost #也可以填遠(yuǎn)程的IP port: 6379 #端口號 password: #密碼,redis默認(rèn)沒密碼,需要在配置文件里修改 database: 8 #要連接的數(shù)據(jù)庫號
編寫配置類RedisConfiguration
在配置類中要
Redis數(shù)據(jù)庫的配置信息
package blog.config; import lombok.extern.slf4j.Slf4j; 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.serializer.StringRedisSerializer; /** @author code_laoq @version 1.0 @date 2024/11/3 19:48 @description Redis數(shù)據(jù)庫的配置信息 */ @Configuration @Slf4j public class RedisConfiguration { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { log.info(“創(chuàng)建redis模板”); RedisTemplate redisTemplate=new RedisTemplate(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; } }
操作Redis數(shù)據(jù)庫
回憶之前操作MySQL使用什么對象,沒錯就是JDBCemplate對象。類似的,在SpringBoot中一般使用RedisTemplate對象操作Redis數(shù)據(jù)庫。
org.springframework.data.redis.core.RedisTemplate;
RedisTemplate提供了redis各種操作、異常處理及序列化。
?。?!Redis沒有類似MySQL等關(guān)系型數(shù)據(jù)庫的統(tǒng)一SQL語句,也就是說Redis操作不同類型的數(shù)據(jù)結(jié)構(gòu)要用不同的語句。比如插入一個String類型的數(shù)據(jù)和List類型的數(shù)據(jù)要用不同的語句。
--String插入數(shù)據(jù) SET name laoq --List插入數(shù)據(jù) RPUSH KEY_NAME VALUE1
因此每一種Redis數(shù)據(jù)結(jié)構(gòu)的操作語句都要學(xué)習(xí)(大同小異),下面我將從RedisTemplate對象入手進(jìn)行講解。
RedisTemplate對象
RedisTemplate提供了redis各種操作、異常處理及序列化。而RedisTemplate中5種常見的OpsFor分別是:opsForValue()、opsForList()、opsForHash()、opsForSet()、OpsForZSet()。顯而易見,他們分別是對Redis中的String、List、Hash、Set和Zset進(jìn)行操作的方法。
opsForValue()
我們首先來看opsForValue()的原型。
public ValueOperations<K, V> opsForValue() { return this.valueOps; }
該方法返回了一個ValueOperations類型的接口,該接口中定義了操作redis字符串的17個方法。而調(diào)用RedisTemplate的opsForValue()方法則會返回ValueOperations接口的實(shí)現(xiàn)類對象DefaultValueOperations的屬性。
我們一個一個來看ValueOperations的方法。
set()
void set(K key, V value); void set(K key, V value, long timeout, TimeUnit unit);
set(K key, V value)方法對應(yīng) Redis的SET key value語句,用于插入一條數(shù)據(jù),key和value分別是數(shù)據(jù)的鍵值。
而重載的set(K key, V value, long timeout, TimeUnit unit)方法對應(yīng)Redis的SETEX key seconds value語句,插入一條含有效期的數(shù)據(jù),timeout為過期時間,unit是時間單位。
下面是例子
@Test public void testRedisString(){ redisTemplate.opsForValue().set("name","code_laoq"); redisTemplate.opsForValue().set("CAPTCHA","p2um",5, TimeUnit.MINUTES);//5分鐘后過期 }
setIfAbsent()
Boolean setIfAbsent(K key, V value); Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit);
setIfAbsent()方法對于Redis的SETNX key value,如果key對應(yīng)的數(shù)據(jù)不存在就插入,否則不插入。參數(shù)同上 不再贅述
setIfPresent()
Boolean setIfPresent(K key, V value); Boolean setIfPresent(K key, V value, long timeout, TimeUnit unit);
setIfAbsent()方法對于Redis的SET key value [EX seconds/PX milliseconds] XX,如果key對應(yīng)的數(shù)據(jù)存在就插入并返回True,否則不插入返回False。相當(dāng)于更新操作。
例子如下:
@Test public void testRedisString(){ redisTemplate.opsForValue().setIfPresent("CAPTCHA1","laoq",5, TimeUnit.MINUTES); }
opsForList()
還是先看下方法原型
public ListOperations<K, V> opsForList() { return this.listOps; }
和上面類似的,該方法返回了一個ListOperations類型的接口,該接口中定義了操作redis字符串的17個方法。而調(diào)用RedisTemplate的opsForList()方法則會返回ListOperations接口的實(shí)現(xiàn)類對象DefaultListOperations的屬性。我們一個一個來看ListOperations的方法。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring定時任務(wù)實(shí)現(xiàn)與配置(一)
這篇文章主要為大家詳細(xì)介紹了Spring定時任務(wù)的實(shí)現(xiàn)與配置第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06SpringBoot在Controller層接收參數(shù)的n種姿勢(超詳細(xì))
這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01mybatis-plus saveOrUpdateBatch踩坑記錄
這篇文章主要介紹了mybatis-plus saveOrUpdateBatch踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot3整合SpringCloud啟動后nacos報錯獲取不到配置、無法注冊服務(wù)的解決方案
文章介紹了如何使用Spring Boot 3.3.4和Spring Cloud 2023.0.3搭建微服務(wù)項(xiàng)目,并解決與Nacos服務(wù)注冊發(fā)現(xiàn)和配置中心的集成問題,主要解決了依賴版本不兼容、配置文件導(dǎo)入問題及服務(wù)注冊失敗等問題,感興趣的朋友跟隨小編一起看看吧2025-02-02Java Netty HTTP服務(wù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java Netty HTTP服務(wù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08SpringBoot項(xiàng)目使用MDC給日志增加唯一標(biāo)識的實(shí)現(xiàn)步驟
本文介紹了如何在SpringBoot項(xiàng)目中使用MDC(Mapped?Diagnostic?Context)為日志增加唯一標(biāo)識,以便于日志追蹤,通過創(chuàng)建日志攔截器、配置攔截器以及修改日志配置文件,可以實(shí)現(xiàn)這一功能,文章還提供了源碼地址,方便讀者學(xué)習(xí)和參考,感興趣的朋友一起看看吧2025-03-03Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別理解,依賴關(guān)系比較好區(qū)分,它是耦合度最弱的一種,下文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2017-08-08