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

Redis+threading實現(xiàn)多線程消息隊列的使用示例

 更新時間:2023年12月18日 11:36:04   作者:Asura_____  
Redis多線程消息隊列是一種使用Redis作為存儲后端的消息隊列實現(xiàn),它利用Redis的線程并發(fā)處理能力來提高消息隊列的處理效率,本文主要介紹了Redis+threading實現(xiàn)多線程消息隊列的使用示例,感興趣的可以了解一下

列表

lpush左插入、rpush右插入、lrange查詢集合

127.0.0.1:6379> lpush list v1
(integer) 1
127.0.0.1:6379> lpush list v2
(integer) 2
127.0.0.1:6379> lpush list v3
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> LRANGE list 0 1
1) "v3"
2) "v2"
127.0.0.1:6379> LRANGE list 0 0
1) "v3"
127.0.0.1:6379> rpush list rv0
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "rv0"

lpop左移除、rpop右移除

127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "rv0"
127.0.0.1:6379> lpop list
"v3"
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v1"
3) "rv0"
127.0.0.1:6379> rpop list
"rv0"
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v1"

lindex下標(biāo)查詢、llen長度查詢

127.0.0.1:6379> lrange list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> lindex list 1
"v3"
127.0.0.1:6379> lindex list 0
"v4"
127.0.0.1:6379> llen list
(integer) 4

blpop、brpop

BRPOP 是 Redis 的一個阻塞式列表彈出命令,用于從指定的一個或多個列表中彈出最后一個元素。它和BLPOP 不同之處在于它是從列表的尾部彈出元素,而不是從頭部。
這種阻塞式彈出操作通常用于實現(xiàn)消息隊列。如果列表為空,就會阻塞等待直到有消息可供處理。timeout: 阻塞超時時間,如果所有指定的列表都為空,命令將阻塞直到有元素可彈出或超時。

# 連接到本地 Redis 服務(wù)器
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
a = ['item1','item2','item3','item4','item5','item6']
# 將元素推入列表
r.rpush('my_queue',*a)
# 使用 blpop 彈出元素
result = r.blpop('my_queue', timeout=5)  # 設(shè)置超時時間為 5 秒

['item1', 'item2', 'item3', 'item4', 'item5', 'item6']
['item2', 'item3', 'item4', 'item5', 'item6']

字符串

set、incr遞增、decr遞減

  • 雖然輸入是int類型,但是set會自動轉(zhuǎn)換為string
r.set('my_queue', 5)

# 對 key 為 'my_queue' 的值執(zhí)行遞減操作
value = r.decr('my_queue')
# 獲取遞減后的值
print(f'New value: {value}')

new_value = r.incr('my_queue')

print(f'New value: {new_value}')

New value: 4
New value: 5

可以看到就算是賦值也已經(jīng)改變了my_queue鍵的值。

keys取鍵、get取值、delete

# 將元素推入列表
r.setnx('my_queue:ddd:count',123)
r.setnx('my_queue:aaa:count',456)
r.setnx('my_queue',789)
r.setnx('my_queue',101)
r.set('my_queue:kkk:count',159)

print(r.keys('*'))
keys = r.keys('my_queue:*:count')
# 打印匹配的鍵列表
print(keys)
value = r.get(keys[0])
print(value)
r.delete('my_queue:ddd:count')
print(r.keys('*'))

['my_queue:kkk:count', 'my_queue', 'my_queue:aaa:count', 'my_queue:ddd:count']
['my_queue:kkk:count', 'my_queue:aaa:count', 'my_queue:ddd:count']
159
['my_queue:kkk:count', 'my_queue', 'my_queue:aaa:count']

