Redis:

  - nosql数据库,非关系型数据库

  - 支持5大数据类型 (字符串String,列表list、字典hash,集合set,zset)

    - 与之相似的有memcache,但memcache只支持string类型

  - 单进程单线程,好处在于不用考虑并发

Redis常用操作

from redis import Redis# from redis import ConnectionPool



conn = Redis()  # 实例化对象,创建连接对象

# conn.set('name','dxx')  # 单个插入

# for i in range(1,100):
# conn.set("the %s key"%i, 'the %s value'%i,ex=i) # 循环插入 # ret = conn.get("the 80 key") # 取不到是为None 无法指定默认值
#
# print(ret) # conn.set('name','希希') # 单个插入 中文会自动以utf8编码转码为bytes类型 #
# for i in range(1,100):
# conn.set("%skey"%i,'%svalue'%i) from app01.Redis_POOL import POOL # 连接池做成单例
conn = Redis(connection_pool=POOL) print(conn.get("name").decode("utf8")) # 字符串操作
conn.set('age',19,ex=10,xx=True) conn.setex('hobby',10,'basketball') # (key,time, value) # 批量添加,传字典
conn.mset({'k1':'v1','k2':'v2'}) # 批量取值
print([ res.decode("utf8") for res in conn.mget(['k1', 'k2'])]) # 追加
conn.setrange('k1',1,'pp') # 从索引1的位置往后覆盖 conn.set('k3','')
#
conn.setrange('k3',2,'') # 从索引2的位置往后覆盖
# #
print(conn.get('k3')) # 重点 (网站访问量) conn.incr('ask_total',amount=1) # 递增 可指定频率为负数,表示递减
conn.decr('ask_total') # 与上相反 conn.append('ask_total',22) # 向原有值后拼接 #hash操作 conn.hset('hax1','k1','v1') # 存
print(conn.hget("hax1", 'k1')) # 取 #批量存取
conn.hmset('hax1',{'k2':'v2','k3':'v3'})
print(conn.hmget('hax1', ['k1', 'k2',]))
print(conn.hmget('hax1', 'k1', 'k2')) # 内部做判断是否列表 print(conn.hgetall('hax1')) # {b'k1': b'v1', b'k2': b'v2', b'k3': b'v3'}
print(conn.hgetall('hax1')[b"k1"]) # b'v1' print(conn.hlen('hax1')) # 3 列表/数组长度 conn.hdel('hax1','k1') # 哈希删除
print(conn.hget('hax1','k1')) # 再查询 conn.hset('hax1','k2',22)
conn.hincrby('hax1','k2',amount=-10) # 哈希递增 或者递减
print(conn.hget('hax1','k2')) # 重点
hscan
hscan_iter for i in range(1,1000):
conn.hset('hax2','%skey'%i,'%svalue'%i) # match 过滤条件 模糊匹配,只有?和*两种模式,?表示匹配一个,*表示匹配多个count 取出数据个数 print(conn.hscan('hax2',10,match='350value',count=20)) # (26, {}) print(conn.hscan('hax2',10,match='',count=20)) # (26, {}) print(conn.hscan('hax2',10,match='350key',count=20)) # (26, {b'350key': b'350value'}) #
conn.hscan_iter('hax2',count=10) genrator = conn.hscan_iter('hax2',count=10) # 产生迭代器,迭代器能产生的数据不因count值而变化,
# count的作用是限制一次向redis要多少数据,用完了再要 print(genrator) # 打印的生成器内存地址 print('生成器长度:',len(list(genrator))) # 会取完hax2中所有的数据 for i in genrator:
  print(i) # 由于上方len(list(genrator))已经将生成器迭代完,故迭代器已经无元素可迭代,无值打印 # redis列表操作
conn.lpush('h1','') # 列表左追加
conn.rpush('h1','','') # 列表右追加 print(conn.linsert('h1','AFTER','',99)) # 在元素11后面插入99 print(conn.linsert('h1','AFTER','','')) # 在元素11前面插入99 #如果列表中有多个'11',那么插在第一个'11'的前面或者后面 print(conn.llen('h1')) conn.lset('h1',1,'') # 将索引为1的元素用'1111'替换 conn.lrem('h1',-5,11)
#lrem(name,count,value)
# count的正负表示从头开始还是从尾巴开始删除和value相同的值,0表示删除所有相同的
#count的数字表示删除几个 print(conn.lindex('h1', 3)) # 取列表索引为3的值 print(conn.lrange('h1', 1, 5)) #切片取值 取列表索引1-5的元素,闭区间 print(conn.lrange('h1',0,conn.llen('h1'))) # 取列表所有元素 #blpop 重点 print(conn.lpop('h1')) print(conn.lpop('h1')) # 从左删除一个元素 print(conn.rpop('h1')) # 从右删除一个元素 while True:
  print(conn.blpop('h1')) # 取完了会在这里阻塞,等待有下一个值被添加,你会不会想到队列呢?
                # 是的,它可以实现队列的效果,可以实现分布式
                # 可以同时开多个客户端去blpop,也可以同时开多个客户端去新增


# 自定义列表生成器
  - 如果列表非常庞大,一次性取出可能会撑爆内存,因此需要自定义列表生成器进行迭代取值 def scan_list(name,count=10):
index = 0
while True:
data_list = conn.lrange(name,index,count)
if not data_list:
return
index+= count
count+=index
for item in data_list:
yield item sa_list = scan_list('h1',5)
for i in sa_list:
print(i) conn.delete('name') # 删除 print(conn.exists('hax2')) # 返回0或1 print(conn.keys('k?')) # 模糊匹配,只有?和*两种模式,?表示匹配一个,*表示匹配多个
print(conn.keys('k*')) conn.rename('k1','kk') # 重命名 # 利用管道实现事务操作,redis没有自身事务操作,需借助管道实现
pipe = conn.pipeline(transaction=True)
pipe.multi()
pipe.set('name','egon')
pipe.lpush('h1','aa')
pipe.execute()

