使用python对redis操作

写在前面

首先声明,这是为了学习python对redis操作而写的一个小demo,包括了这几天网站找到的一些资料,综合总结出来一些东西,最后附上我写的一个用python操作redis的一个demo:

模块安装

python提供了一个模块redis-py来使我们很方便的操作redis数据库,安装该模块也很简单,直接使用pip安装就行,命令如下:

pip install redis

安装完之后,使用import调用一下就能知道是否安装成功,在python界面下输入import redis,如果不报错,那么该模块就算安装成功了。

模块安装成功后,就可以创建redis连接了,接下来学习怎样创建redis连接:

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。 简单说,官方推荐使用StrictRedis方法。

这里不推荐使用Redis类,原因是他和咱们在redis-cli操作有些不一样,主要不一样是下面这三个方面。

(1)LREM:参数 ‘num’ 和 ‘value’ 的顺序交换了一下,cli是 lrem queueName 0 ‘string’ 。这里的0是所有的意思。 但是Redis这个类,把控制和string调换了。

(2)ZADD:实现时 score 和 value 的顺序不小心弄反了,后来有人用了,就这样了

(3)SETEX: time 和 value 的顺序反了

我们可以使用StrictRedis直接连接redis,代码如下:

#创建一个redis连接
r=redis.StrictRedis(host=‘192.168.7.25‘,port=6379,db=0)

连接池的使用

但是,对于大量redis连接来说,如果使用直接连接redis的方式的话,将会造成大量的TCP的重复连接,所以,推荐用连接池来解决这个问题,使用连接池连接上redis之后,可以从该连接池里面生成连接,调用完成之后,该链接将会返还给连接池,供其他连接请求调用,这样将减少大量redis连接的执行时间,下面介绍两个类Redis和StrictRedis的连接池的实现方式:

Redis的连接池的方法:
pool = redis.ConnectionPool(host=‘127.0.0.1‘, port=6379, db=0)
r = redis.Redis(connection_pool=pool)
StrictRedis的连接池的实现方式:
pool = redis.ConnectionPool(host=‘127.0.0.1‘, port=6379, db=0)
r = redis.StrictRedis(connection_pool=pool)
官方提供的redis连接池可以添加的参数: 
class redis.StrictRedis(host=‘localhost‘, port=6379, db=0, password=None, socket_timeout=None, connection_pool=None, charset=‘utf-8‘, errors=‘strict‘, decode_responses=False, unix_socket_path=None)
Implementation of the Redis protocol.This abstract class provides a Python interface to all Redis commands and an implementation of the Redis protocol.
Connection and Pipeline derive from this, implementing how the commands are sent and received to the Redis server

一些小demo

接下来,需要提出redis的几种数据类型了,我使用redis客户端连接redis的时候,发现redis支持五种数据类型的key,列表如下:

string:存储string,以及int或者float等数据类型的数据。

list:存储列表类型的数据

hash:存储字典类型的数据

set:存储集合类型的数据

zset:存储的也是集合类型的数据,不过数据是有序存储的(该类型目前demo里面没有加入。。。)

好了,了解了redis支持的数据类型之后,就可以写一些小demo了,下面是一些小demo:

#创建一个string类型的key并放入value
r.set("abc",34634)
#创建一个hash
r.hset(‘abc:def‘, ‘name‘, "abcde")
#获取一个hash的所有值
print r.hgetall(‘abc:def‘)
#获取一个hash的所有key
print r.hkeys(‘abc:def‘)    
#创建list
r.sadd(‘abcd:ef‘,‘nihao‘)
r.sadd(‘abcd:ef‘,‘hello‘)
r.sadd(‘xxxx‘,‘nihao‘)
r.sadd(‘xxxx‘,‘good‘)
#打印出该key中的值 list
print r.smembers(‘abcd:ef‘)
#查询两个list中相同的值
print r.sinter(‘abcd:ef‘, ‘xxxx‘)
#给两个list取并集
print r.sunion(‘abcd:ef‘, ‘xxxx‘)
#列出所有key
print r.keys()
#列出以abc开头的所有key
print r.keys("abc*")

demo总结

由于之前公司碰到过需求,需要批量修改一批key的value,之前使用shell也可以做,不过,现在就通过完成这个需求使用python来实现这个小demo吧。

