先感叹下,学东西一定要活学活用!   我用redis也有几年的历史了,今个才想到把集合可以当python list用。  最近做了几个项目都掺杂了redis, 遇到了一些个问题和开发中提高性能的方法,这都分享出来,共同学习。

下面先简单讲讲Redis集合的数据类型。

Sets 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。  上面说的是新浪微博的应用。

sadd,创建一个集合,并添加数据。

[root@66 ~]# redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> sadd xiaorui aaa
(integer) 1
redis 127.0.0.1:6379> sadd xiaorui bbb
(integer) 1
redis 127.0.0.1:6379> sadd xiaorui ccc
(integer) 1
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> SMEMBERS xiaorui
1) "aaa"
2) "ccc"
3) "bbb"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

set集合是不能写重复的内容的

redis 127.0.0.1:6379> sadd xiaorui fuck_shencan
(integer) 1
redis 127.0.0.1:6379> sadd xiaorui fuck_shencan
(integer) 0
redis 127.0.0.1:6379>

查看集合的大小

redis 127.0.0.1:6379> SCARD xiaorui
(integer) 3
redis 127.0.0.1:6379>

删除

redis 127.0.0.1:6379> SREM xiaorui aaa
(integer) 1
redis 127.0.0.1:6379> SMEMBERS xiaorui
1) "ccc"
2) "bbb"
redis 127.0.0.1:6379>

两个集合的交集之处

redis 127.0.0.1:6379> SADD key1 a
(integer) 1
redis 127.0.0.1:6379> SADD key1 b
(integer) 1
redis 127.0.0.1:6379> SADD key1 c
(integer) 1
redis 127.0.0.1:6379> SADD key2 c
(integer) 1
redis 127.0.0.1:6379> SADD key2 d
(integer) 1
redis 127.0.0.1:6379> SADD key2 e
(integer) 1
redis 127.0.0.1:6379> SINTER key1 key2
1) "c"
redis 127.0.0.1:6379>

可以把集合当成redis list队列用,需要注意的是set集合的成员模式是不能有重复的值的。如果你的值不重复,你又蛋疼,还真的可以把set集合当成队列使用。

redis 127.0.0.1:6379> sadd myset one
(integer) 1
redis 127.0.0.1:6379> sadd myset two
(integer) 1
redis 127.0.0.1:6379> sadd myset three
(integer) 1
redis 127.0.0.1:6379> SPOP myset
"one"
redis 127.0.0.1:6379> SMEMBERS myset
1) "three"
2) "two"
redis 127.0.0.1:6379>
原文:

前两天和朋友说,我那监控平台的内存吃的厉害,他一下子蹦出一句,redis吃内存肯定很大了。。。 nima,哥只是用他的大队列。这里说下,redis做队列的强度。一把来说100w条的队列数据,占用73M 内存左 右。200w条数据内存在154M内存左右。

原文:http://rfyiamcool.blog.51cto.com/1030776/1435539

redis的堵塞取任务,最好少用,超过5个线程去brpop的话,会把redis的cpu使用率顶到80%左右,而且严重会影响别的进程的访问,如果确定任务不是每时每刻都有的情况下,最好在你的程序控制下他的访问频次和时间的间隔。

python处理redis的时候,最好要用pool,速度和资源明显的节省。

>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

>>> r = redis.Redis(connection_pool=pool)

新版的redis是支持管道的,pipline !   有朋友不太理解,这里的管道有什么好处。 pyhton 虽然连接redis的时候用了连接池,但是这也只是连接方面做了keepalive而已,但是每次的命令推送,他还是一次命令一个交互的。 用了pipline管道堵塞后,他会把所有的命令合成一个管道符推送到redis服务端。这样的话就省事了很多。  这个特别适用于并发大的时候。

原文:http://rfyiamcool.blog.51cto.com/1030776/1435539

对于redis的pub sub通信性能的问题,可以用gevent来搞定。直接导入gevent猴子就可以了。

import gevent.monkey
gevent.monkey.patch_all()
#http://rfyiamcool.blog.51cto.com/1030776/1435539
import os
import sys
import fcntl
import gevent
from gevent.socket import wait_readfrom redis import RedisPID = os.getpid()red = Redis('localhost')def echo_stdin():# make stdin non-blockingfcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)red.publish('echo', "[%i] joined" % (PID,))while True:wait_read(sys.stdin.fileno())l = sys.stdin.readline().strip()s = "[%i] %s" % (PID, l)# save to logred.rpush('echo_log', s)# publish messagered.publish('echo', s)if l == 'quit':breakdef handler():pubsub = red.pubsub()# first subscribe, then print log (no race condition this way)pubsub.subscribe('echo')# print logfor line in red.lrange('echo_log', 0, -1):print '.', line# print channelfor msg in pubsub.listen():print '>', msg['data']gevent.spawn(handler)
gevent.spawn(echo_stdin).join()

