Python操作Redis以及常见的应用场景

目录:

  1. Python Redis模块安装
  2. Python 操作Redis
  3. 常见的redis应用场景

Python Redis模块安装

两种方式:

  1. pip安装
pip3 install redis
  1. 源码安装
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

Python 操作Redis

实例:

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操作

管道(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应用场景

  1. 统计页面点击数
    论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用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'
    

    类似的场景:当页面登录发送验证码的时候,为了控制用户发送的次数,也可以采用这种方法进行频率控制

  2. 如何保存一个对象数据
    由于非关系数据库没有固定的列,因此如何去存储一个数据对象,我们可以使用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']
    
  3. 社交圈子数据
    在社交网站中,每一个圈子(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'])
    
  4. 反垃圾系统
    获取某段时间所有数据排重值,这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重

  5. 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
    
  6. Session共享存入redis
    我们可以把Session存入redis,来进行共享

    存储配置:

    • 安装模块:
      pip3 install django-redis-sessions==0.5.6
      
    • 修改setting的配置,增加session配置
      settings.py
      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配置:
      url(r'^set_session$', views.set_session),           # 保存session数据
      url(r'^get_session$', views.get_session),           # 获取session数据
      
    • views代码:
      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)
      
    • 通过redis-cli的客户端查看:
      127.0.0.1:6379> select 4
      OK
      127.0.0.1:6379[4]> keys *
      1) "session:0bjyuegx0i5ivyuzpb8ezgo0b35u2z4v"
      

回到目录

你可能感兴趣的:(python,redis)