Python 学习笔记 - Redis

时间:2023-01-01 22:10:18

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-server24344:C 07 Nov 10:40:21.763 # Warning: no config file specified, using the default confif24344: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.624344: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 --permanentsuccess[root@sydnagios ~]# systemctl restart firewalld



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

[root@sydnagios redis-3.0.6]# src/redis-cli127.0.0.1:6379> set foo barOK127.0.0.1:6379> get foo"bar"127.0.0.1:6379>


现在看看Python下如何调用。


首先安装redis模块

C:\WINDOWS\system32>pip install redisCollecting redis  Using cached redis-2.10.5-py2.py3-none-any.whlInstalling collected packages: redisSuccessfully installed redis-2.10.5


第一个例子:

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

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

import redispool=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 redispool=redis.ConnectionPool(host='sydnagios',port=6379)r=redis.Redis(connection_pool=pool)r.incrby('age',10)print(r.get('age'))-------b'24'


删除

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

Hash批量操作

import redispool=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  redisr=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'))------2b'pear'1


set操作,集合的元素不可以重复

import  redisr=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 redispool = 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 redisclass 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 s3obj = s3.RedisHelper()data = obj.subscribe('fm111.7')print(data.parse_response())


s5.py(发布者)

import s3obj = 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