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.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...
随机推荐
- Java的编译原理
概述 java语言的"编译期"分为前端编译和后端编译两个阶段.前端编译是指把*.java文件转变成*.class文件的过程; 后端编译(JIT, Just In Time Comp ...
- DesignPattern系列__03依赖倒置原则
依赖倒置原则(Dependence Inversion Priiciple,DIP) 介绍 High level modules should not depend upon low level mo ...
- JavaSE之——并没有多维数组
近日在读<疯狂Java讲义>精粹第二版,部分语述摘自其中,自己边敲边理解 前言 我们知道,Java语言支持的类型有两种: 1.基本类型(即八大基本数据类 ...
- Java下载文件方法
public static void download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径. F ...
- 《机器学习技法》---线性SVM
(本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...
- 100天搞定机器学习|Day 30-32 微积分的本质
3blue1brown系列课程,精美的动画,配上生动的讲解,非常适合帮助建立数学的形象思维,非常值得反复观看: http://www.3blue1brown.com/ 哔哩哔哩: https://sp ...
- 安全测试基础2-sqlmap演练
sqlmap简介 sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限. 它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括 ...
- mybatis逆向工程maven版本idea工具
基于springboot2版本 pom基本依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...
- 2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈
本文转载于:奥怪的小栈 这篇文章告诉你如何在2019快速上手搭建一个像我一样的博客:基于HEXO+Github搭建.并完成SEO优化,打造一个炫酷博客. 本站基于HEXO+Github搭建.所以你需要 ...
- Python3 完美解决unittest框架下不生成测试报告
前提: 1.运行测试用例一切正常,只是没有测试报告显示 2.使用命令行pyhon 脚本名字.py 却可以生成测试报告 3.pycharm 在运行测试用例的时候 默认是以unittest 框架来运行的, ...