首页 > 数据库 >10redis列表操作,其他操作,redis管道,django中使用redis,django缓存,序列化json和pickle,celery介绍

10redis列表操作,其他操作,redis管道,django中使用redis,django缓存,序列化json和pickle,celery介绍

时间:2023-06-28 22:22:25浏览次数:47  
标签:hobbys name res redis django 序列化 conn

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

# 字符串和字节转换的两种方式
	-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大数据类型,只支持一层


# 看一下这篇文章:https://www.cnblogs.com/liuqingzheng/articles/9803351.html

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

补充

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

6 celery介绍

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

标签:hobbys,name,res,redis,django,序列化,conn
From: https://www.cnblogs.com/whxx/p/17512705.html

相关文章

  • Redis设置为开机自启
    1Redis安装1.1上传redis-3.2.1.tar.gz到节点A服务器的/usr/local/目录下1.2解压redis压缩包[root@hadoop2local]#tar-xvfredis-3.2.1.tar.gz1.3修改包名[root@hadoop2local]#mvredis-3.2.1redis[root@hadoop2local]#cdredis/1.4执行编译[root@hadoop2redis]#makePREF......
  • django中ORM的相关操作
    ORM-操作<br>基本操作包括增删改查<br>ORMCRUD核心->模型类.管理器对象一、管理器对象每个继承下自models.Model的模型类,都会有一个object对象被同样继承下来,这个对象叫管理器对象<br>数据库的增删改查可以通过模型的管理器实现二、创建数据DjangoORM使用一种直观的......
  • Redis的使用
    redis字符串类型操作set(name,value,ex=None,px=None,nx=False,xx=False)在Redis中设置值,默认,不存在则创建,存在则修改参数:ex,过期时间(秒)px,过期时间(毫秒)nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果xx,如果设......
  • linux安装redis
    官网下载redisIndexof/releases/(redis.io)选择一个版本用xftp传到linux中,并且解压解压命令tar-xvffilename.tar.gz 进入解压后的redis目录中,执行安装命令makeinstall 进入utils目录中 执行install_server.sh,并且一直回车,就是全部配置都是默认的 安装......
  • 【Java】使用 fasterxml.jackson 反序列化的一个注意事项
    我们在对接接口时,不时会遇到以Json格式返回数据的接口。后端解析此类接口返回数据时,不免需要进行反序列化以获取到需要的数据对象。常用的反序列化工具有 Fastjson、Jackson、Gson。这三种都是不错的Json处理工具,我这里较常用的是Jackson。使用 Jackson反序列化:1.......
  • js promise对象数组,使用reduce序列化执行
    自己使用mdn官方例子测试了一下,发现还有一些小问题,调试了一下OK了。consttimeOut=function(ms){ returnnewPromise(function(resolve){ returnsetTimeout(resolve,ms); })}varp1=function(){ returnnewPromise(function(resolve){ console.log(newDate()+'......
  • 基于SpringBoot整合Redisson的延迟队列
    一、需求:     1.订单下单超过30分钟以后,如果还未支付,则自动转为取消支付状态 2.订单收货超过七天以后,如果还未评价,则自动转为好评 3.等类似需求二、实现步骤:    1. 引入redisson依赖<dependency><groupId>org.rediss......
  • django项目在windows的部署(apach+Mod_wsgi+django)
    如果django项目如果要正式使用,我们需要将项目部署到开发环境上去。django项目自带的服务不支持多线程,会出现多个用户访问时,页面卡死,半天打不开的问题。所以,该如何部署django项目呢?下边是我的部署经验,实测有效。如果可以的话,尽量部署到linux上,但是我的系统中涉及到一些window文件......
  • redis事务
    1.概念redis的事务本质是一组命令的集合,事务支持一次执行多个命令,一个事务中所有的命令都会被序列化。在事务执行的过程中,会按照顺序串行执行队列中的命令,其他客户端提交的命令请求不会插入到当前的事务中redis的事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令r......
  • redis之python操作
    安装pipinstallredisredis连接池概念连接管理:使用连接池可以有效地管理Redis连接。连接池会在应用程序初始化时创建一定数量的连接,并维护这些连接的可用性。应用程序可以从连接池中获取连接并使用完后将其归还给连接池,从而避免了频繁地创建和关闭连接。这样可以提高连接......