最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis的五種基本類型和業(yè)務場景和使用方式

 更新時間:2024年10月17日 16:41:43   作者:小疙瘩的編程之路  
Redis是一種高性能的鍵值存儲數(shù)據(jù)庫,支持多種數(shù)據(jù)結構如字符串、列表、集合、哈希表和有序集合等,它提供豐富的API和持久化功能,適用于緩存、消息隊列、排行榜等多種場景,Redis能夠?qū)崿F(xiàn)高速讀寫操作,尤其適合需要快速響應的應用

Redis是什么?

Redis是非關系性數(shù)據(jù)庫,Redis 是一個開源的高性能鍵值數(shù)據(jù)庫,主要用于數(shù)據(jù)存儲和緩存。

它支持多種數(shù)據(jù)結構,如字符串、哈希、列表、集合和有序集合等。

Redis的特點

  1. 豐富的數(shù)據(jù)類型‌:Redis不僅支持字符串類型的鍵值對,還支持列表、哈希、集合和有序集合等多種數(shù)據(jù)結構,這使得Redis能夠處理更復雜的數(shù)據(jù)操作‌23。
  2. 高性能‌:由于數(shù)據(jù)存儲在內(nèi)存中,Redis能夠提供極高的讀寫速度,適用于需要高速響應的場景‌12。
  3. 持久化功能‌:Redis支持將內(nèi)存中的數(shù)據(jù)周期性地寫入磁盤,確保數(shù)據(jù)的安全性,同時也支持將修改操作寫入追加的記錄文件,實現(xiàn)主從同步‌14。
  4. 可擴展性‌:Redis提供了豐富的API和腳本功能,支持通過Lua腳本批量執(zhí)行命令,同時也支持水平擴展,類似于分庫分表

依賴

<!--  SpringBoot Boot Redis  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
  </dependency>
<!-- JUnit 5 -->
<dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.8.2</version>
      <scope>test</scope>
</dependency>
<dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.8.2</version>
      <scope>test</scope>
</dependency>

配置

spring:
  redis:
    host: 你的ip
    port: 6379

redis的配置類(用于格式轉(zhuǎn)換,處理亂碼)

package com.bwie.common.config;

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.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }
}

String(字符串)

特點

  • 最基本的數(shù)據(jù)類型,可以包含任何類型的數(shù)據(jù),比如整數(shù)、浮點數(shù)或者字符串。
  • 最大存儲容量為 512MB。

業(yè)務場景

  • 緩存: 存儲臨時數(shù)據(jù),如用戶會話信息或頁面緩存。
  • 計數(shù)器: 可以用來實現(xiàn)訪問計數(shù)器、點贊數(shù)等自增功能。
  • 配置存儲: 存儲應用程序的配置參數(shù)。

代碼使用案例

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;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class StringExampleTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testString() {
        // 設置字符串值
        redisTemplate.opsForValue().set("myStringKey", "Hello Redis!");

        // 獲取并驗證字符串值
        String value = (String) redisTemplate.opsForValue().get("myStringKey");
        assertEquals("Hello Redis!", value);  // 驗證值是否正確

        // 更新字符串值
        redisTemplate.opsForValue().set("myStringKey", "Updated Value");
        assertEquals("Updated Value", redisTemplate.opsForValue().get("myStringKey"));  // 驗證更新后的值

        // 增加計數(shù)器值
        redisTemplate.opsForValue().increment("myCounter", 1);
        assertEquals(1, redisTemplate.opsForValue().get("myCounter"));  // 驗證計數(shù)器值

        // 設置帶有過期時間的字符串
        redisTemplate.opsForValue().set("tempKey", "I will expire soon", 10);
        // 驗證過期時間是否小于10秒(實際過期時間可能略小于10秒)
        assertEquals(true, redisTemplate.getExpire("tempKey") < 10L);
    }
}

注意:

  • 如果說注入的時候泛型和配置類不一樣的話,可能會導致使用不了配置類的相關配置,就會采用redisTemplate原有的配置,然后存儲到的redis的數(shù)據(jù)就是一些亂碼。
  • 一定要保證注入的泛型和配置類一樣,這樣存儲到redis中的數(shù)據(jù)格式就是正確的

List(列表)