当然对于普通的set get sadd hset 也是可以配合redis来使用的。但是,没啥优势,因为redis只启用了一个进程针对数据的读写,咱们从程序中复用的那几个连接,最后取数据,还是需要调用那进程,你还不如让他老老实实的干活,别搞个多线程,让他白白折腾。 我这边做了压力测试,python2.7用个gevent后,批量的读写没什么突出的增长。

>>> import geventredis
>>> redis_client = geventredis.connect('127.0.0.1', 6379)
>>> redis_client.set('foo', 'bar')
'OK'
>>> for msg in redis_client.monitor():print msg

转载于:https://blog.51cto.com/rfyiamcool/1435539

Python运维项目中用到的redis经验及数据类型相关推荐

  1. Python+Django+Ansible Playbook自动化运维项目实战(二)

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  2. Python+Django+Ansible Playbook自动化运维项目实战:资产管理

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  3. python实现自动化运维项目_Python自动化运维项目开发最佳实战

    下载地址:五号服务器---VIP资料下载七区\VIP专题教程二区 游客,如果您要查看本帖隐藏内容请回复 Python 自动化运维项目开发最佳实战 这个远比什么老男孩的python好的多 2017-1- ...

  4. python运维看什么书_学习Python在Linux运维上的应用应该看哪些书 什么样的学习路线...

    匿名用户 1级 2017-08-02 回答 Python岗位有哪些呢?主要的岗位有这些: Python全栈开发工程师(10k-20K) Python运维开发工程师(15k-20K) Python高级开 ...

  5. 阅后即焚,Python 运维开发99速成

    2019独角兽企业重金招聘Python工程师标准>>> -欢迎大家订阅微信公众号:Python从程序猿到程序员 导读 本文篇幅较长,请收藏并耐心阅读 首先请读者原谅这个文章标题有些唬 ...

  6. Python运维开发基础01-语法基础【转】

    开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...

  7. 专科学python真的不好_专科生转行做python运维靠谱吗?

    看了下问题,专科做运维,的确在找工作的时候没有优势,but,这并不代表运维行业对学历要求高,而是你找别的工作,专科也没有什么优势. 知乎水平动辄985,专科就显得那么的微不足道. 但没有竞争力不太表找 ...

  8. python运维是做什么的_Python运维工程师主要干什么?

    Python运维工程师主要干什么? 更新时间:2020年05月09日 作者:spoto 广义运维工程师的职责介绍 Python运维工程师主要干什么?其实无论是做什么运维,运维工程师最基本的职责都是负责 ...

  9. python职能-python运维工程师主要干什么

    很多人可能并没有听说过python运维工程师,只知道运维工程师或者是linux运维工程师这两个词.实际上python运维工程师这个岗位也是最近几年随云计算计算发展和广泛普及而火的,所以大家不知道pyt ...

最新文章

  1. 1.内存优化(一)内存泄漏
  2. memcached常用状态查询命令及结果解释
  3. 成功解决Python中出现的TypeError: object of type 'zip' has no len()
  4. idea redis 插件_Redis客户端RDM收费后,还有哪些开源的替代品呢?
  5. Linux - 操作系统查找文件的过程以及硬链接与软链接的区别
  6. flex 换主轴后子元素占满_css flex justify-content属性,子元素在主轴上的对齐方式。...
  7. Android Studio下载及安装3.0版本
  8. const char * array[]和char * const array[]
  9. bzoj 1637: [Usaco2007 Mar]Balanced Lineup
  10. SPSS22.0简体中文破解版(32位/64位)使用方法
  11. 蔡学镛 java,Java该何去何从思考
  12. 拼多多商品详情百亿补贴数据采集接口代码展示
  13. ubuntu下解决微信不能发送图片的问题
  14. Lvm linux磁盘分区管理(多个分区合并成一个)
  15. 【ANSYS】Notepad++:一款好用的APDL语法编辑器
  16. 【Spark】介绍 快速入门
  17. 嵌入式系统概述2-嵌入式系统组成和应用
  18. 使用flask-avatars处理用户头像
  19. In aggregated query without GROUP BY
  20. FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持

热门文章

  1. Windows Phone实用开发技巧(32):照片角度处理
  2. iOS环信聊天界面中点击头像和消息的几种状态
  3. Ubuntu16.04.1 安装Nginx
  4. ubuntu16.04 ROS安转及RVIZ启动
  5. pycharm的安装配置和简单使用
  6. YII显示sql进行调试
  7. [Python]小百合十大爬虫
  8. iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
  9. 老谢oracle视频笔记_day02
  10. CTO(首席技术官)