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

本文涉及的产品
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,如需转载请自行联系原作者


相关文章
|
4月前
|
存储 NoSQL 定位技术
Redis数据类型面试给分情况
Redis常见数据类型包括:string、hash、list、set、zset(有序集合)。此外还包含高级结构如bitmap、hyperloglog、geo。不同场景可选用合适类型,如库存用string,对象存hash,列表用list,去重场景用set,排行用zset,签到用bitmap,统计访问量用hyperloglog,地理位置用geo。
126 5
|
4月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
555 2
|
4月前
|
人工智能 Python
python基本数据类型简介
本文简要介绍了Python的基本数据类型,包括整型、浮点型、字符串、列表、字典和布尔类型,帮助读者对Python数据类型有初步了解。
177 0
|
4月前
|
存储 安全 开发者
Python中的数据类型详解
Python是一种动态类型编程语言,具备丰富的数据类型,包括数值类型、序列类型、映射类型和集合类型等。这些类型为高效编程提供了强大支持。
161 0
|
6月前
|
Python
Python技术解析:了解数字类型及数据类型转换的方法。
在Python的世界里,数字并不只是简单的数学符号,他们更多的是一种生动有趣的语言,用来表达我们的思维和创意。希望你从这个小小的讲解中学到了有趣的内容,用Python的魔法揭示数字的奥秘。
165 26
|
6月前
|
数据采集 存储 NoSQL
分布式爬虫去重:Python + Redis实现高效URL去重
分布式爬虫去重:Python + Redis实现高效URL去重
|
7月前
|
Python
探索Python的各式数据类型
以上就是Python数据类型的一次简单而有趣的游览。和她继续接触,你会发现她还有更多有趣的面象,例如集合里的冰冻集合(Frozenset),序列里的字符串(String)和字节序列(Bytes)等等。希望这次游览能对你有所启发,让你更好地理解和使用Python。
98 21
|
7月前
|
存储 程序员 Python
Python 变量和简单数据类型
本文介绍了 Python 编程的基础知识,从创建第一个 Python 文件 `hello_world.py` 开始,讲解了 Python 文件的运行机制及解释器的作用。接着深入探讨了变量的定义、命名规则和使用方法,并通过示例说明如何修改变量值。同时,文章详细解析了字符串的操作,包括大小写转换、变量插入及空白字符处理等技巧。此外,还涵盖了数字运算(整数与浮点数)、常量定义以及注释的使用。最后引用了《Python 之禅》,强调代码设计的美学原则和哲学思想。适合初学者快速掌握 Python 基础语法和编程理念。
150 5
|
11月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
439 85
|
12月前
|
Python
Python中不同数据类型之间如何进行转换?
Python中不同数据类型之间如何进行转换?
373 62

推荐镜像

更多
下一篇
oss云网关配置