欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用Redis方式

 更新時間:2024年11月27日 09:42:09   作者:code__laoq  
文章介紹了SpringDataRedis操作本地Redis數(shù)據(jù)庫的方法,包括Redis的基本概念、數(shù)據(jù)類型、命令以及在Java中的使用

前言

本文使用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)文章

最新評論