成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis常用的八種場景

數據庫 Redis
如果你在業務中不確定是否需要引入 Redis時,可以參考本文,如果場景剛好命中其中一種,那么可以選擇使用 Redis。

大家好,我是猿java。

作為一名 Java后端人員,對 Redis肯定并不陌生,Redis作為一種內存數據庫,以其速度之快在編程的舞臺上縱橫多年,那么,Redis到底適合哪些業務場景?今天就來聊一聊。

1. 緩存/數據庫

緩存(Cache)是 Redis使用最廣泛的場景之一,也是很多小伙伴結識 Redis的重要原因,在 8種10倍提升API性能的方式 文章中我們也強調了Redis可以作為緩存的來加速 API性能。如下圖,在 WebServer和數據庫之間會增加一層 Redis緩存,這樣 WebServer可以直接從Redis中快速拿到數據返回,加快了 WebServer的響應速度。

舉例:

  • 電商領域,可以緩存一些熱門商品的靜態信息或用戶數據,這樣,在大流量訪問時,不用查詢數據庫,加速訪問速度。
  • 配置中心,業務開發中,經常會使用一些全局配置,而且配置更改的頻率很低,因此,可以把配置都加載到 Redis內存中,加快查詢數據。

需要說明的是:很多時候,我們都會把 Redis的持久化功能打開,因此,在把 Redis當作緩存的同時,同樣把 Redis當作數據庫在使用。

2. 分布式鎖

分布式鎖(Distributed Lock)也是 Redis使用最廣泛的場景之一,分布式系統中,當我們在處理有并發的業務場景時,為了保證線程安全,通常通常會使用分布式鎖,單機下,Redis通常使用 SET NX(if Not Exist)和 PX(過期時間)來創建鎖,指令如下:

# 如果key不存,set key=value,
# 失效時間是 expiration毫秒
SET key value NX PX expiration

在 Java中,Redission是一個基于 Redis的分布式Java對象映射(Java Redis Client),它提供了豐富的特性和工具,示例代碼展示了如何在 Redission框架中使用 Redis分布式鎖:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonExample {
    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(config);

        // 使用分布式鎖
        String lockKey = "lockKey";
        boolean isLocked = redisson.getLock(lockKey).tryLock();
        if (isLocked) {
            // 獲得鎖,執行相關操作
            System.out.println("Lock acquired successfully");
            redisson.getLock(lockKey).unlock(); // 釋放鎖
        } else {
            System.out.println("Failed to acquire lock");
        }
        redisson.shutdown(); // 關閉連接
    }
}

需要說明的是:除了Redis,Zookeeper也是實現分布式鎖比較常用的一種技術方案。

3. 限流

限流(Rate Limiter)也是 Redis使用比較多的一個場景,限流是保護系統免受過載的一種方法,它可以確保在指定時間內對系統的請求進行限制。在 Redis 中,可以使用 SET、EXPIRE 和 Lua 腳本來實現簡單的限流功能。

示例代碼展示了Java Jedis 庫實現基于令牌桶算法的 Redis 限流:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;

public class RateLimiter {
    private final Jedis jedis;
    private final String key;
    private final int capacity;
    private final int tokensPerSecond;

    public RateLimiter(Jedis jedis, String key, int capacity, int tokensPerSecond) {
        this.jedis = jedis;
        this.key = key;
        this.capacity = capacity;
        this.tokensPerSecond = tokensPerSecond;
    }
   
    /**
    * 用于檢查是否允許請求,根據當前令牌數量和容量進行判斷
    */ 
    public boolean allowRequest() {
        long now = System.currentTimeMillis();
        Transaction transaction = jedis.multi();
        // Add current time with score
        transaction.zadd(key, now, String.valueOf(now)); 
        // Remove tokens that are older than 1 second
        transaction.zremrangeByScore(key, 0, now - 1000); 
        // Get current number of tokens
        Response<Long> sizeResponse = transaction.zcard(key); 

        transaction.exec();

        long size = sizeResponse.get();
        // Check if number of tokens is within capacity
        return size <= capacity; 
    }

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost"); // Connect to Redis
        // Create rate limiter
        RateLimiter rateLimiter = new RateLimiter(jedis, "RateLimiterKey", 10, 5); 

        for (int i = 0; i < 15; i++) {
            boolean allowed = rateLimiter.allowRequest();
            if (allowed) {
                System.out.println("Request allowed");
            } else {
                System.out.println("Request denied");
            }
        }

        // Close Redis connection
        jedis.close(); 
    }
}

4. 會話存儲

會話(Session)也是 Redis常見的一種功能,熟悉 Spring的小伙伴肯定知道它也有一個 Session功能,那么它和 Redis的 Session有什么區別呢?

Spring Session是一個抽象層,提供與存儲后端銜接能力,至于后端采用內存、數據庫還是Redis存儲Spring Session不關注。而 Redis Session是 Spring Session的一種具體實現,將會話數據存儲在Redis中。

舉例:存儲用戶登錄信息:

#將用戶的登錄信息存儲在 Redis中,key:userId, value:user登錄信息
SET user:userId {"username": "xxx", "password": "xxx",...}

5. 發布/訂閱

發布/訂閱(Sub/Pub)是 Redis中一個類似于消息中間件(MQ)的功能,當我們的業務中有需要通過事件觸發的場景時可以使用該功能,不過 Redis的 Sub/Pub功能還是比較簡陋,有復雜的業務場景時還是推薦MQ。

舉例:

群聊,在實時聊天應用中,利用 Redis的發布/訂閱功能實現消息廣播。

實現事件通知系統,如新訂單通知、新郵件提醒等。

#訂閱頻道
SUBSCRIBE channel_xxx
# 向頻道中發送消息
PUBLISH channel_xxx "Message content"