關(guān)于為什么delete了還能取到值(

delete只是刪除了redis隊列的鍵值對,keys是已經(jīng)賦過值了所以不受影響。

r.setnx(f'rtp_task:{1}:{123}:count',123)
r.setnx(f'rtp_task:{2}:{456}:count',456)
r.setnx(f'rtp_task:{3}:{789}:count',789)
r.setnx(f'rtp_task:{4}:{101}:count',101)
r.setnx(f'rtp_task:{5}:{159}:count',159)


keys = r.keys('rtp_task:*:count')
r.delete('rtp_task:1:123:count')
print(r.keys("*"))
print(keys)

['rtp_task:4:101:count', 'rtp_task:2:456:count', 'rtp_task:3:789:count', 'rtp_task:5:159:count']
['rtp_task:4:101:count', 'rtp_task:2:456:count', 'rtp_task:3:789:count', 'rtp_task:1:123:count', 'rtp_task:5:159:count']

setnx

含義(setnx = SET if Not eXists):如果不存在,則set。

r.setnx('my_queue:ddd:count',123)
print(r.get('my_queue:ddd:count'))
123
r.setnx('my_queue:ddd:count',123)
r.setnx('my_queue:ddd:count',456)
print(r.get('my_queue:ddd:count'))
123

threading

Thread

創(chuàng)建線程

在創(chuàng)建線程時,傳遞參數(shù)需要是一個可迭代的對象,如果只有一個參數(shù),需要在參數(shù)后面添加逗號,以表示它是一個元組而不是一個單一的值。

如果寫成 args=(a,),它會被解釋為一個包含單一元素的元組,而如果你寫成 args=(a),它會被解釋為 args=a,這樣就不再是一個元組。

a = "this is message"

def iptest(message):
    print(message)

t = threading.Thread(target=iptest, args=(a,))

start、join

a = "this is message"

def iptest(message):
    print(message)

t = threading.Thread(target=iptest, args=(a,))

t.start()

this is message

join方法的作用是確保thread子線程執(zhí)行完畢后才能執(zhí)行下一個線程。

沒加join前:

def iptest():
    print("message1\n")
    for i in range(10):
        # time.sleep() 函數(shù)推遲調(diào)用線程的運行,可通過參數(shù)secs指秒數(shù),表示進程掛起的時間。
        time.sleep(0.1)
    print('message2')
def main():
    add_thread = threading.Thread(target=iptest, name="T2")
    add_thread.start()
    print("done")
    
if __name__ == '__main__':
    main()


message1
done

message2

加join后

message1

message2
done

消息隊列

import redis
import threading
import time
import json

# 連接到本地 Redis 服務(wù)器
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)

def producer(queue_name):
    # 生產(chǎn)者線程,模擬向隊列中推送任務(wù)
    for i in range(5):
        message = {'task_id': i, 'data': f'Task {i}'}
        r.rpush(queue_name, json.dumps(message))
        time.sleep(1)

def consumer(queue_name, worker_id):
    while True:
        # 消費者線程,使用 blpop 從隊列中阻塞獲取任務(wù)
        message = r.blpop(queue_name, timeout=10)
        if message:
            task = json.loads(message[1])
            print(f"Worker {worker_id} processing task: {task} \n")
            # 模擬任務(wù)處理時間
            time.sleep(2)
            # 模擬任務(wù)處理完成后,更新任務(wù)計數(shù)
            r.decr(f'rtp_task:{task["task_id"]}:count')

            num_task = r.get(f'rtp_task:{task["task_id"]}:count')
            print(f'taskid{task["task_id"]},num_task{num_task}')

if __name__ == '__main__':
    # 設(shè)置初始任務(wù)計數(shù)
    for i in range(5):
        r.setnx(f'rtp_task:{i}:count', 3)

    # 創(chuàng)建一個生產(chǎn)者線程
    producer_thread = threading.Thread(target=producer, args=('product',))
    producer_thread.start()

    # 創(chuàng)建多個消費者線程
    num_consumers = 3
    consumer_threads = []
    for i in range(num_consumers):
        consumer_thread = threading.Thread(target=consumer, args=('product', i + 1))
        consumer_threads.append(consumer_thread)
        consumer_thread.start()

    # 等待生產(chǎn)者線程和消費者線程完成
    producer_thread.join()
    for consumer_thread in consumer_threads:
        consumer_thread.join()

Worker 2 processing task: {'task_id': 0, 'data': 'Task 0'} 

Worker 1 processing task: {'task_id': 1, 'data': 'Task 1'} 

Worker 3 processing task: {'task_id': 2, 'data': 'Task 2'} 

taskid0,num_task2
taskid1,num_task2
Worker 2 processing task: {'task_id': 3, 'data': 'Task 3'} 

taskid2,num_task2
Worker 1 processing task: {'task_id': 4, 'data': 'Task 4'} 

taskid3,num_task2
taskid4,num_task2