特點

  • 是一個鏈表結構,可以包含多個字符串值(元素)。
  • 可以在列表的兩端進行插入(Push)和刪除(Pop)操作,支持對列表進行修剪(Trim)以保留指定范圍的元素。

業(yè)務場景

  • 消息隊列:通過列表實現(xiàn)生產(chǎn)者/消費者模式。
  • 時間線:存儲用戶的活動日志或社交媒體的時間線。
  • 任務調(diào)度:存儲待處理任務的隊列。

代碼使用案例

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;

import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class ListExampleTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testList() {
        // 向列表中添加元素
        redisTemplate.opsForList().leftPush("myListKey", "item1");
        redisTemplate.opsForList().leftPush("myListKey", "item2");

        // 獲取并驗證列表中的所有元素
        List<Object> list = redisTemplate.opsForList().range("myListKey", 0, -1);
        assertEquals(true, list.contains("item2"));  // 驗證列表包含 item2
        assertEquals(true, list.contains("item1"));  // 驗證列表包含 item1

        // 從列表中彈出元素
        Object poppedItem = redisTemplate.opsForList().rightPop("myListKey");
        assertEquals("item1", poppedItem);  // 驗證彈出的元素是 item1

        // 獲取列表長度
        Long size = redisTemplate.opsForList().size("myListKey");
        assertEquals(1L, size);  // 驗證列表長度為 1

        // 在列表開頭插入新元素
        redisTemplate.opsForList().insert("myListKey", 0, "item0");
        List<Object> updatedList = redisTemplate.opsForList().range("myListKey", 0, -1);
        assertEquals(true, updatedList.contains("item0"));  // 驗證列表包含 item0
        assertEquals(true, updatedList.contains("item2"));  // 驗證列表仍包含 item2
    }
}

注意:

  • 如果說注入的時候泛型和配置類不一樣的話,可能會導致使用不了配置類的相關配置,就會采用redisTemplate原有的配置,然后存儲到的redis的數(shù)據(jù)就是一些亂碼。
  • 一定要保證注入的泛型和配置類一樣,這樣存儲到redis中的數(shù)據(jù)格式就是正確的

Set(集合)

特點

  • 是字符串的無序集合,集合中的元素都是獨一無二的,即不允許重復。
  • 支持集合間的交集、并集、差集等操作,可以用于處理多個用戶的共同好友、標簽等數(shù)據(jù)。

業(yè)務場景

  • 標簽系統(tǒng):存儲用戶的興趣標簽或文章的標簽。
  • 好友關系:存儲用戶的好友列表,快速查找共同好友。
  • 去重:用于去重操作,例如統(tǒng)計獨立訪客數(shù)。

代碼使用案例

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;

import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;

@SpringBootTest
public class SetExampleTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testSet() {
        // 向集合中添加元素
        redisTemplate.opsForSet().add("mySetKey", "member1", "member2", "member3");

        // 獲取并驗證集合中的所有成員
        Set<Object> members = redisTemplate.opsForSet().members("mySetKey");
        assertEquals(true, members.contains("member1"));  // 驗證集合包含 member1
        assertEquals(true, members.contains("member2"));  // 驗證集合包含 member2
        assertEquals(true, members.contains("member3"));  // 驗證集合包含 member3

        // 從集合中刪除某個成員
        redisTemplate.opsForSet().remove("mySetKey", "member2");
        assertFalse(redisTemplate.opsForSet().members("mySetKey").contains("member2"));  // 驗證 member2 已被刪除

        // 檢查某個成員是否在集合中
        Boolean isMember = redisTemplate.opsForSet().isMember("mySetKey", "member1");
        assertEquals(true, isMember);  // 驗證 member1 仍在集合中
    }
}

注意:

  • 如果說注入的時候泛型和配置類不一樣的話,可能會導致使用不了配置類的相關配置,就會采用redisTemplate原有的配置,然后存儲到的redis的數(shù)據(jù)就是一些亂碼。
  • 一定要保證注入的泛型和配置類一樣,這樣存儲到redis中的數(shù)據(jù)格式就是正確的

Hash(哈希表)

特點

  • 是一個鍵值對集合,適合用于存儲對象。
  • 每個 Hash 可以存儲多達 2^32 - 1 鍵值對(40多億)。
  • 適合存儲和讀取整個對象,如用戶信息、商品信息等。

