首页 > 代码库 > Python 学习笔记 - Redis

Python 学习笔记 - Redis

Redis 和Memcached类似 也是一个开源的内存存储系统,存储格式也是通过键值对的方式。不过和memcached比起来,memcached的value只支持字符串,而redis支持字符串,列表,集合,hash等等;这些数据类型都支持push/pop,add/remove等操作,而且都是原子性的,也就是类似数据库的事物特征一样,所有的操作要么全部完成,要么全部失败,然后回滚到之前的状态。


现在来看看他的简单使用和发布订阅的功能。


服务器安装

[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

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

然后别忘记打开防火墙端口

[root@sydnagios ~]# firewall-cmd --add-port=6379/tcp --permanent
success
[root@sydnagios ~]# systemctl restart firewalld



接下来用同一个目录下的客户端程序测试一下,成功设置和获取数据

[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模块

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


第一个例子:

import redis
r=redis.Redis(host=‘sydnagios‘,port=6379)
r.set(‘name‘,‘John‘)
print(r.get(‘name‘))
-------
b‘John‘

除了直接连接 也可以通过连接池连接,默认每个redis实例有自己的连接池,通过这种方式,可以多个实例共享一个连接池

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


批量设置,批量获取

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‘]


自增

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‘


删除

import  redis
r=redis.Redis(host=‘sydnagios‘,port=6379)
r.delete(‘set1‘)

Hash批量操作

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

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操作,集合的元素不可以重复

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在执行一次操作请求的时候会自动连接,然后断开;我们可以通过管道,一次性传入多条操作然后执行。

# !/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

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(订阅者)

import s3
obj = s3.RedisHelper()
data = obj.subscribe(‘fm111.7‘)
print(data.parse_response())


s5.py(发布者)

import s3
obj = s3.RedisHelper()
obj.publish(‘alex db‘, ‘fm111.7‘)


先执行订阅者的代码,进入等待状态,然后执行发布者的程序,对指定的channel发送数据‘alex db’,订阅者一方会收到以下数据

[b‘message‘, b‘fm111.7‘, b‘alex db‘]


本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1870139

Python 学习笔记 - Redis