应用场景:

一、利用原生redis实现网站流量统计

由于是全局统计,Django中我们需要自定义中间件来实现

from redis import Redis
from django.middleware.common import MiddlewareMixin Conn = Redis()
class CountVisitorMiddle(MiddlewareMixin):
def process_request(self,request):
num = Conn.hget('count_visitor','number')
if num:
Conn.hset('count_visitor','number',int(num.decode("utf8"))+1)
else:
Conn.hset('count_visitor', 'number', 1)

配置文件中配置:

MIDDLEWARE = [
.......其他中间件.........
'app01.CountCustomerMiddleWare.CountVisitorMiddle',
]

视图函数中使用:

from django.shortcuts import render

# Create your views here.

from app01.redis_hander import Conn
def index(request):
visitor_number = Conn.hget('count_visitor','number').decode('utf8')
return render(request,"index.html",locals())

效果:

当然,django有更好的封装来让我们使用基于redis的缓存实现

二、利用Django基于redis的缓存实现网站流量统计

配置文件中配置缓存信息:

CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache", # cache存储引擎为redis数据库
"LOCATION": "redis://127.0.0.1:6379", # redis服务器地址
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100} # redis数据库连接池大小限制
# "PASSWORD": "123",
}
}
}

Redis内存数据库的基本语法的更多相关文章

  1. Redis内存数据库在Exchange会议室的应用

    本文论述了现有Exchange会议室应用现状和不足之处,并详细介绍了Redis内存数据库在Exchange会议室的应用,并给出了一种高性能的应用架构及采用关键技术和关键实现过程,最终实现大幅改进系统性 ...

  2. Redis内存数据库在Exchange会议室的整体应用架构

    注:本文是别人写的,感觉写得很好就转过来,版权归原作者所有哦,谁知道出处可以告诉我,谢谢. 根据以上的会议室应用现状分析,该架构的核心是把历史发生的会议室申请数据定时同步到Redis内存数据库中,对于 ...

  3. Redis学习总结(1)——Redis内存数据库详细教程

    1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数 ...

  4. 基于redis 内存数据库简单使用

    在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...

  5. redis内存数据库C客户端hiredis API 中文说明

    A)编译安装 make make install (/usr/local) make install PREFIX=$HOME/progs(可以自由指定安装路径) B)同步的API接口 redisCo ...

  6. Redis内存数据库快速入门

    Redis简介 Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理.它支持数据结构,如 字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的 ...

  7. $Django redis内存数据库 (知识回顾cmd切换目录)

    知识小回顾 #切换盘 C:\Users\WangDong>f: F:\> #切换文件 F:\>cd redis F:\redis> #返回上一级 F:\DJ\dj8>cd ...

  8. Redis学习之路(005)- redis内存数据库C客户端hiredis API 中文说明

    A)编译安装 make make install (/usr/local) make install PREFIX=$HOME/progs(可以自由指定安装路径) B)同步的API接口 redisCo ...

  9. Redis内存数据库操作命令详解

    一.连接操作相关的命令 Ÿ   quit:关闭连接(connection) Ÿ   auth:简单密码认证 二.对value操作的命令 Ÿ   exists(key):确认一个key是否存在 Ÿ   ...

随机推荐

  1. 二十七. Keepalived热备 Keepalived+LVS 、 HAProxy服务器

    1.Keepalived高可用服务器 proxy:192.168.4.5(客户端主机) web1:192.168.4.100(Web服务器,部署Keepalived高可用软件) web2:192.16 ...

  2. Linux文件系统属性权限chattr与lsattr命令

    有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux ...

  3. 模拟I2C协议学习点滴之复习三极管、场效应管

    晶体三极管分为NPN和PNP型两种结构形式,除了电源极性的不同工作原理是大致相同的.对于NPN管,它是由2块N型半导体夹着一块P型半导体所组成的,发射区与基区之间形成的PN结称为发射结,而集电区与基区 ...

  4. java.lang.OutOfMemoryError:PermGen space tomcat7 内存溢出

    Tomcat 解决 在启动项目的时候,会报java.lang.OutOfMemoryError:PermGen space错误. 在tomcat/bin/catalina.sh  windows li ...

  5. 找不到编译器:wepy-compiler-less

    npm install less 后再 npm install wepy-compiler-less 解决

  6. Java 【 ArrayList应用 】 (SDUT 4069 C~K的班级)

    Java 里面的所有的东西 数组.字符数组.等等,都要 new 新申请. C~K的班级 代码: package test; import java.util.*; public class Main ...

  7. 问题:python3 使用beautifulSoup时,出错UnicodeDecodeError: 'gbk' codec …….

    想将html文件转为纯文本,用Python3调用beautifulSoup 超简单的代码一直出错,用于打开本地文件: from bs4 import BeautifulSoup file = open ...

  8. 全国行政区域代码(免费来拿) xls格式 可直接导入

    全部区域代码 地址:https://pan.baidu.com/s/1Elz-zW_nLS8YR8GZAn3WRw 提取码:ze3s

  9. Tkinter 之CheckButton复选框标签

    一.参数说明 语法 作用 Checkbutton(root,text='xxxx') 复选框显示的文本 Checkbutton(root,variable=id) 通过变量的值确定哪些复选框被选中 C ...

  10. 为Python配置Vim编辑器(GUI/非GUI皆可)

    原文地址:https://blog.csdn.net/alanzjl/article/details/49383943 Vim as a python IDE ** 最近一直在写Python,但一直没 ...