redis字符串操作
- set(name, value, ex=None, px=None, nx=False, xx=False)
import redis
'''
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
'''
conn = redis.Redis()
conn.set('name', 'barry') # value只能是字符串或byte格式
conn.set('name', 'barry1', ex=3) # ex是限时销毁,3秒后数据就没了
conn.set('name', 'barry2', px=3) # ex是限时销毁,3秒后数据就没了
conn.set('name', 'barry3', nx=True) # 实现分布式锁
conn.set('name', 'barry4', xx=True)
conn.close()
- setnx(name, value)
本质就是set nx=True
conn = redis.Redis()
conn.setnx('hobby', '乒乓球')
conn.close()
-
psetex(name, time_ms, value)
本质就是set px 设置时间
conn = redis.Redis()
conn.psetex('name', 3000, 'barry')
conn.close()
-
mset(*args, **kwargs)
以字典格式批量设置
conn = redis.Redis()
conn.mset({'name': 'barry', 'age': 18})
conn.close()
-
get(name)
以bytes格式获取值
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
print(conn.get('name')) # b'barry'
conn.close()
-
mget(keys, *args)
以bytes格式批量获取获取值
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
res = conn.mget('name', 'age')
res1 = conn.mget(['name', 'age'])
print(res, res1) # [b'barry', b'18'] [b'barry', b'18']
conn.close()
-
getset(name, value)
先获取,在设置新的值
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
res = conn.getset('name', 'kevin')
print(res) # b'barry'
conn.close()
-
getrange(key, start, end)
以字节的格式按区间位置获取值
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
res = conn.getrange('name', 0, 1) # 前闭后闭区间
print(res) # b'ba'
conn.close()
-
setrange(name, offset, value)
从摸个起始位置开始替换字符串
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
conn.setrange('name', 1, 'xxx') # 从第1个位置开始替换字符串
print(conn.get('name')) # b'bxxxy'
conn.close()
-
setbit(name, offset, value)
以二进制,将某个位置的编码修改
conn = redis.Redis()
conn.setbit('name', 1, 0)
conn.close()
-
getbit(name, offset)
获取某个位置的比特位
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
res = conn.getbit('name', 1) # 获取第1个位置的比特位
print(res) # 1
conn.close()
-
bitcount(key, start=None, end=None)
获取从某个位置开始到某个位置结束有多少个比特位
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
res = conn.bitcount('name', 0, 3) # 3指的是3字符
print(res) # 14
conn.close()
-
strlen(name)
统计字节
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
print(conn.strlen('name')) # 5
conn.close()
-
incr(self, name, amount=1)
每执行一次就加1
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
print(conn.incr('age')) # 19
conn.close()
-
incrbyfloat(self, name, amount=1.0)
浮点型incr
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
print(conn.incrbyfloat('age')) # 20.0
conn.close()
-
decr(self, name, amount=1)
每执行一次就减1
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
print(conn.decr('age')) # 19
conn.close()
-
append(key, value)
在后面追加
conn = redis.Redis(encoding='utf8') # 将bytes转换为真正的值
conn.append('name', 'nb')
print(conn.get('name')) # b'barrynb'
conn.close()
- 常用:get set strlen
redis hash操作
- hset(name, key, value)
import redis
conn = redis.Redis()
conn.hset('info', 'name', 'barry') # 在info中以字典格式设置值
conn.hset('info', mapping={'age': 18, 'hobby': '篮球'}) # 在info中以字典格式设置多条值
conn.close()
-
hmset(name, mapping)
已经弃用的批量设置
conn = redis.Redis(decode_responses=True)
conn.hmset('aa', {'a': 'a', 'b': 'b'}) # 批量设置值
conn.close()
-
hget(name,key)
以bytes格式获取值
conn = redis.Redis()
res = conn.hget('info', 'name')
print(res) # b'barry'
conn.close()
-
hmget(name, keys, *args)
以bytes格式批量获取获取值
conn = redis.Redis()
res = conn.hmget('info', ['name', 'age'])
print(res) # [b'barry', b'18']
conn.close()
-
hgetall(name)、
获取所有(谨慎使用,可能会造成阻塞,尽量不要在生产代码中执行它)
conn = redis.Redis()
res = conn.hgetall('info')
print(res) # {b'name': b'barry', b'age': b'18'}
conn.close()
-
hlen(name)
获取其中有多少kv对
conn = redis.Redis()
res = conn.hlen('info')
print(res) # 2
conn.close()
-
hkeys(name)
获取所有的k中
conn = redis.Redis()
res = conn.hkeys('info')
print(res) # [b'name', b'age']
conn.close()
-
hvals(name)
获取所有的v值
conn = redis.Redis()
res = conn.hvals('info')
print(res) # [b'barry', b'18']
conn.close()
-
hexists(name, key)
判断是否存在
conn = redis.Redis()
res = conn.hexists('info', 'name')
print(res) # True
conn.close()
-
hdel(name,*keys)
删除指定键值对
conn = redis.Redis()
conn.hdel('info', 'age')
conn.close()
-
hincrby(name, key, amount=1)
每执行一次就加1
conn = redis.Redis()
conn.hincrby('info', 'age')
res = conn.hmget('info', ['age'])
print(res) # [b'19']
conn.close()
-
hincrbyfloat(name, key, amount=1.0)
浮点型hincrby
conn = redis.Redis()
conn.hincrbyfloat('info', 'age')
res = conn.hmget('info', ['age'])
print(res) # [b'19']
conn.close()
- hscan(name, cursor=0, match=None, count=None)
# 无序得设置值
conn = redis.Redis()
for i in range(100):
conn.hset('test_hash', 'key_%s' % i, '鸡蛋%s号' % i)
conn.close()
# 从第0条取10条值
res = conn.hscan('userinfo', cursor=0, count=10)
- hscan_iter(name, match=None, count=None)
# 获取10条数据,做成生成器
conn = redis.Redis()
res = conn.hscan_iter('test_hash', count=10)
print(res) # 生成器
for item in res:
print(item)
conn.close()
redis列表操作
-
lpush(name,values)
在列表左侧插入值
import redis
conn = redis.Redis(decode_responses=True)
conn.lpush('user', 'barry')
conn.close()
-
lpushx(name,value)
在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
conn = redis.Redis(decode_responses=True)
conn.lpushx('user', 'kevin')
conn.close()
-
rpushx(name, value)
在列表右侧插入值
conn = redis.Redis(decode_responses=True)
conn.rpushx('user', 'barry1')
conn.close()
-
llen(name)
name对应的list元素的个数
conn = redis.Redis(decode_responses=True)
res = conn.llen('user')
print(res) # 5
conn.close()
-
linsert(name, where, refvalue, value))
在name对应的列表的某一个值前或后插入一个新值
conn = redis.Redis(decode_responses=True)
# 在barry后面插入tom
conn.linsert('user', where='after', refvalue='barry', value='tom')
# 在barry前面插入tom
conn.linsert('user', where='before', refvalue='barry', value='tom')
conn.close()
-
lset(name, index, value)
对name对应的list中的某一个索引位置重新赋值
conn = redis.Redis(decode_responses=True)
conn.lset('user', 0, 'xxx')
conn.close()
-
lrem(name, value, num)
在name对应的list中删除指定的值
conn = redis.Redis(decode_responses=True)
conn.lrem('user', 1, 'tom') # 删除从左往右的第一个tom
conn.close()
-
lpop(name)
在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
conn = redis.Redis(decode_responses=True)
res = conn.lpop('user')
print(res) # barry
conn.close()
-
lindex(name, index)
在name对应的列表中根据索引获取列表元素
conn = redis.Redis(decode_responses=True)
res = conn.lindex('user', 0)
print(res) # kevin
conn.close()
-
lrange(name, start, end)
在name对应的列表分片获取数据
conn = redis.Redis(decode_responses=True)
conn.lpushx('user', 'kevin')
res = conn.lrange('user', 0, 1)
print(res) # ['kevin', 'barry1']
conn.close()
-
ltrim(name, start, end)
在name对应的列表中移除没有在索引之间的值
conn = redis.Redis(decode_responses=True)
conn.ltrim('user', 0, 1)
conn.close()
-
rpoplpush(src, dst)
从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
conn = redis.Redis(decode_responses=True)
conn.rpoplpush('user', 'userinfo')
conn.close()
-
blpop(keys, timeout)
如果列表中没有值,会进入阻塞态,直到有值,在按照从左到右去pop对应列表的元素
conn = redis.Redis(decode_responses=True)
res = conn.blpop('user')
print(res) # ('user', 'kevin')
conn.close()
-
brpoplpush(src, dst, timeout=0)
从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
'''
src:取出并要移除元素的列表对应的name
dst:要插入元素的列表对应的name
timeout:当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
'''
conn = redis.Redis(decode_responses=True)
conn.rpoplpush('user', 'userinfo')
conn.close()
通用操作(5大类型都支持)
-
delete(*names)
根据删除redis中的任意数据类型
conn = redis.Redis()
conn.delete('age', 'name') # 删除age、name
conn.close()
-
exists(name)
检测redis的name是否存在(0就是不存在,1就是存在)
conn = redis.Redis()
res = conn.exists('name')
print(res) # 0
conn.close()
-
keys(pattern='*')
根据模型获取redis的name
conn = redis.Redis()
res = conn.keys() # 返回所有的k
conn.close()
-
expire(name ,time)
为某个redis的某个name设置超时时间
conn = redis.Redis()
conn.expire('name', 3) # 3秒针过期
conn.close()
-
rename(src, dst)
对redis的name重命名为
conn = redis.Redis()
conn.delete('name', 'namexxx') # 将name修改为namexxx
conn.close()
-
move(name, db))
将redis的某个值移动到指定的db下
conn = redis.Redis()
conn.move('age', 2) # 将age移动到第2个库中
conn.close()
-
randomkey()
随机获取一个redis的name(不删除)
conn = redis.Redis()
res = conn.randomkey()
conn.close()
-
type(name)
获取name对应值的类型
conn = redis.Redis()
res = conn.type('age') # 获取age中值的数据类型
conn.close()
redis管道
1.redis数据库是否支持事务?
1.1redis事务机制可以保证一致性和隔离性,无法保证持久性,但是对于redis而言,本身是内存熟即可,所以持久化不是必须属性
-原子性需要自己进行检查,尽可能保证
1.2redis不像mysql一样,支持强事务,事务的四大特性不能全部满足,但是能满足一部分,通过redis的管道实现的
-redis本身不支持事务,但是可以通过管道,实现部分事务
1.3redis通过管道,来保证命令要么都成功,要么都失败,完成事务的一致性,但是管道只能用在单实例,集群环境中,不支持pipline
2.实例
import redis
conn = redis.Redis()
pipline = conn.pipeline(transaction=True)
pipline.decr('a', 2) # a减2
raise Exception('出错了')
pipline.incr('b', 2) # b加2
conn.close()
django中集成redis
1.方式1(直接使用)
1.1POOL.py
import redis
pool = redis.ConnectionPool(max_connections=10, host='127.0.0.1', port=6379)
1.2使用
from user.POOL import pool
import redis
def index(request):
conn = redis.Redis(connection_pool=pool)
conn.incr('page_view')
res = conn.get('page_view')
return HttpResponse(f'被你看了{res}次')
2.方式2
2.1在配置文件配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
# "PASSWORD": "123", # 设置密码
}
}
}
2.2使用
from django_redis import get_redis_connection
def index(request):
conn = get_redis_connection(alias='default') # 每次从池中取一个衔接
conn.incr('page_view')
res = conn.get('page_view')
return HttpResponse(f'被你看了{res}次')
3.方式3(借助于django的缓存使用redis)
-如果配置文件中配置了CACHES,则django的缓存数据直接放在redis中
-可以直接使用cache.set设置值,可以设置过期时间
-使用cache.set获取值
-其优势在于可以直接缓存任意python对象,底层使用pickle实现的
from django.core.cache import cache
conn = cache.set('px', '10', 3) # 缓存到redis中,3秒后销毁
celery
celery介绍
1.celery是一个分布式的异步任务框架
1.1可以完成异步任务:可以提高项目的并发量,之前开启线程做,现在使用celery做
1.2可以完成延迟任务
1.3可以完成定时任务
2.框架
2.1消息中间件(borker)
-提交的任务(函数)都放在这里,celery本身不提供消息中间件,需要借助第三方(redis、rabbitmq)
2.2任务执行单元(worker)
-真正执行任务的地方,一个个进程,执行函数
2.3结果存储(backend)
-函数return的结果存储在这里,celery本身不提供结果存储,借助于第三方(redis、数据库、rabbitmq)
标签:name,redis,Redis,管道,res,类型,close,conn
From: https://www.cnblogs.com/riuqi/p/16894307.html