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. MySQL5.7运行CPU达百分之400处理方案

    用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因 ...

  2. win10教育版激活错误:在运行 Microsoft Windows 非核心版本的计算机上,运行"slui.exe ...”

    折腾了一天,最终轻松解决,先启用Software Protection服务,在激活(密钥或者工具都行). PS:但是这样还是无法解决Software Protection自动停止的问题,这个可以参考网 ...

  3. Spring 源码学习(一)-容器的基础结构

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料 展示的代码摘取了一些核心方法,去掉一些默认设置和日志输出,还有大多数错误异常也去掉了,小伙伴想看详细代码 ...

  4. python虚拟环境完美部署

    一.前言 预处理 建议仔细看完本文章之后在进行操作,避免失误,本环境可以用于生产环境,有利于生产环境python之间的环境隔离,互相不会产生环境冲突:pyenv和pyenv-virtualenv可以完 ...

  5. Hadoop学习(7)-hive的安装和命令行使用和java操作

    Hive的用处,就是把hdfs里的文件建立映射转化成数据库的表 但hive里的sql语句都是转化成了mapruduce来对hdfs里的数据进行处理 ,并不是真正的在数据库里进行了操作. 而那些表的定义 ...

  6. Unbutu在VMWare中挂载共享文件夹

    第一,安装VMTools,步骤自行搜索,安装成功后重启虚拟机. 第二,重启后,在虚拟机管理页面设置共享目录,选择总是启用,开启虚拟机. 第三,在终端进入挂载目录cd /mnt/hgfs/,通过命令su ...

  7. 洛谷 P1357 花园

    题意简述 一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 题解思路 由于\(m<=5\)所以很显然状压 但由于\(n<=10^{15}\).可以考虑用矩阵加 ...

  8. .net软件开发脚本规范-SQL脚本标准

    一. SQL脚本标准 各文件夹存放的脚本说明 存储过程:除“基础_”开头的所有存储过程,包含新增.修改.删除.列表.提交.审核. 基础数据:“基础_”开头的存储过程,用于下拉列表的数据加载公共方法. ...

  9. QMS 的趨勢概述

    自泰勒Taylor提出的科学管理被奉行后,制造业的分工已然成形,而产品不再是由工匠单独负责完成.为确保产品的质量,产品在完工后的检验为确保瑕疵品不外流出给客户的必要关卡.然而当产品依靠检验结果并无法减 ...

  10. json操作与使用 小白

    json使用广可以和很多语言进行互换,把json序列化成字符串,可以反序列化回去 dumps(传入的类型,'ensure_ascii=False') loads网络传输 dump load文件写读 p ...