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:\aaa\bbb
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

vue-cookie

# 项目创建好以后,项目所在目录安装
安装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: 项目依赖

redis数据库-VUE创建项目的更多相关文章

  1. VUE创建项目

    Vue Cli项目搭建     vue项目需要自建服务器:node 什么是node: 用C++语言编写,用来运行JavaScript语言 node可以为前端项目提供server (包含了socket) ...

  2. vue 创建项目

    先安装node.js环境 #先安装npm 阿里镜像 (之后cnpm 下载组件快速) npm install -g cnpm --registry=https://registry.npm.taobao ...

  3. vue自学入门-2(vue创建项目)

    本人也是刚学习VUE,边找资料,边学习,边给大家分享.1.创建项目 2.启动项目 3.注意上面和下面全部用cnpm

  4. vue 创建项目的命令

    1 cmd   创建项目 找到指定目录 vue create test   或   vue ui  (可视化创建)推荐 ---------------------------------------- ...

  5. Vue创建项目配置

    前言 安装VS Code,开始vue的学习及编程,但是总是遇到各种各样的错误,控制台语法错误,格式错误.一股脑的袭来,感觉创建个项目怎么这个麻烦.这里就讲一下vue的安装及创建. 安装环境 当然第一步 ...

  6. Redis数据库之编程项目及练习资源

    实训项目 :   NOSQL数据库设计与应用实训         注释:   Redis数据库编程项目示例及练习资源 项目源码获取: https://pan.baidu.com/s/19f0F7cmx ...

  7. vue创建项目(推荐)

    上一节我们介绍了vue搭建环境的情况,并使用一种方式搭建了一个项目,在这里为大家推荐另一种创建项目的方式. vue init webpack-simple vuedemo02 cd vuedemo02 ...

  8. vue创建项目步骤

    # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project ...

  9. Vue创建项目环境

    目录 Vue项目环境搭建 Vue项目创建 pycharm配置并启动vue项目 vue项目目录结构分析 vue组件(.vue文件) 全局脚本文件main.js(项目入口) 改写 Vue项目环境搭建 &q ...

随机推荐

  1. Connector for Python

    连接mysql, 需要mysql connector, conntector是一种驱动程序,python连接mysql的驱动程序,mysql官方给出的名称为connector/python, 可参考m ...

  2. django admin使用-后台数据库管理界面

    admin是django提供的基于web的管理数据库的工具,它是django.contrib 的一部分,可以在项目的settings.py中的INSTALLED_APPS看到. 一.admin管理工具 ...

  3. sshpass安装使用

    部署sshpass1.下载wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz 2. ...

  4. harbor pull 失败

    STep1: 显示下面的错误 Error response from daemon: unknown: The image is not signed in Notary Step2: 这儿暂时不要选 ...

  5. websocket --- 05 . http与websocket

    一.http协议 1.基于 TCP 协议 2.一次请求 一次响应 断开 3.客户端永远处于主动状态 4.服务器永远处于被动状态 5.Http无状态 - 在服务器不保存客户端的信息 6.服务器无法主动找 ...

  6. mybatis配置与使用

    一:Mybatis简介 1.名称由来 Mybatis原名叫ibatis.Mybatis一开始属于Apache,2010年从Apache转移到了GoogleCode这个组织中. 2.Mybatis概念 ...

  7. xshell终端向远程服务器上传文件方法

    centos-7下在本地终端里向远程服务器上传文件,在命令行中执行的软件. 安装命令如下: 在终端里输入如下命令: 会弹出如下窗口 选择你要上传的文件即可上传成功.

  8. wireshark基础学习—第一部分wireshark的基础知识

    1.Wireshark主窗口 Wireshark的主窗口如下所示 2.每个面板的内容 Packet List(数据包列表): 最上面的面板用表格显示了当前不惑文件中的所有数据包,其中包括了数据包序号. ...

  9. 关于 Expression is not assignable 错误

    1.在 Build Phases中导入  UIKit.framework 2.在pch中导入头文件 #import <UIKit/UIKit.h> 3.写一个分类 即可解决 贴出分类代码 ...

  10. 2018.11.30开始学习shader

    学习资料: 乐乐女神的<unity Shader入门精要>