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: 项目依赖
原文地址:https://www.cnblogs.com/Afrafre/p/10651253.html
时间: 2024-10-08 03:57:50