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: 项目依赖
原文地址:https://www.cnblogs.com/Afrafre/p/10651253.html