字符串和字节转换的两种方式

# 字符串和字节转换的两种方式
	-decode,encode
    -直接类型转换
  
    -bytes格式的16进制,2进制,10进制的显示
    
    # 字符串需要用encode,bytes格式需要用decode,但是有时候忘了
    #可以直接进行强转
    b1=bytes(s,encoding='utf-8')
	print(b1)
	b'\xe4\xb9\x92\xe4\xb9\x93\xe7\x90\x83'
	print(str(b1,encoding='utf-8'))
	#乒乓球

1 redis列表操作

'''
lpush(name,values)
rpush(name, values) 表示从右向左操作
lpushx(name,value)
rpushx(name, value) 表示从右向左操作
llen(name)
linsert(name, where, refvalue, value))
lset(name, index, value)
lrem(name, value, num)
lpop(name)
rpop(name) 表示从右向左操作·
lrange(name, start, end)
ltrim(name, start, end)
rpoplpush(src, dst)
blpop(keys, timeout)
brpoplpush(src, dst, timeout=0)
自定义增量迭代
'''

import redis

conn = redis.Redis(decode_responses=True)

# 在name对应的list中添加元素,每个新的元素都添加到列表的最左边,
#不存在键这创建键
 #lpush(name,values)    左侧插入值  [ 乒乓球  足球 篮球]
 conn.lpush('hobbys', '篮球')
 conn.lpush('hobbys', '足球')
 conn.lpush('hobbys', '乒乓球')


# rpush(name, values) 表示从右向左操作
 conn.rpush('hobbys', '橄榄球')

# lpushx(name,value)  # 只有key存在才能插入,从左侧插入
 conn.lpushx('hobbys1', '排球')
# rpushx(name, value) 只有key存在才能插入表示从右向左操作

# llen(name)
 print(conn.llen('hobbys'))

# name:rediskey值,
# where: before   after,
# refvalue: 在谁的前后
# value:插入的数据
# linsert(name, where, refvalue, value))
 conn.linsert('hobbys', 'after', '乒乓球', '保龄球')
 conn.linsert('hobbys', 'before', '乒乓球', '球球')


# lset(name, index, value)  修改值
 conn.lset('hobbys', 1, '球球球')

    
# lrem(name,num, value )   (remove)
 conn.lrem('hobbys',0,'排球')  # 0 表示全删除
 conn.lrem('hobbys', 1, '足球')  # 正数表示从左侧删除
 conn.lrem('hobbys', -2, '足球')  # 负数表示从右侧删除

    
# lpop(name)  从左侧弹出
 print(conn.lpop('hobbys'))
 #rpop(name) 表示从右向左操作
 print(conn.rpop('hobbys'))

    
# lindex(name, index)
 res=conn.lindex('hobbys',2)  #通过索引查值
 print(res.decode('utf-8'))

## 在name对应的列表分片获取数据
# lrange(name, start, end)
 res=conn.lrange('hobbys',0,2)  # 前闭后闭区间
 print(res)

## 在name对应的列表中移除没有在start-end索引之间的值
# ltrim(name, start, end)
 res=conn.ltrim('hobbys',1,3)
 print(res)

# rpoplpush(src, dst)
# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
# 参数:
    # src,要取数据的列表的name
    # dst,要添加数据的列表的name

  
# blpop(keys, timeout) 着重讲,这个就是简单的消息队列,可以实现分布式的程序----》生产者消费者模型

 res=conn.blpop('hobby',timeout=2)  # 只要列表中没有值,就会阻塞,有值才会继续运行
 print(res)

# brpoplpush(src, dst, timeout=0)
# 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
# 参数:
    # src,取出并要移除元素的列表对应的name
    # dst,要插入元素的列表对应的name
    # timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞

# 自定义增量迭代
# 一次性把列表中所有数据取出来
# for i in range(1000):
#     conn.lpush('eggs','鸡蛋%s号'%i)
# l=conn.llen('eggs')
# res=conn.lrange('eggs',0,l)
# print(res)

def l_scan_iter(key, count=10):
    num = 0
    while True:
        print('-----------')
        res = conn.lrange(key, num, num + count - 1)
        num = num + count
        if res:
            for item in res:
                yield item
        else:
            break


for item in l_scan_iter('eggs', 20):
    print(item)

conn.close()



'''
lpush
lpop
linsert
lset
llen
lrange
'''

2 redis其它操作

'''

delete(*names)
exists(name)
keys(pattern='*')
expire(name ,time)
rename(src, dst)
move(name, db))
randomkey()
type(name)

'''

import redis

conn=redis.Redis()
# delete(*names)
# 根据删除redis中的任意数据类型
 conn.delete('eggs','hobbys')