该demo中将会附上我的一些解释,希望各路大神不要吐槽。。。很久没动手写python了,再写就是各种蛋疼。。。。。。

#!/usr/bin/env python
#coding=utf-8
import redis    #导入redis-py模块
class RedisPool:    #定义了一个连接池类,该类返回连接池中的一个连接给调用者
    def Redis_Pool(self,ClientHost="192.168.0.25",ClientPort=6379,ClientDb=0):
        pool=redis.ConnectionPool(host=ClientHost,port=ClientPort,db=ClientDb)
        return redis.StrictRedis(connection_pool=pool)
class ChangeKey: #该类使用获取到的redis连接对想要进行修改的key进行修改
    
    def Change_String(self,R,Key,Value):  
        try:
            Bool = R.set(Key,Value)
        except Exception as e:
            Bool = False
            print ‘Insert string Error:‘,e
        return Bool
    
    def Change_List(self,R,KeyName,Key):
        Filed_List=[]
        for i in range(0,len(Key)):
            try:
                R.rpush(KeyName,Key[i])
            except Exception as e:
                Filed_List.append((KeyName,Key[i]))
                print ‘Insert set Error:‘,e
        return Filed_List
    
    def Change_Hash(self,R,KeyName,Key):
        Filed_List=[]
        for i in Key.keys():
            try:
                R.hset(KeyName,i,Key[i])
            except Exception as e:
                Filed_List.append([i,Key[i]])
                print ‘Insert set Error:‘,e
        return Filed_List
    
    def Change_Set(self,R,KeyName,Key):
        Filed_List=[]
        NewKey=list(Key)
        for i in range(0,len(NewKey)):
            try:       
                R.sadd(KeyName,NewKey[i])
            except Exception as e:
                Filed_List.append(KeyName,NewKey[i])
                print ‘Insert set Error:‘,e
        return Filed_List
    
    def Change_Key(self,R,Keys):    #通过传递进来的Keys判断其值是属于哪种类型,从而调用不同的key的插入函数将该key插入进redis中
        for i in Keys:
            if isinstance(Keys[i],(str,int,float,long)):
                print "The key %s type is string,will input new value:" %(i)
                Bool = self.Change_String(R,i,Keys[i])
                if Bool:
                    print "Update is ok,the key:%s New value:%s" %(i,Keys[i])
                else:
                    print "Update is Filed,the Filed key %s value %s" %(i,Keys[i])    
            elif isinstance(Keys[i],list):
                print "The key %s type is list,will input new value:" %(str(i))
                Filed_List = self.Change_List(R,i,Keys[i])
                if len(Filed_List) == 0:
                    print "Update is ok,the key:%s New value:%s" %(i,Keys[i])
                else:
                    print "Update is Filed,the Filed List is %s" %(Filed_List)
            elif isinstance(Keys[i],dict):
                print "The key %s type is hash,will input new value:" %(str(i))
                Filed_List = self.Change_Hash(R,i,Keys[i])
                if len(Filed_List) == 0:
                    print "Update is ok,the key:%s New value:%s" %(i,Keys[i])
                else:
                    print "Update is Filed,the Filed List is %s" %(Filed_List)
            elif isinstance(Keys[i],set):
                print "The key %s type is set,will input new value:" %(str(i))
                Filed_List = self.Change_Set(R,i,Keys[i])
                if len(Filed_List) == 0:
                    print "Update is ok,the key:%s New value:%s" %(i,Keys[i])
                else:
                    print "Update is Filed,the Filed List is %s" %(Filed_List)
            else:
                print "The Key %s not match that support type.The support type:string,list,hash,set." %(i)
class BatchChangeKey:
    def Batch_Change_Key(self,R,Keys,Value):
        for i in R.keys(Keys):
            self.ChangeKey=ChangeKey()
            self.ChangeKey.Change_Key(R,{i:Value})
    
 
