redis各个数据类型操作,redis管道,celery介绍

112 阅读5分钟

redis字符串操作

import redis 
conn = redis.Redis()

1 set(name, value, ex=None, px=None, nx=False, xx=False)
	# ex:过期时间(秒)	px:过期时间(毫秒)
	# nx:如果设置为True,则只有name不存在时,当前set操作才能执行(新增)
	# xx:如果设置为True,则只有name存在时,当前set操作才能执行(修改)
    conn.set('name','lqz')
2 setnx(name, value)
	# 就是 set(nx=True)
3 psetex(name, time_ms, value)
	# 本质就是 set(px=xxx) 设置了过期时间
4 mset(*args, **kwargs)
	# 传字典批量设置
	conn.mset({'name':'xxx', 'age':'xxx'})
4 get(name)
	# 获取值。获取到的是bytes格式,指定decode_responses=True,就完成转换
5 mget(keys, *args)
	# 批量获取
6 getset(name, value)
	# 先获取再设置值
7 getrange(key, start, end)
	# 取得是字节、前闭后闭区间
8 setrange(name, offset, value)
	# 从某个起始位置开始替换字符串
9 setbit(name, offset, value)
	# 设置比特位、用不到
10 getbit(name, offset)
11 bitcount(key, start=None, end=None)
12 strlen(name)
	# 统计字符长度
13 incr(self, name, amount=1)
14 incrbyfloat(self, name, amount=1.0)
15 decr(self, name, amount=1)
16 append(key, value)
	# 字符串拼接
conn.close()


重点记:get set strlen append

redis Hash操作

# redis的hash只支持一层(不能嵌套hash)

1 hset(name, key, value)
	# 设置hash值  
	conn.hset('user_info', 'age', 22)  
	# 类似于python中的 userinfo = {'name': 'jixing', 'age': 22}
2 hmset(name, mapping)
3 hget(name,key)
	# 获取值
    res=conn.hget('userinfo','age')
4 hmget(name, keys, *args)
	# 批量获取值
    res=conn.hmget('userinfo',['name','age'])
5 hgetall(name)
	# 获取所有值  慎用,数据量大时会造成 阻塞 尽量不要在生产代码中执行它
6 hlen(name)
	# 获取hash的长度(键值对的个数)
7 hkeys(name)
	# 获取hash中的所有key
	res=conn.hkeys('userinfo')
8 hvals(name)
	# 获取hash中的所有value
9 hexists(name, key)
	# 判断键存不存在
10 hdel(name,*keys)
	# 根据key删除键值对
11 hincrby(name, key, amount=1)
12 hincrbyfloat(name, key, amount=1.0)
13 hscan(name, cursor=0, match=None, count=None)
14 hscan_iter(name, match=None, count=None)

重点掌握:hset  hget  hlen  hexists  hdel

redis列表操作

1 lpush(name,values)
	# 在name对应的list中添加元素,每个新的元素都添加到列表的最左边
2 lpushx(name,value)
	# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
3 rpushx(name, value) 表示从右向左操作
4 llen(name)
	# name对应的list元素的个数
5 linsert(name, where, refvalue, value))
    # 在name对应的列表的某一个值前或后插入一个新值
    # 参数:
        # name,redis的name
        # where,BEFORE或AFTER(小写也可以)
        # refvalue,标杆值,即:在它前后插入数据(如果存在多个标杆值,以找到的第一个为准)
        # value,要插入的数据
6 lset(name, index, value)
	# 对name对应的list中的某一个索引位置重新赋值
7 lrem(name, value, num)
8 lpop(name)
	# 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
9 lindex(name, index)
	# 在name对应的列表中根据索引获取列表元素
10 lrange(name, start, end)
11 ltrim(name, start, end)
12 rpoplpush(src, dst)
13 blpop(keys, timeout)
14 brpoplpush(src, dst, timeout=0)
15 自定义增量迭代

redis管道

问:redis是否支持事务
	说支持不支持都可以
redis本身不支持事务,但是可以通过管道,实现部分事务的功能
redis事务机制可以保证一致性和隔离性,无法保证持久性,但是对于redis而言,本身是内存数据库,所以持久化不是必须属性。原子性需要自己进行检查,尽可能保证。

redis 通过管道,来保证命令要么都成功,要么都失败,完成事务的一致性,但是管道只能用在单实例,集群环境中,不支持pipline
import redis

conn = redis.Redis()
pipline = conn.pipeline(transaction=True)  # pipeline可以保证事务操作的一致性
pipline.decr('a', 2)  # a减2
raise Exception('我崩了')
pipline.incr('b', 2)  # b加2
pipline.execute()
conn.close()

redis其他操作

# 集合,有序集合 --- redis模块提供的方法API
# 通用操作:无论是5大类型的那种,都支持

import redis

conn = redis.Redis()
# 1 delete(*names)
# conn.delete('age', 'name')

# 2 exists(name)
# res=conn.exists('xx')
# print(res)  # 0


# 3 keys(pattern='*')
# res=conn.keys('*o*')
# res=conn.keys('?o*')
# print(res)

# 4 expire(name ,time)
# conn.expire('test_hash',3)


# 5  rename(src, dst) # 对redis的name重命名为
# conn.rename('xx','xxx')


# 6 move(name, db) # 将redis的某个值移动到指定的db下
# 默认操作都是0 库,总共默认有16个库
# conn.move('xxx',2)


# 7  randomkey()  随机获取一个redis的name(不删除)
# res=conn.randomkey()
# print(res)

# 8 type(name)  查看类型
# res = conn.type('aa')  # list  hash set
# print(res)

conn.close()

django中集成redis

# 方式一:直接使用
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('被你看了%s次' % res)

# 方式2:使用第三方模块:django-redis
    1.-下载
    2.-配置文件配置
    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",
            }
        }
    }
    3.使用
	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('被你看了%s次' % res)
# 方式3:借助于django的缓存使用redis
	-如果配置文件中配置了 CACHES  ,以后django的缓存,数据直接放在redis中
    -以后直接使用cache.set 设置值,可以传过期时间
    -使用cache.get 获取值
    -强大之处在于,可以直接缓存任意的python对象,底层使用pickle实现的

celery介绍

# celery:翻译过来叫芹菜,它是一个  分布式的异步任务   框架
# celery有什么用?
	1 完成异步任务:可以提高项目的并发量,之前开启线程做,现在使用celery做
    2 完成延迟任务
    3 完成定时任务
    
# 架构
    -消息中间件:broker 提交的任务(函数)都放在这里,celery本身不提供消息中间件,需要借助于第三方:redis,rabbitmq
    -任务执行单元:worker,真正执行任务的地方,一个个进程,执行函数
    -结果存储:backend,函数return的结果存储在这里,celery本身不提供结果存储,借助于第三方:redis,数据库,rabbitmq

29.png