# exists(name)
# 检测redis的name是否存在
 conn.set('name','lqz')
 print(conn.exists('name'))  #存在返回1  不存在返回0  

# keys(pattern='*')
 res=conn.keys('*')
 res=conn.keys('nam?')  #模糊查询,一个?代表一个字符? *代表多个
 print(res)

# expire(name ,time)
# 为某个redis的某个name设置超时时间
 conn.expire('hobby',5)  #5秒后删除该键

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

# move(name, db))
# 将redis的某个值移动到指定的db下
 conn.move('name1',2)

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

# type(name)
# 获取name对应值的类型
res=conn.type('name1')
print(res)
conn.close()

3 redis管道

# 事务四大特性
	-原子性:要么都成功,要么都失败
    -一致性:数据前后要一致
    -隔离性:多个事务之间相互不影响
    -持久性:事务一旦完成,数据永久改变
    
    
# redis 有没有事务?支持事务
	-redis要支持事务,要完成事务的几大特性,需要使用管道来支持
    -单实例redis是支持管道的
    -集群模式下,不支持管道,就不支持事务

# redis通过管道实现事务
import redis
conn = redis.Redis()
pipline = conn.pipeline(transaction=True)
pipline.decrby('a1', 10)  #-10  没有真正执行,把命令先放到管道中 
raise Exception('出错了') #前面执行的也全部失败掉,原子性
pipline.incrby('a2', 10)  #+10

pipline.execute()  # 把管道中的命令,一次性执行
conn.close()

4 django中使用redis

# 两种方式
	-方式一:自定义的通用方案(跟框架无关)
    	-写一个py文件:redis_pool.py
        	import redis
            POOL=redis.ConnectionPool(max_connections=10)
        -在用的位置,导入直接使用
             conn = redis.Redis(connection_pool=POOL)
        	conn.incrby('a1')
    -方式二:
    	-django中有个模块,django-redis,方便我们快速集成redis
    	-1 下载:pip install django-redis
        -2 配置文件配置:
            CACHES = {
                "default": {
                    "BACKEND": "django_redis.cache.RedisCache",
                    "LOCATION": "redis://127.0.0.1:6379",
                    "OPTIONS": {
                        "CLIENT_CLASS": "django_redis.client.DefaultClient",
                        "CONNECTION_POOL_KWARGS": {"max_connections": 100}
                        # "PASSWORD": "123",
                    }
                }
            }
            
        -3 在使用的地方,导入直接使用
        from django_redis import get_redis_connection
        class MyResponseView(APIView):
            def get(self, request):
                conn = get_redis_connection()  # 从连接池中拿出一个链接
                conn.incrby('a1')
                conn.set('name','彭于晏')
                return APIResponse()

5 django缓存

# django 是大而全的框架,内置了很多web开发需要的东西,缓存内置了

# 缓存:可以把django中的一个变量(数据),存放到某个位置,下次还可以取出来

# 之前用过:默认放在:内存中,其实可以放在文件中,数据库,redis。。。。
from django.core.cache import cache
cache.set('key','value',5) # 存放值
res=cache.get('key') # 取值


# 通过配置,控制存放在哪,只要如下写,就会放在redis中
   CACHES = {
       "default": {
           "BACKEND": "django_redis.cache.RedisCache",
           "LOCATION": "redis://127.0.0.1:6379",
           "OPTIONS": {
               "CLIENT_CLASS": "django_redis.client.DefaultClient",
               "CONNECTION_POOL_KWARGS": {"max_connections": 100}
               # "PASSWORD": "123",
           }
       }
   }

# django缓存最强大之处在于,只要是python的变量,任意类型都可以,尽管使用set设置值
       l = [1, 'lqz', [1, 3, 4, 5, 6], '彭于晏']
       cache.set('ll1', l)
	
# 以后再django中往redis放数据,就用cache即可

# redis的5大数据类型,只支持一层


# 看一下这篇文章:

# 超过5k就要交税
	-公司正常报税,工资中扣
    -6月份开始工作,按1w工资报税, 退税

补充

#序列化
	-json序列化---》得到字符串
    	json不能序列化对象(自定义的类的对象) 
        	-数据结构:数据的组织形式跟下面不一样
        能序列化: 数字,字符串,布尔,列表,字典  时间对象
    -pickle序列化
    	-python独有的,二进制形式
        -python可以序列化所有对象---》二进制形式
        -二进制---》返序列化回来---》对象:属性,有方法

6 celery介绍

# 项目中如果想用 
	异步任务       (开启线程,不好管理)
    定时任务         
    延迟任务        
    
# 借助于第三方框架,celery:芹菜,吉祥物,可以实现上面的三个功能
	http://www.celeryproject.org/
    
    
# 分布式的异步任务框架 celery