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的更多相关文章

  1. redis实现队列queue

    参考:<Redis入门指南>第4章进阶 http://book.51cto.com/art/201305/395461.htm 4.4.2 使用Redis实现任务队列 说到队列很自然就能想 ...

  2. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  3. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  4. Redis使用总结(3):实现简单的消息队列

    参考Redis实现简单消息队列 Redis提供了两种方式来作消息队列.一个是使用生产者消费模式模式,另外一个方法就是发布订阅者模式.前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费 ...

  5. windows下安装redis和php的redis扩展

    1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  6. php+redis 简易的实现文章发布系统(用户投票系统)

    /** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...

  7. Redis实现简单消息队列

    http://www.jianshu.com/p/9c04890615ba 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器 ...

  8. 《Redis入门指南》第2版 读书笔记

    读第二遍了,感觉和几年前读时的收获不一样了.送上门来当树洞的独自承担一切 Redis以简洁为美Redis通信协议是Redis客户端与Redis之间交流的语言,通信协议规定了命令和返回值的格式.Redi ...

  9. 如何搭建高可用redis架构?

    如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...

随机推荐

  1. WebGL简易教程(一):第一个简单示例

    目录 1. 概述 2. 示例:绘制一个点 1) HelloPoint1.html 2) HelloPoint1.js (1) 准备工作 (2) 着色器 (3) 顶点着色器 (4) 片元着色器 (5) ...

  2. [ PyQt入门教程 ] PyQt5基本控件使用:单选按钮、复选框、下拉框

    本文主要介绍PyQt5界面最基本使用的单选按钮.复选框.下拉框三种控件的使用方法进行介绍. 1.RadioButton单选按钮/CheckBox复选框.需要知道如何判断单选按钮是否被选中. 2.Com ...

  3. Spring注解浅入浅出——不吹牛逼不装逼

    Spring注解浅入浅出——不吹牛逼不装逼 前情提要 上文书咱们说了<Spring浅入浅出>,对Spring的核心思想看过上篇的朋友应该已经掌握了,此篇用上篇铺垫,引入注解,继续深入学习. ...

  4. Oracle jdbc 插入 clob blob

    Oracle 使用 clob 与 blob 插入一些比较庞大的文本或者文件,JDBC 插入时 也比较简单 表结构 CREATE TABLE test_info ( user_id int NOT NU ...

  5. 【转】C++文件读写详解(ofstream,ifstream,fstream)

    转:http://blog.csdn.net/kingstar158/article/details/6859379 摘要:具体用法,上面链接中,文章写的很详细,讲解ofstream,ifstream ...

  6. Selenium+Java - 结合sikuliX操作Flash网页

    前言 前天被一个Flash的轮播图,给玩坏了,无法操作,后来请教了下crazy总拿到思路,今天实践了下,果然可以了,非常感谢! 模拟场景 打开百度地图 切换城市到北京 使用测距工具 测量 奥林匹克森林 ...

  7. 反向传播 Backpropagation

    前向计算:没啥好说的,一层一层套着算就完事了 y = f( ... f( Wlayer2T f( Wlayer1Tx ) ) ) 反向求导:链式法则 单独看一个神经元的计算,z (就是logit)对 ...

  8. 【CodeForces - 1200C】Round Corridor (数论gcd)

    Round Corridor  Descriptions Amugae位于一个非常大的圆形走廊中.走廊由两个区域组成.内部区域等于nñ扇区,外部区域等于m米部门.在相同区域(内部或外部)的每对扇区之间 ...

  9. cmd命令行带参启动程序

    cmd命令行带参启动程序 有一些程序不支持被直接启动,编写代码时,我们可以通过Process类来启动某个进程(某个软件),在不用代码调从而启动某个软件时,windows系统下,通常我们会用到cmd命令 ...

  10. Spring AOP JDK动态代理与CGLib动态代理区别

    静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分 ...