業(yè)務場景

  • 用戶信息: 存儲用戶的基本信息,例如用戶名、郵箱和其他屬性。
  • 商品屬性: 存儲商品的詳細信息,如價格、描述、庫存等。
  • 狀態(tài)信息: 用于存儲狀態(tài)信息,比如會話或任務的當前狀態(tài)。

代碼使用案例

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;

import java.util.HashMap;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;

@SpringBootTest
public class HashExampleTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testHash() {
        // 創(chuàng)建 HashMap 并存儲到 Redis 中
        Map<String, Object> myHash = new HashMap<>();
        myHash.put("field1", "value1");
        myHash.put("field2", "value2");
        redisTemplate.opsForHash().putAll("myHashKey", myHash);

        // 獲取并驗證哈希字段值
        String fieldValue = (String) redisTemplate.opsForHash().get("myHashKey", "field1");
        assertEquals("value1", fieldValue);  // 驗證字段值

        // 更新哈希字段
        redisTemplate.opsForHash().put("myHashKey", "field1", "newValue");
        assertEquals("newValue", redisTemplate.opsForHash().get("myHashKey", "field1"));  // 驗證更新后的值

        // 刪除哈希字段
        redisTemplate.opsForHash().delete("myHashKey", "field2");
        assertFalse(redisTemplate.opsForHash().hasKey("myHashKey", "field2"));  // 驗證字段是否已刪除

        // 獲取所有字段及其值
        Map<Object, Object> entries = redisTemplate.opsForHash().entries("myHashKey");
        assertEquals(true, entries.containsKey("field1"));  // 驗證字段存在
        assertEquals("newValue", entries.get("field1"));  // 驗證字段值
    }
}

注意:

  • 如果說注入的時候泛型和配置類不一樣的話,可能會導致使用不了配置類的相關配置,就會采用redisTemplate原有的配置,然后存儲到的redis的數(shù)據(jù)就是一些亂碼。
  • 一定要保證注入的泛型和配置類一樣,這樣存儲到redis中的數(shù)據(jù)格式就是正確的

Sorted Set(有序集合)

特點

  • 類似于集合,每個成員都是唯一的,但每個成員都會關聯(lián)一個浮點數(shù)值,稱為分數(shù)(score)。
  • 成員按分數(shù)排序,可以根據(jù)分數(shù)范圍獲取成員,也可以按分數(shù)獲取排名。
  • 適合需要根據(jù)分數(shù)進行排序和范圍查詢的場景,如排行榜、時間線等

業(yè)務場景

  • 排行榜: 存儲用戶積分、排名等,可以快速查詢前 N 名用戶。
  • 時間戳排序: 根據(jù)時間戳的排序存儲事件日志。
  • 優(yōu)先級隊列: 實現(xiàn)任務調(diào)度,按照優(yōu)先級處理任務。

代碼使用案例

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;

import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;

@SpringBootTest
public class ZSetExampleTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testZSet() {
        // 向有序集合中添加元素
        redisTemplate.opsForZSet().add("myZSetKey", "member1", 1);
        redisTemplate.opsForZSet().add("myZSetKey", "member2", 2);

        // 獲取并驗證有序集合中的所有成員
        Set<Object> zSetMembers = redisTemplate.opsForZSet().range("myZSetKey", 0, -1);
        assertEquals(true, zSetMembers.contains("member1"));  // 驗證 member1 存在
        assertEquals(true, zSetMembers.contains("member2"));  // 驗證 member2 存在

        // 更新元素的分數(shù)
        redisTemplate.opsForZSet().incrementScore("myZSetKey", "member1", 3);
        Double score = redisTemplate.opsForZSet().score("myZSetKey", "member1");
        assertEquals(4.0, score);  // 驗證 member1 的分數(shù)更新為 4.0

        // 獲取指定分數(shù)范圍內(nèi)的成員
        Set<Object> rangeByScore = redisTemplate.opsForZSet().rangeByScore("myZSetKey", 1, 2);
        assertEquals(true, rangeByScore.contains("member2"));  // 驗證 member2 在分數(shù)范圍內(nèi)

        // 從有序集合中刪除某個成員
        redisTemplate.opsForZSet().remove("myZSetKey", "member2");
        assertFalse(redisTemplate.opsForZSet().range("myZSetKey", 0, -1).contains("member2"));  // 驗證 member2 已被刪除
    }
}

