python redis

来源:互联网 发布:军用软件关键性等级 编辑:程序博客网 时间:2024/05/01 22:51

①python redis的用法

#! /usr/bin/env python
#coding=utf-8
import redis
print redis.__file__
# 连接,可选不同数据库
r = redis.Redis(host='10.0.1.7', port=6379, db=1)

# -------------------------------------------
# 看信息
info = r.info()
for key in info:
 

print "%s: %s" % (key, info[key])

# 查数据库大小
print '\ndbsize: %s' % r.dbsize()

# 看连接
print "ping %s" % r.ping()

# 选数据库
#r.select(2)

# 移动数据去2数据库
#r.move('a',2)

# 其他
#r.save('a') # 存数据
#r.lastsave('a') # 取最后一次save时间
#r.flush()  #刷新
#r.shutdown() #关闭所有客户端,停掉所有服务,退出服务器
#
#--------------------------------------------
# 它有四种类型: string(key,val)、list(序列)、set(集合)、zset(有序集合,多了一个顺序属性)
# 不知道你用的哪种类型?
# print r.get_type('a') #可以告诉你
# -------------------------------------------
# string操作
print '-'*20
# 塞数据
r['c1'] = 'bar'
#或者
r.set('c2','bar')
#这里有个 getset属性,如果为Tr 可以在存新数据时将上次存储内容同时搞出来
print 'getset:',r.getset('c2','jj')
#如果你想设置一个递增的整数 每执行一次它自加1:
print 'incr:',r.incr('a')
#如果你想设置一个递减的整数 please:
print 'decr:',r.decr('a')

# 取数据
print 'r['']:',r['c1']
#或者
print 'get:',r.get('a')
#或者 同时取一批
print 'mget:',r.mget('c1','c2')
#或者 同时取一批 它们的名字(key)很像 而恰好你又不想输全部
print 'keys:',r.keys('c*')
#又或者 你只想随机取一个:
print 'randomkey:',r.randomkey()


# 查看一个数据有没有 有 1 无0
print 'existes:',r.exists('a')

# 删数据 1是删除成功 0和None是没这个东西
print 'delete:',r.delete('cc')
# 哦对了 它是支持批量操作的
print 'delete:',r.delete('c1','c2')

# 其他
r.rename('a','c3') #呃.改名
r.expire('c3',10) #让数据10秒后过期 说实话我不太明白么意思
r.ttl('c3') #看剩余过期时间 不存在返回-1

#--------------------------------
# 序列(list)操作
print '-'*20
# 它是两头通的
# 塞入
r.push('b','gg')
r.push('b','hh')
# head 属性控制是不是从另一头塞
r.push('b','ee')
# 看长度
print 'list len:',r.llen('b')
# 列出一批出来
print 'list lrange:',r.lrange('b',start=0,end=-1)

# 取出一位
print 'list index 0:',r.lindex('b',0)

# 修剪列表
#若start 大于end,则将这个list清空
print 'list ltrim :',r.ltrim('b',start=0,end=3) #只留 从0到3四位

# 排序
# 这可是个大工程

#--------------------------------
# 集合(set)操作
# 塞数据
r.sadd('s', 'a')

# 判断一个set长度为多少 不存在为0
r.scard('s')

# 判断set中一个对象是否存在
r.sismember('s','a')

# 求交集
r.sadd('s2','a')
r.sinter('s1','s2')

#求交集并将结果赋值
r.sinterstore('s3','s1','s2')

# 看一个set对象
r.smembers('s3')

# 求并集
r.sunion('s1','s2')
# 阿 我想聪明的你已经猜到了
#求并集 并将结果返回
r.sunionstore('ss','s1','s2','s3')

# 求不同
# 在s1中有,但在s2和s3中都没有的数
r.sdiff('s1','s2','s3')
r.sdiffstore('s4','s1','s2')# 这个你懂的

# 取个随机数
r.srandmember('s1')

#-------------------------------------
#zset 有序set
#'zadd', 'zcard', 'zincr', 'zrange', 'zrangebyscore', 'zrem', 'zscore'
# 分别对应
#添加, 数量, 自加1,取数据,按照积分(范围)取数据,删除,取积分

# 我靠 你玩死我了 redis!
# 今天在实验中,我尝试插入一条zset类型数据:
r1.zset(u'litao','book1',3)
# 插入成功
# 我继续插入
r1.zset(u'litao','book2',5)

#成功了

 