def main():
      Pool=RedisPool()    #调用连接池类
      R=Pool.Redis_Pool("192.168.0.25",6379,0)    #获取该连接池中的一个连接
    #keys={‘m‘:‘huxianglin‘,‘e‘:[1,2,3],‘c‘:{‘z‘:‘a‘,‘c‘:‘b‘},"abc:def:ghi":set(["a","b","c"])}
      #changekey=ChangeKey()    #使用上面定义的Keys传递给该类,传递的keys要求是一个字典类型的数据
      #changekey.Change_Key(R,keys)
    batchchangekey=BatchChangeKey()    #调用批量修改的类,并将需要批量修改的key的一部分传递进去,可以通过R.keys(key)获取到能匹配的key的list,再遍历这个列表,将value传递进去
    batchchangekey.Batch_Change_Key(R,"abc:defg:*" , "helloworld")
if __name__ == ‘__main__‘:
    main()
时间: 2024-08-04 06:19:50

使用python对redis操作的相关文章

Python 之redis操作

Redis 是一个高性能的key-value数据库,是一种非关系型的数据库.有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. Redis支持数据的备份,即master-slave模式的数据备份. 1.redis安装. 在cmd命令窗口输入:pip install redis 2.连接redis. r = redis

Python之Redis操作

1.安装驱动 输入命令:pip install redis 2.直接使用驱动 import redis r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0) r.set('foo', 'bar') 3.ORM框架——flask-redis 输入命令:pip install flask-redis from flask import Flask from flask.ext.redis import FlaskRedis app = Fl

python笔记7:mysql、redis操作

模块安装: 数据操作用到的模块pymysql,需要通过pip install pymysql进行安装. redis操作用的模块是redis,需要通过pip install redis进行安装. 检验是否安装成功:进入到Python命令行模式,输入import pymysql. import redis ,无报错代表成功: mysql操作方法如下: 查询数据:fetchone.fetchmany(n).fetchall() import pymysql #建立mysql连接,ip.端口.用户名.密

Python Show-Me-the-Code 第 0003 题 Redis操作

第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中. 跟0002题相似,只不过是把关系型数据库换成了非关系型数据库. 步骤: 首先安装Redis和库,用pip安装即可 打开radis server 然后了解下Redis的操作 在代码中引入该库 连接数据库,写入数据,保存 python连接redis很方便,操作也跟redis-cli差不多. 因为生成的激活码应该是不重复的,所以我选择用set这个数据结构保存 redis的set数据类型常用操

Redis之Python 使用 Redis

Python 使用 Redis 参考文档: http://redis.cn/clients.html#python https://github.com/andymccurdy/redis-py 安装Redis $ sudo pip install redis 简单的redis操作 字符串string操作 In [1]: import redis In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0, password='

python实现redis客户端单例+hbase客户端单例

当业务需要大量去连接redis或者hbase的时候,大量的连接会造成socket的大量占用,导致的结果就是服务器没有更多的端口去分配,这种情况下的最好解决方案就是实现客户端连接的单例模式,保持连接永远是同一个.说到这,可能大家没有经历过,如果在每秒钟插入4000条数据的话,这个现象就非常明显了.下面就实现下python实现操作redis+hbase单例模式,有很多改进之处,根据自己业务进行调整,可以通过打印实例的ID进行验证: import happybase import redis clas

[Redis]python连接redis

只是看看能不能成功使用python操作redis,redis具体的数据结构和使用会在以后学习. 安装连接redis的包 pip install redis 本地已经在6379端口启动了redis服务. In [1]: importredis In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0) In [3]: r.set('foo', 'bar') Out[3]: True In [4]: r.get('foo') Ou

【小工具】python 连接redis查询

作用说明:通过python连接redis进行查询,判断结果并进行后续操作.需先安装redis-2.10.5.tar.gz. 代码如下: #!/usr/local/bin/python import redis r = redis.StrictRedis(host='192.168.1.100', port=8888, db=0) t = int(r.get('test')) if t > 100:          print t  ####这边可以配置查询到匹配的值后要执行的操作,例如发送邮件

python连接redis

1.安装redis忽略 2.安装python连接redis的模块 yum install python-redis -y #有些人追新,最终导致python连接不到redis,使用yum安装很好的解决了该问题 3.进入python,导入redis 模块 >>> import redis 4.创建redis连接信息 >>> r = redis.Redis(host='172.16.244.206',port=6379,db=0) 5.对redis进行操作: >>