python 操作redis

python 操作redis

redis类型

  • string- list- set- zset- hash 需要注意的是连接redis时需要设置decode_responses=True,否则取出来的数据将会是byte类型
    一、字符串 string

SET: 为指定的键(key)设置值(value), set(self, name, value, **kwargs)。

GET:获取指定键(key)绑定的值(value),get(self, name)。

GETSET:为指定的键(key)设置新的值(value),并返回旧的值(old Value),getset(self, name, value)

SETEX:为指定的键(key)设置过期以秒(second)计的过期时间,setex(self, name, value, time)

SETNX:键(key)不存在时,为键(key)指定值(value),setnx(self, name, value)

MSET:一次性设置多个键-值(key-value)对,函数设置的键-值对(即mapping所指内容)数据要以Python字典数据类型传入,mset(self, mapping)

MSETNX:键-值(key-value)对不存在时,设置键-值(key-value)对,msetnx(self, mapping),mapping值参考6

INCR:自增函数,默认步长为1,通过对步长(amount)大小以及字符的控制实现了INCRBY(amount>=1)、DECR(amount=-1)、DECRBY(amount<=-1)等函数功能,incr(self, name, amount=1)

APPEND:为指定的字符串追加值,若不存在则直接创建,append(self, key, value)

SETRANGE:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始,setrange(self, name, offset, value)

STRLEN:返回字符串的长度,当name不存在时返回0,strlen(self, name)

#!/usr/bin/python
# -*- coding:utf-8 -*-

pool = redis.ConnectionPool(host='127.0.0.1', port=6379,decode_responses=True,db=0,password='limitDB')
r = redis.Redis(connection_pool=pool)
r.flushall()  # 清空Redis

from redis import Redis
import redis

pool=redis.ConnectionPool(host="127.0.0.1",port=6379)
r=Redis(connection_pool=pool)


r.setex('name', value='xc', time=2)  # 设置新值,过期时间为2s
r.mset(k1 = 'v1', k2 = 'v2', k3 = 'v3')  # 批量设置新值
print(r.mget('k1', 'k2', 'k3', 'k4'))  # 批量获取新值
print(r.getset('name', 'xchen'))  # 设置新值并获取原来的值
print(r.getrange('name', 0, 1))  # 获取子序列 0 <= x <= 1
r.setrange('name', 0, 'LIAO')  # 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加),返回值的长度

source = 'foo'
r.set('n1', source)
r.setbit('n1', 7, 1)
'''
注:如果在Redis中有一个对应: n1 = "foo",
    那么字符串foo的二进制表示为:01100110 01101111 01101111
    所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
    那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
'''
print(r.get('n1'))
print(r.getbit('n1', 7))  # 获取n1对应的值的二进制表示中的某位的值 (0或1)
r.set('n2', 'chenxu')
print(r.strlen('n2'))  # 返回对应的字节长度(一个汉字3个字节)
r.set('num', 1)
r.incr('num', amount=10)
r.decr('num', amount=1)
print(r.get('num'))  # 自增num对应的值,当name不存在时,则创建name=amount,否则,则自增。
r.append('num', 111)
print(r.get('num'))  # 在redis num对应的值后面追加内容

二、列表 lists

Python操作Redis主要利用了redis模块来实现,list表操作函数主要模拟了Redis操作命令LPUSH,LRANGE,LINDEX,BLPOP,BRPOP。函数说明如下:

lpush函数实现了从向指定redis列表头部压入数据功能,lpush key value

lrange获取列表指定范围的函数,lrange key start end

lindex根据列表下标量获取列表元素值, lindex key index

blpop从列表头部取出第一个元素,返回该元素值并从列表删除(l代表left,左边)

brpop从列表尾部取出第一个元素,返回该元素值并从列表删除(r代表right,右边)

LPUSHX、RPUSHX以及其他一些Redis列表(List)函数目前版本无法实现,如有可实现方法博客代码事例将会得到更新。

示例代码如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-

from redis import Redis
import redis

