设为首页 收藏本站
查看: 1062|回复: 0

[经验分享] Python运维项目中用到的redis经验及数据类型

[复制链接]

尚未签到

发表于 2018-11-7 07:24:06 | 显示全部楼层 |阅读模式
  先感叹下,学东西一定要活学活用!   我用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_read
  

  
from redis import Redis
  

  
PID = os.getpid()
  

  
red = Redis('localhost')
  

  
def echo_stdin():
  
    # make stdin non-blocking
  
    fcntl.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 log
  
        red.rpush('echo_log', s)
  
        # publish message
  
        red.publish('echo', s)
  
        if l == 'quit':
  
            break
  

  
def handler():
  
    pubsub = red.pubsub()
  
    # first subscribe, then print log (no race condition this way)
  
    pubsub.subscribe('echo')
  
    # print log
  
    for line in red.lrange('echo_log', 0, -1):
  
        print '.', line
  
    # print channel
  
    for 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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631680-1-1.html 上篇帖子: redis主从配置及通过keepalived实现redis自动切换,redis主从实现10秒检查与恢复 下篇帖子: redis 主从配置实例、配置文件说明、及备份方式,php redis 扩展安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表