6. 排名/排行榜

排名/排行榜(Rank/LeaderBoard)是 Redis中一個比較實用的功能,在文章熱榜、游戲競技或社區平臺中,排行榜(Leaderboard)和排名(Ranking)系統是常見的功能,用于展示用戶在特定活動、比賽或指標上的排名情況,而 Redis的有序集合(Sorted Set)是實現排行榜功能的理想數據結構,因為它可以存儲每個成員的分數,并根據分數進行排序。

舉例:

(1) 記錄網站訪問次數或文章閱讀次數。

# 添加文章的點擊量
#將 Article1 的值增加1。如果Article1 不存在于有序集合中,
# 該命令會將 Article1 添加到集合,并設置值為1
ZINCRBY leaderboard 1 "Article1"
ZINCRBY leaderboard 1 "Article2"
ZINCRBY leaderboard 1 "Article3"

# 獲取 Article2的排名(從高到低排名)
ZREVRANK leaderboard "Article2" 

# 獲點擊量 Top10 的文章和點擊量
ZREVRANGE leaderboard 0 9 WITHSCORES

(2) 實現用戶積分排行榜。

7. 計數

在 Redis中,可以使用 INCR、DECR 等命令來進行簡單的計數操作。這些命令用于對鍵的值進行遞增或遞減操作,常用于實現計數器等功能。

常用計數命令:

# 對 key進行 +1 操作
INCR key
# 對key 進行 -1 操作
DECR key

# 對 key進行 +n 操作
INCRBY key n
# 對 key進行 -n 操作
DECRBY key n

另外,在排名/排行榜中,ZINCRBY 是對 Sort set的一種計數方式。

舉例:

  • 網站訪問量計數器,可以實時統計網站的訪問次數;
  • 點贊/喜歡計數器,對文章或內容的點贊或喜歡次數進行計數;
  • 用戶在線狀態統計,統計在線用戶數量;

8. 地理位置應用

Redis的地理位置應用功能使用的場景比較有針對性,如果你不是在特定的領域,可能并不會使用該功能,它是 通過 Geo數據類型支持地理位置存儲和檢索,可以用于構建位置服務和地理位置相關的應用。

舉例:

(1) 點過外賣的小伙伴肯定不陌生,外賣平臺上,附近商家搜索功能。

# 查找經度12.087269,緯度39.412669 附近5 km的距離范圍
GEORADIUS locations 12.087269 39.412669 5 km

(2) 打車平臺,比如一些網約車平臺,就可以把司機,乘客的位置信息(經緯度)通過Redis的Geo來實現距離計算等功能。

# 添加經緯度信息,經緯度是編造的,不一定真實
GEOADD locations 12.322389 39.125356 "Driver"
GEOADD locations 12.087269 39.412669 "Passenger"
# 計算司機和乘客兩地點間的距離
GEODIST locations Driver Passenger

總結

本文介紹了Redis常見的 8種實用場景:

  • 緩存/數據庫
  • 分布式鎖
  • 限流
  • 會話存儲
  • 發布/訂閱
  • 排名/排行榜
  • 計數
  • 地理位置應用

如果你在業務中不確定是否需要引入 Redis時,可以參考本文,如果場景剛好命中其中一種,那么可以選擇使用 Redis。如果你的業務場景不在這 8種常見場景中,不代表不能使用 Redis,可能需要你更多的技術調研來確認合適的技術方案。

最后,把猿哥的座右銘送給你:投資自己才是最大的財富。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2024-03-13 14:57:37

2024-12-30 08:29:05

2012-11-12 16:09:56

Windows

2024-12-19 08:50:38

Redis存儲系統

2015-04-07 10:46:48

Redis

2010-01-11 09:53:28

VB.NET語法

2022-02-17 11:03:33

數據庫基礎語法用法

2024-12-11 08:20:57

設計模式源碼

2023-07-05 08:45:18

Spring事務失效場景

2009-12-15 10:58:54

2024-01-10 08:20:50

Linux編輯器pico

2024-01-18 08:21:55

2011-06-09 13:48:48

程序員

2022-08-30 00:31:12

機器學習超參數調優算法

2010-09-09 08:39:30

2016-07-05 14:09:02

AndroidJAVA內存

2010-08-24 09:49:44

2021-08-02 10:46:02

云計算用途

2025-01-15 08:42:41

2024-03-26 00:05:13

數據庫數據結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 成人乱人乱一区二区三区软件 | 欧美在线一区二区三区 | 日韩av成人在线 | 成人免费观看视频 | 精品国产乱码久久久久久图片 | 久久久久国产精品午夜一区 | 欧美日韩精品中文字幕 | 国产又爽又黄的视频 | 国产精品一区二区福利视频 | 91亚洲一区 | 精品欧美一区免费观看α√ | 激情毛片| 欧美一级片久久 | 国产精品国产馆在线真实露脸 | 久久99深爱久久99精品 | 精品久久久久久久 | 一区二区三区精品视频 | 91福利在线观看 | 日日噜噜夜夜爽爽狠狠 | 人碰人操 | 色妹子综合网 | 精品一区二区三 | 国产成人精品一区二区三区网站观看 | 久久久久国产一区二区三区四区 | 99视频入口 | 亚洲精品国产区 | aaa大片免费观看 | 精品一区二区三区在线观看 | 在线精品亚洲欧美日韩国产 | 亚洲三级在线观看 | 极品销魂美女一区二区 | 亚洲福利精品 | 国产高清视频一区 | 国产在线一区二区 | 精品一区精品二区 | 久久9999久久 | 国产成人精品一区二区三区 | 亚洲一区二区三区四区五区午夜 | 99国产精品久久久久老师 | 国产精品成人品 |