pool = redis.ConnectionPool(host='127.0.0.1', port=6379,decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushall()  # 清空Redis

r.lpush('oo', 11)  # 保存顺序为: 33,22,11
r.lpush('oo', 22)  # 保存顺序为: 33,22,11
r.lpush('oo', 33)  # 保存顺序为: 33,22,11
r.lpushx('oo', 00)  # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
print(r.llen('oo'))  # name对应的list元素的个数

r.linsert('oo', 'before', 11, 99)  # 在11之前插入值99
r.lset('oo', 1, 88)  # 对name对应的list中的某一个索引位置重新赋值
print(r.lrange('oo', 0, -1))  # 在name对应的列表分片获取数据

r.lrem('oo', 88, value=1)  # 在name对应的list中删除指定的值.num=0,删除列表中所有的指定值;num=2,从前到后,删除2个;num=-2,从后向前,删除2个
print(r.lrange('oo', 0, -1))

print(r.lpop('oo'))  # 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
print(r.lindex('oo', 0))  # 在name对应的列表中根据索引获取列表元素
r.lpush('l1', 11)  # index为0
r.rpush('l1', 22)
r.rpush('l1', 33)
r.rpush('l1', 44)
r.rpush('l1', 55)  # index为4
r.ltrim('l1', 1, 3)  # 在name对应的列表中移除没有在[start-end]索引之间的值
print(r.lrange('l1', 0, -1))

r.rpoplpush('l1', 'l1')  # 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边;src要取数据的列表的name, dst要添加数据的列表的name
print(r.lrange('l1', 0, -1))

r.brpoplpush('l1', 'l1', timeout=3)  # # timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
print(r.lrange('l1', 0, -1))

print(r.blpop('l1', 3))  # 从列表头部取出第一个元素,返回该元素值并从列表删除(l代表left,左边)
print(r.lrange('l1', 0, -1))
'''
    # 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:
    # 1、获取name对应的所有列表
    # 2、循环列表
    # 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
'''
print('自定义增量迭代:')
r.flushall()
r.lpush('l1', 11)  # index为0
r.rpush('l1', 22)
r.rpush('l1', 33)
r.rpush('l1', 44)
r.rpush('l1', 55)  # index为4

def list_iter(name):
    list_count = r.llen(name)
    for index in range(list_count):
        yield r.lindex(name, index)

for item in list_iter('l1'):
    print(item)

三、集合 sets

Redis 数据库集合对象(set object)是由string类型的无重复元素的无需集合,底层编码可以是intset或者hashtable。intset编码的集合对象用整数集合最为底层实现,所有对象元素保存在整数集合中。Python的redis模块实现了 SADD、SCARD 、SDIFF 、SDIFFSTORE、SINTER 、SINTERSTORE、SISMEMBER 、SMEMBERS 、SMOVE、SPOP、SRANDMEMBER、SREM、SUNION、SUNIONSTORE操作命令的基本用法。函数说明如下:

SADD:向集合对象添加成员,sadd(self, name, value)

SCARD:获取集合元素个数,scard(self, name)

SDIFF:返回给定多个集合对象的差集(set key1-set key2…-set keyn),从左到右计算集合差集,sdiff(self, keys, *args)

SDIFFSTORE:返回给定给定多个集合对象的差集并存储在目标(dest)集合中,sdiffstore(self, dest, keys, *args)

SINTER:返回给定所有集合(keys, args)的交集, sinter(self, keys, args)

SINTERSTORE:返回给定所有集合(keys, args)的交集并存储在 集合(dest) 中, sinterstore(self, dest, keys, args)

SISMEMBER:判断 value元素是否是集合 name 的成员,返回布尔逻辑值True或者False,sismember(self, name, value)

SMEMBERS:返回集合中所元素值的Python集合类型数据,smembers(self, name)

SMOVE:将元素value从集合src移动到 集合 dest。若元素value在集合src中不存在,则集合dest中不会添加元素value, smove(self, src, dest, value)

SPOP:移除并返回集合中的一个随机元素, spop(self, name)

SRANDMEMBER:返回集合中一个随机数,但是不做移除操作, srandmember(self, name)。从Redis 2.6 版本开始, 在命令行下Srandmember 命令接受可选返回元素数量的参数 redis>SRANDMEMBER name count

SREM:移除集合中一个元素,srem(self, name, value),redis模块任然沿用Redis 2.4 版本以前的只接受单个元素的用法。

SUNION:返回所有给定集合的并集中所有元素,sunion(self, keys, *args)

SUNIONSTORE:所有给定集合的并集存储在集合dest 中, sunionstore(self, dest, keys, *args)

SSCAN:迭代集合中的元素,sscan(self, name, cursor=0, match=None, count=None)

#!/usr/bin/python
# -*- coding:utf-8 -*-


pool = redis.ConnectionPool(host='127.0.0.1', port=6379,decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushall()  # 清空Redis

r.sadd('s1', 'v1', 'v1', 'v2', 'v3')  # name对应的集合中添加元素
r.sadd('s2', 'v2', 'v4')  # name对应的集合中添加元素
print(r.scard('s1'))  # 获取name对应的集合中元素个数
print(r.sdiff('s1', 's2'))  #在第一个name对应的集合中且不在其他name对应的集合的元素集合

r.sdiffstore('s3', 's1', 's2')  # 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
print(r.smembers('s3'))  # 获取s3对应的集合的所有成员

print(r.sinter('s1', 's2'))  # 获取s1, s2对应集合的交集
r.sinterstore('s4', 's1', 's2')  # 获取s1, s2对应集合的交集,并将其存放到集合是s4中
print(r.smembers('s4'))

print(r.sunion('s1', 's2'))  # 获取s1, s2对应集合的并集

r.sunionstore('s5', 's1', 's2')  # 获取s1, s2对应集合的交集,并将其存放到集合是s5中
print(r.smembers('s5'))

print(r.sismember('s4', 'v4'))  # 检查value是否是name对应的集合的成员

r.smove('s2', 's1', 'v4')  # 将集合s2中成员v4移至集合s1中
print(r.smembers('s1'))
r.srem('s1', 'v1')  # 在name对应的集合中删除某些值

print(r.spop('s1'))  # 从集合的右侧(尾部)移除一个成员,并将其返回 注意:集合是无序的,故结果随机!

print(r.srandmember('s1'))  # 从name对应的集合中随机获取 numbers 个元素(Redis 2.6+)

五、哈希 hashes

Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象。redis 中每个hash可以存储键值对多达40亿。Python的redis模块实现了Redis哈希(Hash)命令行操作的几乎全部命令,包括HDEL、HEXISTS、HGET、HGETALL、HINCRBY、HKEYS、HLEN 、HMGET 、HMSET 、HSET 、HSETNX 、HVALS 、HINCRBYFLOAT等命令。函数说明如下:

HDEL:删除对应哈希(Hash)表的指定键(key)的字段,hdel(self, name, key)

HEXISTS:检测哈希(Hash)表对应键(key)字段是否存在,返回布尔逻辑,hexists(self, name, key)

HGET:获取哈希(Hash)指定键(key)对应的值,hget(self, name, key)

HGETALL:获取哈希(Hash)表的键-值对(key-value pairs),返回python字典类型数据,hgetall(self, name)

HINCRBY:为哈希表(Hash)指定键(key)对应的值(key)加上指定的整数数值(int,可为负值)hincrby(self>, name, key, amount=1),Redis 中本操作的值被限制在 64 位(bit)有符号数字。

HKEYS:返回哈希表(Hash)对应键(key)的数组(Python称之为列表List),hkeys(self, name)

HLEN: 获取哈希表(Hash)中键-值对(key-value pairs)个数,hlen(self, name)

HMGET:获取哈希表(Hash)中一个或多个给点字段的值,不存在返回nil(Redis命令行)/None(Python),hmget(self, name, keys),其中keys可以为列表(list)

HMSET:设置对个键-值对(key-value pairs)到哈希表(Hash)中,python输入值(mapping)为字典(dictionary)类型,hmset(self, name, mapping)

HSET:为哈希表(Hash)赋值,若键(key)存在值(value)则覆盖,不存在则创建,hset(self, name, key, value)

HSETNX:为哈希表(Hash)不存值(value)的键(key)赋值,存在操作无效,对应值(value)无变化,hsetnx(self, name, key, value)

HVALS:返回哈希表(Hash)对应值(value)的列表,hvals(self, name)

HINCRBYFLOAT:为哈希表 key 中的指定字段的浮点数值加上增量 increment ,hincrbyfloat(self, name, key, amount=1.0)

#!/usr/bin/python
# -*- coding:utf-8 -*-

pool = redis.ConnectionPool(host='127.0.0.1', port=6379,decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushall()  # 清空Redis

r.hset('n1', 'k1', 'v1')  # hset(name, key, value),name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
print(r.hget('n1', 'k1'))
r.hmset('n2', {<!-- -->'k1': 'v1', 'k2': 'v2', 'k3': 'v3'})  # hmset(name, mapping),在name对应的hash中批量设置键值对
print(r.hmget('n2', 'k2'))
print(r.hgetall('n2'))  # 获取name对应hash的所有键值
print(r.hlen('n2'))  # 获取name对应的hash中键值对的个数
print(r.hkeys('n2'))  # 获取name对应的hash中所有的key的值
print(r.hvals('n2'))  # 获取name对应的hash中所有的value的值
print(r.hexists('n2', 'k4')) # 检查name对应的hash是否存在当前传入的key
r.hdel('n2', 'k3')  # 将name对应的hash中指定key的键值对删除
r.hset('n3', 'k1', 1)
r.hincrby('n3', 'k1', amount=1)  # hincrby(name, key, amount=1),自增name对应的hash中的指定key的value的值,不存在则创建key=amount
print(r.hgetall('n3'))
posted @ 2020-12-25 14:54  不要摸我的腰  阅读(145)  评论(0编辑  收藏  举报