import time
t1 = time.time()
import redis
r = redis.Redis("localhost")
for i in xrange(1):
        a=r.set(i, i)
        b=r.get(i)
        print b

        r.lpush('book','book1')
        r.lpush('book','book2')
        print 'list llen:',r.llen('book')
        print 'list lrange:',r.lrange('book',start=0,end=-1)
        print 'list index:',r.lindex('book',1)

        r.sadd('litao','song1')
        r.sadd('litao','song2')
        print 'set scard:',r.scard('litao')
        print 'set sismember:',r.sismember('litao','song1')
        r.sadd('jingjie','song1')
        print 'sinter:',r.sinter('litao','jingjie')
        print 'set smembers:',r.smembers('litao')

        r.zadd(u'zset','litao',2)
        r.zadd(u'zset','jingjie',1)
        print 'zrange:',r.zrange('zset',0,-1)
        print 'zrangebyscore:',r.zrangebyscore('zset',1,1)

print time.time()-t1

##################################

首先确保redis已经正常启动

打开Python解释器:

>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, db=0)
>>> r.set('foo', 'bar')   #或者写成 r['foo'] = 'bar'
True
>>> r.get('foo')  
'bar'
>>> r.delete('foo')
True
>>> r.dbsize()   #库里有多少key,多少条数据
0
>>> r['test']='OK!'

>>> r.save()   #强行把数据库保存到硬盘。保存时阻塞
True

--------------------------------

>>> r.flushdb()   #删除当前数据库的所有数据
True

 >>> a = r.get('chang')
>>> a    # 因为是Noen对象,什么也不显示!
>>> dir(a)  
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> r.exists('chang')  #看是否存在这个键值
False

>>> r.keys()   # 列出所有键值。(这时候已经存了4个了)
['aaa', 'test', 'bbb', 'key1']
 

其他命令API,请参照redis-Python作者的博客,写的挺清楚了:

https://github.com/andymccurdy/redis-py

##########################################################

#3、使用 

#! /usr/bin/env python 
#coding=utf-8 
import redis 
print redis.__file__ 
# 连接,可选不同数据库 
r = redis.Redis(host='10.0.1.7', port=6379, db=1) 

# ------------------------------------------- 
# 看信息 
info = r.info() 
for key in info: 
  print "%s: %s" % (key, info[key]) 

# 查数据库大小 
print '\ndbsize: %s' % r.dbsize() 

# 看连接 
print "ping %s" % r.ping() 

# 选数据库 
#r.select(2) 

# 移动数据去2数据库 
#r.move('a',2) 

# 其他 
#r.save('a') # 存数据 
#r.lastsave('a') # 取最后一次save时间 
#r.flush()  #刷新 
#r.shutdown() #关闭所有客户端,停掉所有服务,退出服务器 

#-------------------------------------------- 
# 它有四种类型: string(key,val)、list(序列)、set(集合)、zset(有序集合,多了一个顺序属性) 
# 不知道你用的哪种类型? 
# print r.get_type('a') #可以告诉你 
# ------------------------------------------- 
# string操作 
print '-'*20 
# 塞数据 
r['c1'] = 'bar' 
#或者 
r.set('c2','bar') 
#这里有个 getset属性,如果为Tr 可以在存新数据时将上次存储内容同时搞出来 
print 'getset:',r.getset('c2','jj') 
#如果你想设置一个递增的整数 每执行一次它自加1: 
print 'incr:',r.incr('a') 
#如果你想设置一个递减的整数 please: 
print 'decr:',r.decr('a') 

# 取数据 
print 'r['']:',r['c1'] 
#或者 
print 'get:',r.get('a') 
#或者 同时取一批 
print 'mget:',r.mget('c1','c2') 
#或者 同时取一批 它们的名字(key)很像 而恰好你又不想输全部 
print 'keys:',r.keys('c*') 
#又或者 你只想随机取一个: 
print 'randomkey:',r.randomkey() 


# 查看一个数据有没有 有 1 无0 
print 'existes:',r.exists('a') 

# 删数据 1是删除成功 0和None是没这个东西 
print 'delete:',r.delete('cc') 
# 哦对了 它是支持批量操作的 
print 'delete:',r.delete('c1','c2') 

# 其他 
r.rename('a','c3') #呃.改名 
r.expire('c3',10) #让数据10秒后过期 说实话我不太明白么意思 
r.ttl('c3') #看剩余过期时间 不存在返回-1 

#-------------------------------- 
# 序列(list)操作 
print '-'*20 
# 它是两头通的 
# 塞入 
r.push('b','gg') 
r.push('b','hh') 
# head 属性控制是不是从另一头塞 
r.push('b','ee',head=Tr) 
# 看长度 
print 'list len:',r.llen('b') 
# 列出一批出来 
print 'list lrange:',r.lrange('b',start=0,end=-1) 

# 取出一位 
print 'list index 0:',r.lindex('b',0) 

# 修剪列表 
#若start 大于end,则将这个list清空 
print 'list ltrim :',r.ltrim('b',start=0,end=3) #只留 从0到3四位 

# 排序 
# 这可是个大工程 

#-------------------------------- 
# 集合(set)操作 
# 塞数据 
r.sadd('s', 'a') 

# 判断一个set长度为多少 不存在为0 
r.scard('s') 