到此這篇關(guān)于Redis+threading實現(xiàn)多線程消息隊列的使用示例的文章就介紹到這了,更多相關(guān)Redis threading多線程消息隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • redis.conf中使用requirepass不生效的原因及解決方法

    redis.conf中使用requirepass不生效的原因及解決方法

    本文主要介紹了如何啟用requirepass,以及啟用requirepass為什么不會生效,從代碼層面分析了不生效的原因,以及解決方法,需要的朋友可以參考下
    2023-07-07
  • Redis中5種數(shù)據(jù)結(jié)構(gòu)的使用場景介紹

    Redis中5種數(shù)據(jù)結(jié)構(gòu)的使用場景介紹

    這篇文章主要介紹了Redis中5種數(shù)據(jù)結(jié)構(gòu)的使用場景介紹,本文對Redis中的5種數(shù)據(jù)類型String、Hash、List、Set、Sorted Set做了講解,需要的朋友可以參考下
    2014-09-09
  • 分布式使用Redis實現(xiàn)數(shù)據(jù)庫對象自增主鍵ID

    分布式使用Redis實現(xiàn)數(shù)據(jù)庫對象自增主鍵ID

    本文介紹在分布式項目中使用Redis生成對象的自增主鍵ID,通過Redis的INCR等命令實現(xiàn)計數(shù)器功能,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Redis集群模式和常用數(shù)據(jù)結(jié)構(gòu)詳解

    Redis集群模式和常用數(shù)據(jù)結(jié)構(gòu)詳解

    Redis集群模式下的運維指令主要用于集群的搭建、管理、監(jiān)控和維護,講解了一些常用的Redis集群運維指令,本文重點介紹了Redis集群模式和常用數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2024-03-03
  • Java實現(xiàn)多級緩存的方法詳解

    Java實現(xiàn)多級緩存的方法詳解

    對于高并發(fā)系統(tǒng)來說,有三個重要的機制來保障其高效運行,它們分別是:緩存、限流和熔斷,所以本文就來和大家探討一下多級緩存的實現(xiàn)方法,希望對大家有所幫助
    2024-02-02
  • Redis五種數(shù)據(jù)類型詳解

    Redis五種數(shù)據(jù)類型詳解

    Redis是基于內(nèi)存的 K-V 數(shù)據(jù)庫,常用于緩存、消息隊列,分布式鎖等場景,并且提供了常見的數(shù)據(jù)結(jié)構(gòu):字符串、哈希、列表、集合、帶排序的集合,本文主要介紹了Redis的五種數(shù)據(jù)類型,感興趣的小伙伴可以參考閱讀本文
    2023-04-04
  • 通過Redis實現(xiàn)Token黑名單機制的具體方案

    通過Redis實現(xiàn)Token黑名單機制的具體方案

    如果沒有為Token提供主動失效機制,一旦Token被簽發(fā),在過期之前將一直有效,存一些安全隱患,所以本文通過將已失效的Token存儲在Redis中,可以確保Token在被主動注銷后無法繼續(xù)使用,需要的朋友可以參考下
    2025-11-11
  • redis字符串類型_動力節(jié)點Java學(xué)院整理

    redis字符串類型_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis字符串類型的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Redis內(nèi)存碎片原理深入分析

    Redis內(nèi)存碎片原理深入分析

    這篇文章主要為大家介紹了Redis內(nèi)存碎片原理深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Redis遍歷海量數(shù)據(jù)集的幾種實現(xiàn)方法

    Redis遍歷海量數(shù)據(jù)集的幾種實現(xiàn)方法

    Redis作為一個高性能的鍵值存儲數(shù)據(jù)庫,廣泛應(yīng)用于各種場景,包括緩存、消息隊列、排行榜,本文主要介紹了Redis遍歷海量數(shù)據(jù)集的幾種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02

最新評論

华亭县| 开平市| 朝阳市| 江达县| 将乐县| 如皋市| 都昌县| 长白| 江油市| 汉沽区| 萨嘎县| 客服| 句容市| 高唐县| 白城市| 瑞安市| 江油市| 满城县| 蒲江县| 常熟市| 霞浦县| 遵义县| 阿拉善左旗| 永安市| 大名县| 平邑县| 城步| 太仆寺旗| 苏尼特右旗| 阿克苏市| 柳江县| 布尔津县| 上高县| 黄陵县| 乾安县| 义马市| 凯里市| 葫芦岛市| 镇沅| 专栏| 栖霞市|