python Redis使用
ubuntu安装Redis
sudo
vim
/etc/redis/redis
.conf
把bind 127.0.0.1这行注释掉
然后重启Redis
sudo
/etc/init
.d
/redis-server
restart
import redis r = redis.Redis(host='192.168.181.128', port=6379) r.set('foo', 'Bar') print(r.get('foo'))
连接池
python操作redis,操作一次就请求一次连接,操作完成就断开连接,连接池把redis的连接请求放入池中,方便操作,避免每次建立、释放连接的开销
import redis pool = redis.ConnectionPool(host='192.168.181.128', port=6379) r = redis.Redis(connection_pool=pool) r.set('foo', 'Bar') print(r.get('foo'))
1. String操作
set(name, value, ex=None, px=None, nx=False, xx=False)
1
2
3
4
5
6
|
在Redis中设置值,默认,不存在则创建,存在则修改 参数: ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行 xx,如果设置为True,则只有name存在时,岗前set操作才执行 |
setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加)
setex(name,time ,value)
# time,过期时间(数字秒 或 timedelta对象)
psetex(name, time_ms, value)
# time_ms,过期时间(数字毫秒 或 timedelta对象)
mset(*args, **kwargs)#
mset(k1=
'v1'
, k2=
'v2'
)or
mget({
'k1'
:
'v1'
,
'k2'
:
'v2'
})
get(name)#获取值
mget(keys, *args)# mget('ylr', 'wupeiqi') or rmget([
'ylr'
,
'wupeiqi'
])
getset(name, value)#设置新值并获取原来的值
getrange(key, start, end) # name,Redis 的 name # start,起始位置(字节) # end,结束位置(字节)
setrange(name, offset, value)# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
setbit(name, offset, value)# 获取name对应的值的二进制表示中的某位的值 (0或1)
bitcount(key, start=None, end=None)# 获取name对应的值的二进制表示中 1 的个数
strlen(name)# 返回name对应值的字节长度(一个汉字3个字节)
incr(self, name, amount=1)# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
incrbyfloat(self, name, amount=1.0)# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
decr(self, name, amount=1)# 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
append(key, value)# 在redis name对应的值后面追加内容
2. Hash操作
hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据 , redis中Hash在内存中的存储格式如下图:
hset(name, key, value)# name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
hmset(name, mapping)#在name对应的hash中批量设置键值对
。hmset('xx', {'k1':'v1', 'k2': 'v2'})
hget(name,key)# 在name对应的hash中获取根据key获取value
hmget(name, keys, *args)# 在name对应的hash中获取多个key的值
hgetall(name)#获取name对应
hash
的所有键值
hlen(name)## 获取name对应的hash中键值对的个数
hkeys(name)# 获取name对应的hash中所有的key的值
hvals(name)# 获取name对应的hash中所有的value的值
hexists(name, key)# 检查name对应的hash是否存在当前传入的key,返回1是ture.0是false
hdel(name,*keys)# 将name对应的hash中指定key的键值对删除
hincrby(name, key, amount=1)# 自增name对应的hash中的指定key的值,不存在则创建key=amount
hincrbyfloat(name, key, amount=1.0)# 自增name对应的hash中的指定key的值,不存在则创建key=amount
hscan(name, cursor=0, match=None, count=None) 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆
hscan_iter(name, match=None, count=None)# 利用yield封装hscan创建生成器,实现分批去redis中获取数据
3. list
List操作,redis中的List在在内存中按照一个name对应一个List来存储。如图:
lpush(name,values)# 在name对应的list中添加元素,每个新的元素都添加到列表的最左边
lpushx(name,value)# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
llen(name)# name对应的list元素的个数
linsert(name, where, refvalue, value))# 在name对应的列表的某一个值前或后插入一个新值,实例:linsert username before pivot fall
lpop(name)# 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
lset(name, index, value)# 对name对应的list中的某一个索引位置重新赋值
lindex(name, index)#在name对应的列表中根据索引获取列表元素
lrange(name, start, end)# 在name对应的列表分片获取数据
ltrim(name, start, end)# 在name对应的列表中移除没有在start-end索引之间的值
rpoplpush(src, dst)# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
blpop(keys, timeout)# 将多个列表排列,按照从左到右去pop对应列表的元素
brpoplpush(src, dst, timeout=0)# 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
4.set集合操作
Set操作,Set集合就是不允许重复的列表
sadd(name,values)# name对应的集合中添加元素
scard(name)#获取name对应的集合中元素个数
sdiff(keys, *args)#在第一个name对应的集合中且不在其他name对应的集合的元素集合
sdiffstore(dest, keys, *args)# 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
sinter(keys, *args)# 获取多一个name对应集合的并集
sinterstore(dest, keys, *args)# 获取多一个name对应集合的并集,再讲其加入到dest对应的集合中
sismember(name, value)# 检查value是否是name对应的集合的成员
smembers(name)# 获取name对应的集合的所有成员
smove(src, dst, value)# 将某个成员从一个集合中移动到另外一个集合
spop(name)# 从集合的右侧(尾部)移除一个成员,并将其返回
srandmember(name, numbers)# 从name对应的集合中随机获取 numbers 个元素
srem(name, values)# 在name对应的集合中删除某些值
sunion(keys, *args)# 获取多一个name对应的集合的并集
sunionstore(dest,keys, *args) #获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中
sscan(name, cursor=0, match=None, count=None)## 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大
sscan_iter(name, match=None, count=None)
有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。
zadd(name, *args, **kwargs)# 在name对应的有序集合中添加元素,
# zadd('zz', 'n1', 1, 'n2', 2)
zcard(name)# 获取name对应的有序集合元素的数量
zcount(name, min, max)# 获取name对应的有序集合中分数 在 [min,max] 之间的个数
zincrby(name, value, amount)# 自增name对应的有序集合的 name 对应的分数
zrange( name, start, end, desc=False, withscores=False, score_cast_func=float) # 按照索引范围获取name对应的有序集合的元素
zrank(name, value)# 获取某个值在 name对应的有序集合中的排行(从 0 开始)
zrem(name, values)# 删除name对应的有序集合中值是values的成员
zremrangebyrank(name, min, max)# 根据排行范围删除
zremrangebyscore(name, min, max)# 根据分数范围删除
zscore(name, value)# 获取name对应有序集合中 value 对应的分数
zinterstore(dest, keys, aggregate=None)# 获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作,
# aggregate的值为: SUM MIN MAX
zunionstore(dest, keys, aggregate=None)# 获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作
zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
zscan_iter(name, match=None, count=None,score_cast_func=float)# 同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作
其他常用操作
delete(*names)# 根据删除redis中的任意数据类型
exists(name)# 检测redis的name是否存在
keys(pattern='*')# 根据模型获取redis的name, keys n*
expire(name ,time)# 为某个redis的某个name设置超时时间
rename(src, dst)# 对redis的name重命名为
move(name, db))# 将redis的某个值移动到指定的db下
randomkey()# 随机获取一个redis的name(不删除)
type(name)# 获取name对应值的类型
scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None)# 同字符串操作,用于增量迭代获取key
注释:
redis 一共用16个DB。