# 判断set中一个对象是否存在 
r.sismember('s','a') 

# 求交集 
r.sadd('s2','a') 
r.sinter('s1','s2') 

#求交集并将结果赋值 
r.sinterstore('s3','s1','s2') 

# 看一个set对象 
r.smembers('s3') 

# 求并集 
r.sunion('s1','s2') 
# 阿 我想聪明的你已经猜到了 
#求并集 并将结果返回 
r.sunionstore('ss','s1','s2','s3') 

# 求不同 
# 在s1中有,但在s2和s3中都没有的数 
r.sdiff('s1','s2','s3') 
r.sdiffstore('s4','s1','s2')# 这个你懂的 

# 取个随机数 
r.srandmember('s1') 

#------------------------------------- 
#zset 有序set 
#'zadd', 'zcard', 'zincr', 'zrange', 'zrangebyscore', 'zrem', 'zscore' 
# 分别对应 
#添加, 数量, 自加1,取数据,按照积分(范围)取数据,删除,取积分 

# 我靠 你玩死我了 redis! 
# 今天在实验中,我尝试插入一条zset类型数据: 
r1.zset(u'www.liyi99.com','liwu',3) 
# 插入成功 
# 我继续插入 
r1.zset(u'www.liyi99,com',u'\送\礼',5) 
#报错: 
#UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 
#这次插入的是礼物的中文词 unicode编码 
#为什么会失败那,这条数据是我从redis里面取出来然后没做任何修改再插入的阿 
#redis返回和接受的数据类型都是unicode编码的阿 
#好吧,我们再次插入试试 
#再次插入 
r1.zset('www.liyi99.com',u'\送\礼',5) 
#成功了 
#插入 
r1.zset('www.liyi99.com','礼物',5) 
#依然成功,跟入redis.py 1024行 
return self.send_command('ZADD %s %s %s\r\n%s\r\n' % ( 
    key, score, len(member), member)) 
# 哦 万恶的编码转换! 
#不过取的时候,不论第一个是何种类型的数据都无关系

############################################

在解压目录运行 python setup.py install安装模块

#tar -zxvf redis-2.6.2.tar.gz
#cd redis-2.6.2
#python setup.py install

使用:

import redis

r = redis.Redis(host=’localhost’, port=6379, db=0)

r['test'] = ‘test’ #或者可以r.set(‘test’, ‘test’) 设置key

r.get(‘test’)  #获取test的值

r.delete(‘test’) #删除这个key

r.flushdb() #清空数据库

r.keys() #列出所有key

r.exists(‘test’) #检测这个key是否存在

r.dbsize() #数据库中多少个条数

########################################

1. 安装

1. redis-py
        a. 使用easy_install
[plain] view plaincopyprint?
  1. sudo easy_install redis  

        b. 源码安装
[plain] view plaincopyprint?
  1. git clone https://github.com/andymccurdy/redis-py.git  
  2. cd redis-py  
  3. python setup.py install  

2. Parser安装
        Parser可以控制如何解析redis响应的内容。redis-py包含两个Parser类,PythonParser和HiredisParser。默认,如果已经安装了hiredis模块,redis-py会使用HiredisParser,否则会使用PythonParser。
HiredisParser是C编写的,由redis核心团队维护,性能要比PythonParser提高10倍以上,所以推荐使用。安装方法,使用easy_install:
[plain] view plaincopyprint?
  1. easy_install hiredis  

2. 使用

        redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
[python] view plaincopyprint?
  1. import redis  
  2.   
  3. r = redis.StrictRedis(host='127.0.0.1', port=9212)  
  4. r.set('foo''hello')  
  5. r.rpush('mylist''one')  
  6. print r.get('foo')  
  7. print r.rpop('mylist')  
        redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
[python] view plaincopyprint?
  1. import redis  
  2.   
  3. pool = redis.ConnectionPool(host='127.0.0.1', port=9212)  
  4. r = redis.Redis(connection_pool=pool)  
  5. r.set('one''first')  
  6. r.set('two''second')  
  7. print r.get('one')  
  8. print r.get('two')  
        redis pipeline机制,可以在一次请求中执行多个命令,这样避免了多次的往返时延。
[python] view plaincopyprint?
  1. import redis  
  2.   
  3. pool = redis.ConnectionPool(host='127.0.0.1', port=9212)  
  4. r = redis.Redis(connection_pool=pool)  
  5. pipe = r.pipeline()  
  6. pipe.set('one''first')  
  7. pipe.set('two''second')  
  8. pipe.execute()  
  9.   
  10. pipe.set('one''first').rpush('list''hello').rpush('list''world').execute()  
        redis-py默认在一次pipeline中的操作是原子的,要改变这种方式,可以传入transaction=False,
[python] view plaincopyprint?
  1. pipe = r.pipeline(transaction=False)  


以上内容来自互联网!

原创粉丝点击