热搜
您的位置:首页 >> 历史

Python运维项目中用到的redis经

2019年05月14日 栏目:历史

先感叹下,学东西一定要活学活用! 我用redis也有几年的历史了,今个才想到把集合可以当python list用。 近做了几个项目都掺杂

先感叹下,学东西一定要活学活用! 我用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

redis127.0.0.1:6379

redis127.0.0.1:6379

redis127.0.0.1:6379saddxiaoruiaaa

(integer)1

redis127.0.0.1:6379saddxiaoruibbb

(integer)1

redis127.0.0.1:6379saddxiaoruiccc

(integer)1

redis127.0.0.1:6379

redis127.0.0.1:6379SMEMBERSxiaorui

1)aaa

2)ccc

3)bbb

redis127.0.0.1:6379

redis127.0.0.1:6379

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

1

2

3

4

5

redis127.0.0.1:6379saddxiaoruifuck_shencan

(integer)1

redis127.0.0.1:6379saddxiaoruifuck_shencan

(integer)0

redis127.0.0.1:6379

查看集合的大小

1

2

3

redis127.0.0.1:6379SCARDxiaorui

(integer)3

redis127.0.0.1:6379

删除

1

2

3

4

5

6

redis127.0.0.1:6379SREMxiaoruiaaa

(integer)1

redis127.0.0.1:6379SMEMBERSxiaorui

1)ccc

2)bbb

redis127.0.0.1:6379

两个集合的交集之处

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

redis127.0.0.1:6379SADDkey1a

(integer)1

redis127.0.0.1:6379SADDkey1b

(integer)1

redis127.0.0.1:6379SADDkey1c

(integer)1

redis127.0.0.1:6379SADDkey2c

(integer)1

redis127.0.0.1:6379SADDkey2d

(integer)1

redis127.0.0.1:6379SADDkey2e

(integer)1

redis127.0.0.1:6379SINTERkey1key2

1)c

redis127.0.0.1:6379

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

1

2

3

4

5

6

7

8

9

10

11

12

13

redis127.0.0.1:6379saddmysetone

(integer)1

redis127.0.0.1:6379saddmysettwo

(integer)1

redis127.0.0.1:6379saddmysetthree

(integer)1

redis127.0.0.1:6379SPOPmyset

one

redis127.0.0.1:6379SMEMBERSmyset

1)three

2)two

redis127.0.0.1:6379

原文:

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

原文:《Python运维项目中用到的redis经验及数据类型》

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

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

pool = nnectionPool(host='localhost', port=6379, db=0)

r = dis(connection_pool=pool)

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

原文:《Python运维项目中用到的redis经验及数据类型》

对于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

nkey

tch_all()

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

importos

importsys

importfcntl

importgevent

cketimportwait_read

fromredisimportRedis

PID=tpid()

red=Redis('localhost')

defecho_stdin():

#makestdinnon-blocking

ntl(din,fcntl.F_SETFL,os.O_NONBLOCK)

blish('echo',[%i]joined%(PID,))

whileTrue:

wait_read(leno())

l=adline().strip()

s=[%i]%s%(PID,l)

#savetolog

ush('echo_log',s)

#publishmessage

blish('echo',s)

ifl=='quit':

break

defhandler():

pubsub=bsub()

#firstsubscribe,thenprintlog(noraceconditionthisway)

bscribe('echo')

#printlog

ange('echo_log',0,-1):

print'.',line

#printchannel

sten():

print'',msg['data']

awn(handler)

awn(echo_stdin).join()

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

1

2

3

4

5

6

importgeventredis

redis_client=nnect('127.0.0.1',6379)

redis_t('foo','bar')

'OK'

formsginredis_nitor():

printmsg

华豫之门报名热线电话
热压海绵
癣大夫乳膏