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: 項目依賴