注意:

  • 如果說注入的時候泛型和配置類不一樣的話,可能會導致使用不了配置類的相關配置,就會采用redisTemplate原有的配置,然后存儲到的redis的數(shù)據(jù)就是一些亂碼。
  • 一定要保證注入的泛型和配置類一樣,這樣存儲到redis中的數(shù)據(jù)格式就是正確的

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • redis全局命令set、get、keys使用方法

    redis全局命令set、get、keys使用方法

    這篇文章主要介紹了redis全局命令set、get、keys使用方法的相關資料,詳細講解了Redis的基本概念和常用命令,強調(diào)了在生產(chǎn)環(huán)境中避免使用keys命令的重要性,需要的朋友可以參考下
    2025-03-03
  • Redis存儲經(jīng)緯度信息的實現(xiàn)

    Redis存儲經(jīng)緯度信息的實現(xiàn)

    在一些向用戶提供天氣信息的業(yè)務場景中,我們通常會通過前端獲取用戶經(jīng)緯度信息,傳遞給后端作為參數(shù)進行外部天氣接口調(diào)用,本文就來詳細的介紹一下Redis存儲經(jīng)緯度信息的實現(xiàn),感興趣的可以了解一下
    2025-10-10
  • Redis和Lua實現(xiàn)分布式限流器的方法詳解

    Redis和Lua實現(xiàn)分布式限流器的方法詳解

    這篇文章主要給大家介紹了關于Redis和Lua實現(xiàn)分布式限流器的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis和Lua具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • Redis中管道操作pipeline的實現(xiàn)

    Redis中管道操作pipeline的實現(xiàn)

    RedisPipeline是一種優(yōu)化客戶端與服務器通信的技術,通過批量發(fā)送和接收命令減少網(wǎng)絡往返次數(shù),提高命令執(zhí)行效率,本文就來介紹一下Redis中管道操作pipeline的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • redis刪除指定key的實現(xiàn)步驟

    redis刪除指定key的實現(xiàn)步驟

    本文主要介紹了redis刪除指定key的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • redis list類型命令的實現(xiàn)

    redis list類型命令的實現(xiàn)

    本文主要介紹了redis list類型命令的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Redis中漸進式命令scan詳解與使用

    Redis中漸進式命令scan詳解與使用

    在Redis日常開發(fā)中,我們經(jīng)常需要遍歷數(shù)據(jù)庫中的鍵或集合中的元素,scan命令是Redis 2.8版本引入的漸進式遍歷方案,解決了keys命令在大數(shù)據(jù)量下阻塞Redis服務的問題,下面就來介紹一下該命令的使用,感興趣的可以了解一下
    2025-11-11
  • Redis的Python客戶端redis-py安裝使用說明文檔

    Redis的Python客戶端redis-py安裝使用說明文檔

    這篇文章主要介紹了Redis的Python客戶端redis-py安裝使用說明文檔,本文講解了安裝方法、入門使用實例、API參考和詳細說明,需要的朋友可以參考下
    2015-06-06
  • 緩存替換策略及應用(以Redis、InnoDB為例)

    緩存替換策略及應用(以Redis、InnoDB為例)

    本文以Redis、InnoDB為例給大家講解緩存替換策略及應用,本文給大家提到五種置換策略,通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • redis中的事務操作案例分析

    redis中的事務操作案例分析

    這篇文章主要介紹了redis中的事務操作案例,結合具體實例形式詳細分析了redis事務操作的概念、原理、使用技巧與相關注意事項,需要的朋友可以參考下
    2019-07-07

最新評論

临西县| 黔西县| 九台市| 星座| 宁城县| 盱眙县| 栖霞市| 雅安市| 阳新县| 清流县| 诸城市| 新巴尔虎右旗| 蛟河市| 阿巴嘎旗| 河津市| 库伦旗| 靖边县| 邢台县| 宜宾市| 洞口县| 洛宁县| 建德市| 石柱| 陇南市| 安西县| 山丹县| 色达县| 浦城县| 昌黎县| 皮山县| 新田县| 乐东| 桐城市| 麻阳| 安岳县| 卢龙县| 肥东县| 民丰县| 富裕县| 博罗县| 贡山|