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.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...
随机推荐
- Mysql之锁、事务绝版详解---干货!
一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...
- java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader的关系
1. 简单介绍 Bootstrap. ExtClassLoader. AppClassLoader是java最根正苗红的类加载器. Bootstrap是本地代码编写的(例如C), ExtClassL ...
- 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表
1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...
- Spring Cloud微服务接口这么多怎么调试
导读 我们知道在微服务架构下,软件系统会被拆分成很多个独立运行的服务,而这些服务间需要交互通信,就需要定义各种各样的服务接口.具体来说,在基于Spring Cloud的微服务模式中,各个微服务会基于S ...
- The philosophy of ranking
In the book Decision Quality, one will be trained to have three decision making system; one of them ...
- xcode自动刷新resource下的文件
修改resource下的lua或者ccbi文件时,xcode并不会察觉到,所以需要手动清理xcode缓存和模拟器缓存,开发效率比较低下. 通过以下步骤可以实现自动刷新resource下的文件,且无需手 ...
- JavaWeb——JSP开发1
1.什么是jsp,为什么要使用jsp. 再使用idea创建完一个web工程后,在webapp目录下会生成一个index.jsp 直接编译运行,网站将自动打开这样一个网页: 所以我们可以推测这个inde ...
- 体验使用MUI上手练习app页面开发
因为公司安排需要先学习一点app开发,而安排学习的框架就是MUI,上手两天体验还算可以(来自后端人员的懵逼),靠着MUI的快捷键可以快速的完成自己想要的样式模板,更多的交互性的内容则需要使用js来完成 ...
- Powered by .NET Core 进展:第5次发布尝试(Windows部署)
(图注:Windows 自带的性能监控,红色表示 CPU 占用,绿色表示 QPS) 今天中午 12:30 左右,我们进行了 .NET Core 博客站点的第5次发布(页脚会显示"Powere ...
- size命令的sysv和berkeley格式差别
size命令使用说明 size命令用于显示二进制文件的段(节)大小,其功能类似于readelf -S,详细的说明如下: 用法:size [选项] [文件] 显示二进制文件中节的大小 没有给出输入文件, ...