目录:
两种方式:
pip3 install redis
wget https://pypi.python.org/packages/source/r/redis/redis-2.9.1.tar.gz
tar xvzf redis-2.9.1.tar.gz
cd redis-2.9.1
python setup.py install
实例:
In [1]: import redis
In [2]: r = redis.Redis(host='localhost', port=6379, password='', db=0) # 设置redis数据库实例
In [3]: r.set('name','jeff') # 设置键值
Out[3]: True
In [4]: r.get('name') # 获取键的值
Out[4]: b'jeff'
In [5]: r.keys() # 获取数据库中所有的键
Out[5]: [b'name', b'stu1']
In [6]: r.dbsize() # 当前数据库中有多少条数据
Out[6]: 2
In [7]: r.delete('name') # 删除键
Out[7]: 1
In [8]: r.keys()
Out[8]: [b'stu1']
In [9]: r.save() # 持久化,将数据写回磁盘。保存时阻塞
Out[9]: True
In [10]: r.get('name')
In [11]: r.flushall() #清空r中的所有数据
Out[11]: True
管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能
>>> p = r.pipeline() # 创建一个管道
>>> p.set('hello','redis')
>>> p.sadd('faz','baz')
>>> p.incr('num')
>>> p.execute()
[True, 1, 1]
>>> r.get('hello')
'redis'
# 管道的命令可以写在一起,如:
>>> p.set('hello','redis').sadd('faz','baz').incr('num').execute()
回到目录
统计页面点击数
论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了
当redis服务器启动时,可以从关系数据库读入点击数,假设1237这个页面被访问了34634次,因此我们使用如下的方法初始化:
>>> r.set("visit:1237:totals",34634)
True
每当有一个页面点击,则使用INCR增加点击数即可
>>> r.incr("visit:1237:totals")
34635
>>> r.incr("visit:1237:totals")
34636
页面载入的时候则可直接获取这个值
>>> r.get ("visit:1237:totals")
'34636'
类似的场景:当页面登录发送验证码的时候,为了控制用户发送的次数,也可以采用这种方法进行频率控制
如何保存一个对象数据
由于非关系数据库没有固定的列,因此如何去存储一个数据对象,我们可以使用hash类型保存多样化的对象
比如说,我们想要保存用户的年龄,email,手机号等内容
>>> r.hset('users:jdoe', 'name', "John Doe")
1L
>>> r.hset('users:jdoe', 'email', '[email protected]')
1L
>>> r.hset('users:jdoe', 'phone', '1555313940')
1L
>>> r.hincrby('users:jdoe', 'visits', 1)
1L
>>> r.hgetall('users:jdoe')
{'phone': '1555313940', 'name': 'John Doe', 'visits': '1', 'email': '[email protected]'}
>>> r.hkeys('users:jdoe')
['name', 'email', 'phone', 'visits']
社交圈子数据
在社交网站中,每一个圈子(circle)都有自己的用户群。通过圈子可以找到有共同特征(比如某一体育活动、游戏、电影等爱好者)的人。当一个用户加入一个或几个圈子后,系统可以向这个用户推荐圈子中的人
我们定义这样两个圈子,并加入一些圈子成员
>>> r.sadd('circle:game:lol','user:debugo')
1
>>> r.sadd('circle:game:lol','user:leo')
1
>>> r.sadd('circle:game:lol','user:Guo')
1
>>> r.sadd('circle:soccer:InterMilan','user:Guo')
1
>>> r.sadd('circle:soccer:InterMilan','user:Levis')
1
>>> r.sadd('circle:soccer:InterMilan','user:leo')
1
获得某一圈子的成员
>>> r.smembers('circle:game:lol')
set(['user:Guo', 'user:debugo', 'user:leo'])
使用集合运算来得到几个圈子的共同成员
>>> r.sinter('circle:game:lol', 'circle:soccer:InterMilan')
set(['user:Guo', 'user:leo'])
>>> r.sunion('circle:game:lol', 'circle:soccer:InterMilan')
set(['user:Levis', 'user:Guo', 'user:debugo', 'user:leo'])
反垃圾系统
获取某段时间所有数据排重值,这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重
Pub/Sub构建实时消息系统
Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。
使用办法:
订阅端: Subscribe 频道名称
发布端: publish 频道名称 发布内容
客户端例子:
redis 127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "good good study"
1) "message"
2) "news"
3) "day day up"
服务端例子:
redis 127.0.0.1:6379> publish news 'good good study'
(integer) 1
redis 127.0.0.1:6379> publish news 'day day up'
(integer) 1
Session共享存入redis
我们可以把Session存入redis,来进行共享
存储配置:
pip3 install django-redis-sessions==0.5.6
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 4
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
url(r'^set_session$', views.set_session), # 保存session数据
url(r'^get_session$', views.get_session), # 获取session数据
def set_session(request):
""""保存session数据"""
request.session['username'] = 'Django'
request.session['verify_code'] = '123456'
return HttpResponse('保存session数据成功')
def get_session(request):
"""获取session数据"""
username = request.session.get('username')
verify_code = request.session.get('verify_code')
text = 'username=%s, verify_code=%s' % (username, verify_code)
return HttpResponse(text)
127.0.0.1:6379> select 4
OK
127.0.0.1:6379[4]> keys *
1) "session:0bjyuegx0i5ivyuzpb8ezgo0b35u2z4v"
回到目录