zoukankan      html  css  js  c++  java
  • redis数据库-VUE创建项目

    redis数据库

    '''
    关系型数据库: mysql, oracle
    非关系型数据库(nosql): redis,mongodb  (没有表的概念) key-value
    mongodb: json 数据--存储在硬盘上
    redis: 存在内存中 --- 速度最快
    	用途:
    	--做缓存
    	--session数据
    	--游戏排行榜
    	--对速度要求高的数据的存储
    	-- 消息队列
    '''
    redis VS Memcached
    -- redis 支持五大数据类型 : 字符串| 列表| 字典 | 集合| 有序集合
    -- redis 支持持久化
    -- redis 单线程,单进程,但速度也非常快
    -- redis 支持事务,操作都有原子性
    -- Memached不能持久化,只支持字符串
    
    数据类型:
    redis = {
        k1:"123",   字符串
        k2:[1,2,3,4],  列表
        k3:{"name":'egon','age':19}  字典
        k4:{1,2,3},    集合
        k5:{('lqz',18),('egon',33)}  有序集合
    }
    # ------------------------------------------------
    命令行操作redis:
        将路径添加至环境变量,然后命令行: redis-cli 
        set name lqz  | get name
        
    python 操作 redis(普通连接)
    1. pycharm 中安装redis
    import redis
    '''
    文件不能起名redis,否则找不到redis模块
    '''
    #拿到redis连接
    conn = redis.Redis(host='localhost', port=6379,db=0)
    # # 存
    # conn.set('age','18')
    # # 取
    # name = conn.get('name')  # bytes类型
    # print(name)
    
    # --------------字符串的操作----------------------------
    # set(name,value,ex=None,px=None,nx=False,xx=False)
    # nx: 只有name不存在时,set才执行,否则不执行 (设置为true)
    # xx: 设为true, 只有name存在时,set才能执行
    # conn.set('alex',14,8)  # 8秒后自动删除
    
    # setnx(name,value)  # 调了set,指定nx=True
    # setex(name,time,value)  # 设置超时时间
    # psetex(name,time_ms,value) # 设置超时时间,毫秒
    
    # conn.mset(*args,**kwargs)  # 批量设置值
    # conn.mset({'k3':'v3','k4':'v4'})
    
    # conn.mget(['name','age'])  # 批量获取
    # conn.mget('name','age')
    
    # conn.getset('name','iris')  # 取出原来的值改成iris
    # conn.getrange(key,start,end)  #获取子序列
    # conn.getrange('name',0,2)  #全闭区间
    
    # conn.setrange(name,offset,value)
    # conn.setrange('name',1,'p')  # name的第二位换成'p'
    
    # conn.strlen('name')  # 统计name长度
    
    # 访问量,点赞量,点踩量等可以用这个设置
    # conn.incr('age',amount=1)  # 程序运行一次,age增加1
    # conn.incrbyfloat('age',amount=1.1)
    # conn.decr('age',amount=1)  # 减1
    
    #conn.append('age','pp')  # 追加拼接
    
    # -----------redis 连接池 -- 做缓冲 --- 单例实现--------------------(连接池连接)
    1. 单例:新建一个模块conn.pool.py
    # 生成一个连接池,默认很多连接
    POOL= redis.ConnectionPool(host,port,max_connections)
    
    2. 导入上述模块
    from conn_pool import POOL
    # 从池子中取一个连接
    conn = redis.Redis(connection_pool=POOL)
    conn.get('name')
    
    django 中使用
    1. 新建模块 conn_pool.py
    2. views视图函数中
    	from app.conn_pool import POOL 
        def test(request):
            conn = redis.Redis()
            conn.set('token','afa9j',5)
    
    

    列表操作

    import redis
    conn = redis.Redis()
    
    # 列表操作
    # 每次新添加的元素都在最左侧
    # conn.lpush('l1',*[1,2,3,'kdakhf'])
    # conn.lpush('l2',1,2,3,4)
    
    # #rpush : 右侧插入数据
    # conn.rpush('l1','fjoa')
    
    # #lpushx : 在name对应的list中最左侧添加元素(name存在时才添加)
    # conn.lpushx('l2','5')
    
    # # 返回列表长度
    # conn.llen('l2')
    
    # # linsert 插入值
    # # linsert(name,where,refvalue,value),在l2中,value 3前插入
    # conn.linsert('l2','BEFORE','3','JAOJ')
    
    # 将位置2 上的内容换成7777(位置从0开始)
    # conn.lset('l2',1,'7777')
    
    # #删除指定的值,第二个参数:0(所有的7777都删除)1(从前到后找到第一个) 2 (删两个)-1(从后往前删一个)
    # conn.lrem('l2',0,'7777')
    
    # # 从左侧移除一个
    # conn.lpop('l2')
    
    # # 取值,第三个位置上的值
    # conn.lindex('l2',2)
    
    # # 取区间的值,双闭区间
    # print(conn.lrange('l2',0,1))  #[b'4', b'JAOJ']
    
    # # 取出列表中所有数据
    # conn.lrange('l2',0,10000000000)
    # conn.lrange('l2',0,conn.llen('l2'))
    
    # # ltrim 移除不在该区间[0,2]之内的值
    # conn.ltrim('l2',0,2)
    
    # # rpoplpush(src,dst): 取出最右侧数据,添加到新列表的左侧
    
    # # blpop, 每次删除一个值,没有值的时候就阻塞住,等着直到有数据过来就取出来
    # # 一个程序爬连接,一个连接取链接(简单的分布式)
    conn.blpop('l2')
    
    

    字典操作(基本)

    Hash操作,redis中的hash在内存中的存储格式:
    name ---------- hash
    n1   ---------- k1->v1 (v1必须是数字或者字符串,不能是列表或字典)
    
    # # 字典操作 n1 = { "name":"egon"}
    #  name不存在则添加,存在修改
    # conn. hset('n1',"name","owo")
    
    # name不存在创建,存在不改变
    # conn.hsetnx('n1','age','18')
    #
    # # hmset(name,mapping)  批量设置
    conn.hmset('n5',{'name':'lily','age':100})
    # conn.hmset('n3',{'name':{'lqz':'40'},'age':18}) # 错误!! 因为value只支持数字或字符
    #
    # # hget
    # conn.hget('n2','name')
    #
    # hmget(name,keys)
    # conn.hmget('n2',['name','age'])
    # conn.hmget('n2','name','age')
    #
    # #hgetall 取所有,注意:如果不知道数据库中的数据量,慎用hgetall
    # print(conn.hgetall('n2'))
    #
    # # 键值对的个数
    # conn.hlen('n2')
    #
    # # 取出所有的键
    # conn.hkeys('n2')   #[b'name', b'age']
    # conn.hvals('n2')  #[b'lqz', b'18']
    
    # # 返回true false,判断键是否存在
    # conn.hexists('n2','ddd')
    
    # # 删除
    # conn.hdel('n2','name','age')
    
    # # 自增
    # conn.hincrby('n1','age',amount=3)
    
    

    hscan(name,cursor=0,match=None,count=None)

    # 增量式迭代获取,hscan可以试想分片的获取数据,并非一次性将数据全部获取完,防止内存爆满
    参数:
    	name : redis 的name
        cursor: 游标(基于游标分批获取数据)
        match: 匹配指定key
        count: 每次分片最少个数
    ret = conn.hscan('n1',cursor=0,match=None,count=300)
    print(len(ret[1])) 
    

    常用 hscan_iter(name,match=None,count=None)-- 字典

    # 利用yield封装hscan创建生成器,实现分批去redis中获取数据
    # conn.hscan('n1',cursor=0,match=None,count=300) 每次取出300个
    参数:
    	match: 匹配指定key, 默认None,表示所有的key
        count: 每次分片最少获取的个数
    # 增量迭代取出所有的值,推荐使用!!!
    for i in conn.hscan_iter('n1',count=1000):
    	print(i)
    源码:	
    def hscan_iter(self, name, match=None, count=None):
    cursor = '0'
    while cursor != 0:
        #每次取出count 个
        cursor, data = self.hscan(name, cursor=cursor,match=match, count=count)
        #for没循环一次,取出1个,直至data取完为止
        for item in data.items():
             yield item
    

    自定义增量迭代 --- 列表中

    # 取出全部数据方式一:
    # ret = conn.lrange('l1',0,10)
    # 方式二: 自定义
    def l_scan(name,count=1000):
        cursor = 0
        while cursor <= conn.llen(name):
            ret = conn.lrange(name,cursor,count)
            cursor += count
            for i in ret:
                yield i
    for i in l_scan('l1',100):
        print(i)
    
    

    其他操作

    # conn.delete(*name) 不管数据类型
    conn.delete('name','age')
    # 判断键值是否存在, 结果为存在的数量
    conn.exists('n1','n2')
    # keys
    KEYS * 匹配数据库中所有的key
    KEYS h?llo  例:hello,hallo,hxllo
    KEYS h*llo  例:hllo, heeelo
    keys h[ea]llo  例 hello or hallo
    ret = conn.keys('n?')
    # expire(name,time)  为某个name 设置超时时间
    # rename(src,dst) 对name 重命名
    # move(name,db) 将某个name移到指定db下
    # randomkey() 随机获取一个name
    # type(name) 对应的类型
    # scan(cursor=0,match=None,count=None)
    # scan_iter(match=None,count=None)
    

    管道

    # 将内容打包好一次性执行execute, 模拟事务
    import redis
    pool=redis.ConnectionPool(host,port)
    conn = redis.Redis(connection_pool=pool)
    pipe = conn.pipeline(transaction=True)
    pipe.multi()
    
    pipe.set('name','alex')
    pipe.set('age','18')
    
    pipe.execute()  # 将内容一次性打包过去
    

    小结: Django中使用redis

    # 方式一:
    # utils文件夹下,新建redis_pool.py
    import redis
    POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000)
    #视图函数中使用:
    import redis
    from django.shortcuts import render,HttpResponse
    from utils.redis_pool import POOL
    
    def index(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.hset('kkk','age',18)
        return HttpResponse('设置成功')
    def order(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.hget('kkk','age')
        return HttpResponse('获取成功')
    #---------------------------------------
    # 方式二:
    安装django-redis模块
    settings 中配置
    # redis配置,缓存以后也用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",
            }
            'aa':{}
        }
    }
    #视图函数中
    from django_redis import get_redis_connection   # get_redis_connection就是一个链接池
    conn = get_redis_connection('default')   # CACHES中配置的
    print(conn.hgetall('xxx'))
    
    

    VUE创建项目

    # 前期环境配置
    1. cmd :进入要创建项目的目录  cd /d d:aaabb
    2. 安装node.js: 官网下载 https://nodejs-org/zh-cn/  -- 其中包括了npm的安装
    3. 安装cnpm : npm install -g cnpm --registry=https//registry.npm.taobao.org
    3. 安装vue脚手架: cnpm install -g @vue/cli    
    4. 清空缓存处理:npm cache clean --force
    
    # 创建vue项目,
    vue create 项目名字
    --要提前进入项目根目录, 选择自定义方式创建项目,选Router, Vuex插件
    -- settings -- plugins -- vue.js安装
    # 启动/停止项目
    -- npm run serve / ctrl+c (要提前进入根目录)
    # 打包项目
    -- npm run build  (要在项目根目录下进行打包操作)
    
    # 开发vue 一般不用pycharm,用webstrom.....
    
    # 复制别人的vue项目,复制除了node_modules以外的其他
    # cmd进入项目目录,npm install 
    
    创建项目参数:
    Babel: 将es6语法 解析成。。
    TypeScript:es语法 -- 简称ts, 我们采用js,因此这里不选
    Router: 路由
    Vuex: 全局的单例,实现组件间通信的,里面的属性所有都能看到
    CSS Pre-processors: 预编译语言(有逻辑的CSS)
    Formatter: 规定代码格式规范  
    命令:
    node --version
    vue -V
    
    # 项目创建好以后,项目所在目录安装
    安装cookie的命令 : npm install vue-cookie --save
    为项目配置全局 vue-cookie
    import VueCookie from 'vue-cookie'
    # 将插件设置给Vue原型,作为全局的属性,在任何地方都可以通过this.$cookie进行访问
    Vue.prototype.$cookie = VueCookie
    
    # 持久化存储val 的值到cookie中
    this.$cookie.set('val',this.val)
    #获取cookie中的val字段值
    this.$cookie.get('val')
    
    

    axios(ajax)

    安装axios 命令: npm install axios--save
    为项目配置全局axios
    import Axios from 'axios'
    Vue.prototype.$ajax=Axios
    
    #例
    methods:{
    
          'init':function(){
              var _this = this
              this.$http.request({
                  // 这个地址发送get请求,存在跨域问题,django 项目中配置中间件
                  url: 'http://127.0.0.1:7777/course/',
                  method:'get'
              }).then(function(response){
                  //response.data才是真正要的数据
                  // console.log(response.data)
                  // 把返回的数据赋值给course_list
                  _this.course_list=response.data
    
              })
          }
    

    VUE项目的目录结构

    执行项目两种方式:
    1.terminal: npm run serve
    2.Edit-conf-- 加号---Scripts(serve)
    
    目录结构:
    node_modules : 项目依赖(依赖的第三方组件)
    public: 
        favicon.ico: 网页图标
        index.html: 主页面 (VUE只有一个页面)
    src:
        assets: 放静态文件
        components: 小组件
        views: 页面组件
        App.vue: 主组件
        main.js : 项目主入口js
        router.js: 路由相关的,配置路由
        store.js: vuex相关,状态管理器
    package.json: 项目依赖
    
  • 相关阅读:
    将博客搬至CSDN
    U盘启动盘 安装双系统 详细教程
    vmware安装linux6.3
    hadoop学习之路
    linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存
    AVRO讲解
    MapReduce 工作原理
    lucene索引存储原理
    ES数据库系统
    分流器设备与交换机设备的区别
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10651253.html
Copyright © 2011-2022 走看看