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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

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


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


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



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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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集合是不能写重复的内容的

1
2
3
4
5
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>


查看集合的大小

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


删除

1
2
3
4
5
6
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>


两个集合的交集之处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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集合当成队列使用。 


1
2
3
4
5
6
7
8
9
10
11
12
13
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猴子就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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后,批量的读写没什么突出的增长。

1
2
3
4
5
6
>>>  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




 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1435539,如需转载请自行联系原作者


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
57 4
|
17天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
93 26
|
25天前
|
Python
Python 中一些常见的数据类型
Python 中一些常见的数据类型
77 8
|
1月前
|
Python
Python中不同数据类型之间如何进行转换?
Python中不同数据类型之间如何进行转换?
27 6
|
1月前
|
存储 开发者 Python
Python 的数据类型
Python 的数据类型
39 6
|
1月前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
41 4
|
1月前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
92 3
|
1月前
|
缓存 运维 NoSQL
python常见运维脚本_Python运维常用脚本
python常见运维脚本_Python运维常用脚本
32 3
|
2月前
|
Python
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
本篇将详细介绍Python中的常见数据类型转换方法以及 `NoneType` 的概念。包括如何在整数、浮点数、字符串等不同数据类型之间进行转换,并展示如何使用 `None` 进行初始赋值和处理特殊情况。通过本篇的学习,用户将深入理解如何处理不同类型的数据,并能够在代码中灵活使用 `None` 处理未赋值状态。
69 2
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
|
1月前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##

热门文章

最新文章