Redis与Queue
Redis有多种数据结构,适合多种不同的应用场景
1. 使用Redis做缓存
Redis的字符串、哈希表两种数据结构适合用来储存大量的键值对信息,从而实现高速缓存。
2. 使用Redis做队列
Redis 有多几种数据结构适于做队列:
使用“列表”数据结构,可以实现普通级和优先级队列的功能;
使用“ 有序集合”数据结构,可以实现优先级队列;
使用“哈希表”数据结构,可以实现延时队列;
3. 使用Redis去重
Redis 有多几种数据结构适于做去重:
利用“集合”数据结构,可以实现小批量数据的去重:
利用“字符串” 数据结构的位操作,可以实现布隆过滤器,从而实现超大规模的数据去重;
利用Redis 自带的HyperLogLog 数据结构,可以实现超大规模数据的去重和计数。
4. 使用Redis实现积分板
Redis 的“ 有序集合”功能可以实现积分板功能,还能实现自动排序、排名功能。
5. 使用Redis实现“发布/订阅”功能
Redis 自带的“发布/订阅”模式可以实现多对多的“ 发布/订阅”功能
Queue和Redis
import time
import random
from queue import Queue
from threading import Thread
"""
使用python实现一个简单的”生产者/消费者“模型
使用python的queue对象做信息队列
"""
class Producer(Thread):
"""生产者"""
def __init__(self, queue):
super().__init__() # 显示调用父类的初始化方法
self.queue = queue
def run(self):
while True:
a = random.randint(0, 10)
b = random.randint(90, 100)
print(f"生产者产生了两个数字:{a},{b}")
self.queue.put((a, b))
class Consumer(Thread):
"""消费者"""
def __init__(self, queue):
super().__init__()
self.queue = queue
def run(self):
while True:
num_tuple = self.queue.get(block=True)
# block=True 表示 如果队列中为空则阻塞在这里,直到队列中有数据为止
sum_a_b = sum(num_tuple)
print(f"消费者消费了一组数据,{num_tuple[0]} + {num_tuple[1]} = {sum_a_b}")
time.sleep(random.randint(0, 10))
queue = Queue()
producer = Producer(queue)
consumer = Consumer(queue)
producer.start()
consumer.start()
while True:
time.sleep(1)
# 由于生产过程和消费过程不对等,可能会出现数据生产者的数据堆积在队列中的情况
python中Queue的缺陷,把队列中的数据存放在内存中,如果突然断电,队列中的数据全部消失,缺陷还有很多......
使用Redis替代Queue
生产者
"""
拆分生产者和消费者队列
使用Redis列表作为队列
"""
import time
import json
import redis
import random
from threading import Thread
class Producer(Thread):
def __init__(self):
super().__init__()
self.queue = redis.Redis()
def run(self) -> None:
while True:
a = random.randint(0, 10)
b = random.randint(90, 100)
print(f"生产者生产了两个数字:{a},{b}")
self.queue.rpush("producer", json.dumps((a, b)))
time.sleep(2)
producer = Producer()
producer.start()
while True:
time.sleep(1)
消费者
import time
import json
import redis
import random
from threading import Thread
class Consumer(Thread):
def __init__(self):
super().__init__()
self.queue = redis.Redis()
def run(self) -> None:
while True:
num_tuple = self.queue.blpop("producer")
a, b = json.loads(num_tuple[1].decode())
print(f"消费者消费了一组数据,{a}+{b}={a+b}")
time.sleep(random.randint(0,10))
producer = Consumer()
producer.start()
while True:
time.sleep(1)
- 生产者和消费者可以放在不同的服务器上运行,运行多少消费者都可以
- 可以随时观察reids队列的长度
- Redis对数据会做持久化,也不必担心服务器断电....
Redis与Queue的更多相关文章
- redis实现队列queue
参考:<Redis入门指南>第4章进阶 http://book.51cto.com/art/201305/395461.htm 4.4.2 使用Redis实现任务队列 说到队列很自然就能想 ...
- 三、Redis基本操作——List
小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...
- python之redis和memcache操作
Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...
- Redis使用总结(3):实现简单的消息队列
参考Redis实现简单消息队列 Redis提供了两种方式来作消息队列.一个是使用生产者消费模式模式,另外一个方法就是发布订阅者模式.前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费 ...
- windows下安装redis和php的redis扩展
1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- php+redis 简易的实现文章发布系统(用户投票系统)
/** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...
- Redis实现简单消息队列
http://www.jianshu.com/p/9c04890615ba 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器 ...
- 《Redis入门指南》第2版 读书笔记
读第二遍了,感觉和几年前读时的收获不一样了.送上门来当树洞的独自承担一切 Redis以简洁为美Redis通信协议是Redis客户端与Redis之间交流的语言,通信协议规定了命令和返回值的格式.Redi ...
- 如何搭建高可用redis架构?
如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...
随机推荐
- Unity经典游戏教程之:是男人就下100层
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- SSM框架的详细解说
文章转载自:http://blog.csdn.net/zhshulin 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就 ...
- 利用DoHome APP和音箱控制继电器通断电实验参考步骤
准备材料: Arduino Uno 一块 Arduino 扩展板 购买链接 DT-06模块一个 购买链接 安卓手机一个 小度音箱一个 继电器模块一个 杜邦线若干 1.DT-0 ...
- Python 学习笔记(6)— 字符串格式化
字符串格式化处理 远古写法 以前通常使用运算符号 % ,%s 插入的值 String 类型,%.3f 指插入的值为包含 3 位小数的浮点数: format1 = "%s, %s!" ...
- 史上最全面 Android逆向培训之__Xposed使用
刚招来个Android,干了半个月辞职了,他走之后,成堆的bug被测了出来,都是这个新人代码都没看懂就开始改的一塌糊涂,还给提交了.实在是让人头疼,清理了一个月多月才把他半个月写的bug清理个差不多. ...
- java优雅注释原则和代码格式列举
一.java的三种注释类型 单行注释:// ...... 块注释:/* ...... */ 文档注释:/** ...... */ 二.指导原则 注释不能美化糟糕的代码,碰到糟糕的代码就重新写吧. 用代 ...
- intellij idea 2019 安装使用教程
一.安装 idea 2019.2 链接:https://pan.baidu.com/s/1acx_P23W463it9PGAYUIBw 提取码:4bky 双击运行idea.exe 点击Next ...
- 基于UDP的socket tcp和udp的区别(小白进击篇)
目录 16.基于udp协议的socket通信 为什么udp不会有粘包现象 DGRAM datagram#数据报文 发送sento (发送的信息,发送给的地址) 接收revefrom 客户端 服务端 t ...
- 无重复字符的最长子串[双指针+哈希表] LeetCode.3
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- adb 最常用最简单的命令-install/push/pull 使用
以vivo测试机为例1.网上下载adb工具包,安装---网上有教程2.手机连接电脑后,进入手机设置--更多设置---开发者选项,打开开发者选项和USB调试: (不同手机开发者选项进入方式不同)3.打开 ...