Redis 和Memcached类似 也是一个开源的内存存储系统,存储格式也是通过键值对的方式。不过和memcached比起来,memcached的value只支持字符串,而redis支持字符串,列表,集合,hash等等;这些数据类型都支持push/pop,add/remove等操作,而且都是原子性的,也就是类似数据库的事物特征一样,所有的操作要么全部完成,要么全部失败,然后回滚到之前的状态。
现在来看看他的简单使用和发布订阅的功能。
服务器安装
1
2
3
4
|
[root@sydnagios ~]
# wget http://download.redis.io/releases/redis-3.0.6.tar.gz
[root@sydnagios ~]
# tar xzf redis-3.0.6.tar.gz
[root@sydnagios ~]
# cd redis-3.0.6/
[root@sydnagios redis-3.0.6]
# make
|
装好的界面如下,使用默认的配置文件,他的访问端口是6379
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
|
make[
1
]: Leaving directory `
/
root
/
redis
-
3.0
.
6
/
src'
[root@sydnagios redis
-
3.0
.
6
]
# src/redis-server
24344
:C
07
Nov
10
:
40
:
21.763
# Warning: no config file specified, using the default confif
24344
:M
07
Nov
10
:
40
:
21.764
*
Increased maximum number of
open
files to
10032
(it was
or
.
_._
_.
-
``__ ''
-
._
_.
-
`` `. `_. ''
-
._ Redis
3.0
.
6
(
00000000
/
0
)
64
bit
.
-
`` .
-
```. ```\
/
_.,_ ''
-
._
( ' , .
-
` | `, ) Running
in
standalone mode
|`
-
._`
-
...
-
` __...
-
.``
-
._|
'` _.-'
| Port:
6379
| `
-
._ `._
/
_.
-
' | PID:
24344
`
-
._ `
-
._ `
-
.
/
_.
-
' _.-'
|`
-
._`
-
._ `
-
.__.
-
' _.-'
_.
-
'|
| `
-
._`
-
._ _.
-
'_.-'
| http:
/
/
redis.io
`
-
._ `
-
._`
-
.__.
-
'_.-'
_.
-
'
|`
-
._`
-
._ `
-
.__.
-
' _.-'
_.
-
'|
| `
-
._`
-
._ _.
-
'_.-'
|
`
-
._ `
-
._`
-
.__.
-
'_.-'
_.
-
'
`
-
._ `
-
.__.
-
' _.-'
`
-
._ _.
-
'
`
-
.__.
-
'
24344
:M
07
Nov
10
:
40
:
21.766
# WARNING: The TCP backlog setting of 511 cannot be enforced.
24344
:M
07
Nov
10
:
40
:
21.766
# Server started, Redis version 3.0.6
24344
:M
07
Nov
10
:
40
:
21.766
# WARNING overcommit_memory is set to 0! Background save may.
24344
:M
07
Nov
10
:
40
:
21.766
# WARNING you have Transparent Huge Pages (THP) support enab.
24344
:M
07
Nov
10
:
40
:
21.766
*
The server
is
now ready to accept connections on port
6379
|
然后别忘记打开防火墙端口
1
2
3
|
[root@sydnagios ~]
# firewall-cmd --add-port=6379/tcp --permanent
success
[root@sydnagios ~]
# systemctl restart firewalld
|
接下来用同一个目录下的客户端程序测试一下,成功设置和获取数据
1
2
3
4
5
6
|
[root@sydnagios redis
-
3.0
.
6
]
# src/redis-cli
127.0
.
0.1
:
6379
>
set
foo bar
OK
127.0
.
0.1
:
6379
> get foo
"bar"
127.0
.
0.1
:
6379
>
|
现在看看Python下如何调用。
首先安装redis模块
1
2
3
4
5
|
C:\WINDOWS\system32>pip
install
redis
Collecting redis
Using cached redis-2.10.5-py2.py3-none-any.whl
Installing collected packages: redis
Successfully installed redis-2.10.5
|
第一个例子:
1
2
3
4
5
6
|
import
redis
r
=
redis.Redis(host
=
'sydnagios'
,port
=
6379
)
r.
set
(
'name'
,
'John'
)
print
(r.get(
'name'
))
-
-
-
-
-
-
-
b
'John'
|
除了直接连接 也可以通过连接池连接,默认每个redis实例有自己的连接池,通过这种方式,可以多个实例共享一个连接池
1
2
3
4
|
import
redis
pool
=
redis.ConnectionPool(host
=
'sydnagios'
,port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
print
(r.get(
'name'
))
|
redis和memcached比起来,因为他支持多种数据结构,因此对应的操作函数也很多,几乎是memcached的10倍
下面是一些常见的,具体的函数使用可以参考 http://www.cnblogs.com/wupeiqi/articles/5132791.html
批量设置,批量获取
1
2
3
4
5
6
|
pool
=
redis.ConnectionPool(host
=
'sydnagios'
,port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
r.mset(name
=
'kevin'
,age
=
14
)
print
(r.mget(
'name'
,
'age'
))
-
-
-
-
-
-
-
-
-
-
-
[b
'kevin'
, b
'14'
]
|
自增
1
2
3
4
5
6
7
|
import
redis
pool
=
redis.ConnectionPool(host
=
'sydnagios'
,port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
r.incrby(
'age'
,
10
)
print
(r.get(
'age'
))
-
-
-
-
-
-
-
b
'24'
|
删除
1
2
3
|
import
redis
r
=
redis.Redis(host
=
'sydnagios'
,port
=
6379
)
r.delete(
'set1'
)
|
Hash批量操作
1
2
3
4
5
6
7
|
import
redis
pool
=
redis.ConnectionPool(host
=
'sydnagios'
,port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
r.hmset(
'computer'
,{
'Macbook'
:
20000
,
'Surface3'
:
5000
,
'iPhone7'
:
9000
})
print
(r.hmget(
'computer'
,
'Macbook'
))
-
-
-
-
-
-
-
-
[b
'20000'
]
|
list操作
1
2
3
4
5
6
7
8
9
10
11
|
import
redis
r
=
redis.Redis(host
=
'sydnagios'
,port
=
6379
)
r.lpush(
'list1'
,
'apple'
)
r.lpush(
'list1'
,
'pear'
)
print
(r.llen(
'list1'
))
print
(r.lpop(
'list1'
))
print
(r.llen(
'list1'
))
-
-
-
-
-
-
2
b
'pear'
1
|
set操作,集合的元素不可以重复
1
2
3
4
5
6
7
8
9
|
import
redis
r
=
redis.Redis(host
=
'sydnagios'
,port
=
6379
)
r.sadd(
'set1'
,
'orange'
)
r.sadd(
'set1'
,
'mango'
)
print
(r.scard(
'set1'
))
print
(r.smembers(
'set1'
))
-
-
-
-
-
-
-
-
-
2
{b
'mango'
, b
'orange'
}
|
管道
默认redis-py在执行一次操作请求的时候会自动连接,然后断开;我们可以通过管道,一次性传入多条操作然后执行。
1
2
3
4
5
6
7
8
9
10
|
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import
redis
pool
=
redis.ConnectionPool(host
=
'sydnagios'
, port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
# pipe = r.pipeline(transaction=False)
pipe
=
r.pipeline(transaction
=
True
)
r.
set
(
'name'
,
'alex'
)
r.
set
(
'age'
,
16
)
pipe.execute()
|
因为redis的函数实在太多 这里就不一一赘述了。
现在来看一个redis的使用场景,发布和订阅。
简单的说,发布者可以对一个频道发布数据,然后凡是订阅了这个频道的人都可以收到信息。
s3.py
1
2
3
4
5
6
7
8
9
10
11
12
|
import
redis
class
RedisHelper:
def
__init__(
self
):
self
.__conn
=
redis.Redis(host
=
'sydnagios'
)
def
publish(
self
, msg, chan):
self
.__conn.publish(chan, msg)
return
True
def
subscribe(
self
, chan):
pub
=
self
.__conn.pubsub()
pub.subscribe(chan)
pub.parse_response()
return
pub
|
s4.py(订阅者)
1
2
3
4
|
import
s3
obj
=
s3.RedisHelper()
data
=
obj.subscribe(
'fm111.7'
)
print
(data.parse_response())
|
s5.py(发布者)
1
2
3
|
import
s3
obj
=
s3.RedisHelper()
obj.publish(
'alex db'
,
'fm111.7'
)
|
先执行订阅者的代码,进入等待状态,然后执行发布者的程序,对指定的channel发送数据‘alex db’,订阅者一方会收到以下数据
1
|
[b
'message'
, b
'fm111.7'
, b
'alex db'
]
|