Python3.8.8-Django3.2-Redis-连接池-数据类型-字符串-list-hashmap-命令行操作

news2024/10/7 14:25:37

文章目录

    • 1.认识Redis
      • 1.1.优点
      • 1.2.缺点
    • 2.在Django中Redis的连接
    • 3.Redis的基础用法
      • 3.1.hashmap结构
      • 3.2.list结构
    • 4.命令行查看数据库
    • 5.作者答疑

1.认识Redis

Remote DIctionary Server(Redis) 是一个key-value 存储系统,是跨平台的非关系型数据库。是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

1.1.优点

它是内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。支持事务。
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

1.2.缺点

数据存储在内存,主机断电则数据丢失。
存储容量受到物理内存的限制,只能用于小数据量的高性能操作。
在线扩容比较困难,系统上线时必须确保有足够的空间。
用于缓存时,易出现’缓存雪崩‘,’缓存击穿‘等问题。

2.在Django中Redis的连接

安装Redis组件: Django4.0才原生支持Redis,Django3.2中需要通过第三方组件库进行配置。

pip install django-redis			# 安装Redis缓存后端 (基于并自动安装redis-py驱动)

编写Redis配置: 在Django项目配置文件的CACHES配置字典中进行缓存系统、客户端连接参数或连接池连接参数。

#配置缓存
CACHES = {
    'default': {
        'VERSION': 1,                                           # 默认缓存版本
        'KEY_PREFIX': 'ZhiLiaoAI',                              # 默认缓存前缀,推荐用项目名
        'TIMEOUT': 60 * 5,                                      # 默认过期时间,300秒
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': ['redis://127.0.0.1:6379/1', ],    			# 服务器列表,第一个为主服务器,其余为副本服务器
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': '',
            'SOCKET_CONNECT_TIMEOUT': 5,                        # 秒级连接超时时间
            'SOCKET_TIMEOUT': 5,                                # 秒级读写超时时间
            'IGNORE_EXCEPTIONS': True,                          # 是否忽略连接异常
            'CONNECTION_POOL_KWARGS': {                         # redis.ConnectionPool的参数
                'max_connections': 100,                         # 连接池最大数量
            }
        }
    }
}

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

#DJANGO_REDIS_LOGGER = 'logger_name'                             # 使用哪个日志记录器记录忽略的异常
DJANGO_REDIS_IGNORE_EXCEPTIONS = True                           # 是否忽略所有缓存的连接异常
DJANGO_REDIS_LOG_IGNORED_EXCEPTIONS = True                      # 是否在忽略异常时通过日志记录该异常

[注意事项] 提交到缓存系统中的value值必须为pickable的.

3.Redis的基础用法

在使用过程中,首先注意编码问题,可以指定代码为utf-8,如下所示:

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
from web import models
from django.core.cache import cache
from django_redis import get_redis_connection

# Create your views here.
def index(request):
    redis_conn = get_redis_connection("default")
    redis_conn.set("name", "中国")
    print(str(redis_conn.get("name"),'utf-8'))#解码
    return HttpResponse("Hello world ! ");

永不超时设置
django-redis 支持永不超时设置。 其表现和 django backend 指定的相同:
timeout=0 立即过期
timeout=None 永不超时

cache.set("key", "value", timeout=None)

locks
django-redis 支持 redis 分布式锁. 锁的线程接口是相同的, 因此你可以使用它作为替代.
使用 python 上下文管理器分配锁的例子:

with cache.lock("somekey"):
    do_some_thing()

数据类型
redis是一种高级的键值对key:value存储系统,非关系型数据库(Nosql),其中value支持五种数据类型:
1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)

3.1.hashmap结构

redis-hash函数常用操作方法:
1.hset(name, key, value) ---- 更新一条数据的属性,没有则新建
2.hget(name, key) ---- 读取这条数据的指定属性, 返回字符串类型
3.hmset(name, mapping) ---- 批量更新数据(没有则新建)属性
4.hmget(name, keys, *args) ---- 批量读取数据(没有则新建)属性
5.hgetall(name) ---- 获取这条数据的所有属性和对应的值,返回字典类型
6.hkeys(name) ---- 获取这条数据的所有属性名,返回列表类型
7.hdel(name, *keys) ---- 删除这条数据的指定属性

import redis
  
r = redis.Redis(host="127.0.0.1", port=6379, db=0)
# 新建一条键名为"123456"的数据, 包含属性attr_1
r.hset("123456", "attr_1", 100)
# 更改键名为"123456"的数据, 更改属性attr_1的值
r.hset("123456", "attr_1", 200)
  
# 取出属性attr_1的值
attr_1 = r.hget("123456", "attr_1")
  
# 输出看一下(发现属性值已经为str)
print "-- get attr_1:", attr_1
  
# 属性集合
attr_dict = {
    "name": "常成功",
    "alias": "常城",
    "sex": "male",
    "height": 175,
    "postal code": 100086,
    "Tel": None,
}
# 批量添加属性
r.hmset("123456", attr_dict)
  
# 取出所有数据(返回值为字典)
h_data = r.hgetall("123456")
  
# 输出看一下(取出来的时候都变成了str)
print("-- get all attr:", h_data)
  
# 删除属性(可以批量删除)
r.hdel("123456", "Tel")
  
# 取出所有属性名
h_keys = r.hkeys("123456")

3.2.list结构

  1. lpush命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行lpush操作。 当 key 存在但不是列表类型时,返回一个错误。执行lpush命令后,返回列表的长度。
print(r.lpush("1",1))  #输出的结果是1
print(r.lpush("1",1))  #输出的结果是2
print(r.lpush("1",2,3,4))  #输出的结果是5

print(r.set("2",1))   #输出的结果是 True
print(r.lpush("2",2))     #输出的结果是 redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value,原因是键 2 是字符串类型,我们用list中的lpush给他添加元素
  1. rpush命令用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。执行rpush操作后,列表的长度。
print(r.rpush("2",1))     #输出的结果是1
print(r.rpush("2",2,3))   #输出的结果是3
print(r.rpush("2",4,5))  #输出的结果是5
  1. blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。如果列表为空,返回一个 None 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
print(r.rpush("3",1,2,3,4,5,6,))      #输出的结果是6
print(r.blpop("3"))                   #输出的结果是('3', '1')
print(r.blpop("3"))                   #输出的结果是('3', '2')
print(r.blpop("3"))                   #输出的结果是('3', '3')
print(r.blpop("4",timeout=2))         #因为键 4 不存在,所以2秒后输出的结果是None
  1. Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。假如在指定时间内没有任何元素被弹出,则返回一个None 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
print(r.rpush("4",1,2,3,4,5,6,))       #输出的结果是6
print(r.brpop("4"))       #输出的结果是('4', '6')
print(r.brpop("4"))       #输出的结果是('4', '5')
print(r.brpop("4"))       #输出的结果是('4', '4')
print(r.brpop("5",timeout=2))       #因为键 4 不存在,所以2秒后输出的结果是None
  1. llen命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
print(r.llen("8"))       #key 不存在,输出的结果是0
print(r.rpush("8",1))    #输出的结果是1
print(r.llen("8"))       #输出的结果是1
print(r.rpush("8",2,3))  #输出的结果是3
print(r.llen("8"))       #输出的结果是3
  1. lrange返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
print(r.rpush("11",1,2))       #输出的结果是2
print(r.rpush("11",3,4))       #输出的结果是4
print(r.lrange("11",0,-1))     #输出的结果是['1', '2', '3', '4']
print(r.lrange("11",1,2))      #输出的结果是['2', '3']
  1. lset通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行lset时,返回一个错误。操作成功返回True,否则返回错误信息。
print(r.rpush("13",1,2,3,4))     # 输出的结果是4
print(r.lset("13",1,5))          # 输出的结果是True
print(r.lrange("13",0,-1))       # 输出的结果是['1', '5', '3', '4']

4.命令行查看数据库

redis的数据库个数是可以配置的,默认为16个。对应数据库的索引值为0 - (databases -1),即16个数据库,索引值为0-15。默认使用第0个数据库,可使用select进行数据库切换(redis命令是不区分大小写的),当切换db成功时,可以看到当前使用的是哪一个db。双击打开安装路径下的redis-cli.exe。然后输入命令:

select 1 #切换到1号数据库,默认

del key #删除key

flushall #清空数据库

结果如下图所示:
在这里插入图片描述

5.作者答疑

如有疑问,欢迎留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux入门篇-Linux目录结构

简介 简单介绍Linux目录。 Linux的⽬录结构 “/”表示根⽬录,根⽬录是Linux⽬录结构中的最顶级的⽬录,类似于windows的C:\ D:\ /boot⽬录:存放的是系统的启动配置⽂件和内核⽂件 /dev⽬录:存放的是Linux的设备⽂件 /etc⽬录&…

Nacos新手详细知识大全

官网&#xff1a;Spring Cloud Alibaba一、Nacos快速入门1.1 服务注册到Nacos1.1.1 配置**引入com.alibaba.cloud&#xff0c;**以后的版本就不用操心了<!-- com.alibaba.cloud--><!-- com.alibaba.cloud--><dependency><groupId>com.alibaba.cloud<…

SpringCloud之 LoadBalancer负载均衡

文章目录LoadBalancer 负载均衡一、LoadBalanced 负载均衡二、自定义负载均衡三、OpenFeign 实现负载均衡①添加依赖②启动类添加 EnableFeignClients③创建客户端接口 UserClient④service业务中调用客户端接口提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud…

pv和pvc

一、PV和PVC详解当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…

【Python】torch.einsum()解析

【Python】torch.einsum()解析 文章目录【Python】torch.einsum()解析1. 介绍2. 示例2.1 Pytorch矩阵乘法2.2 Numpy高阶张量3. 参考1. 介绍 爱因斯坦简记法&#xff1a;是一种由爱因斯坦提出的&#xff0c;对向量、矩阵、张量的求和运算 ∑\sum∑ 的求和简记法。在该简记法当中…

链表面试题

链表面试题1. 删除链表中等于给定值 val 的所有结点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。4. 输入一个链表&#xff0c;输出该链表中倒数第k个结点。5. 将两个有…

延时任务的四种实现方式

什么是延迟任务&#xff1f;顾明思议&#xff0c;我们把需要延迟执行的任务叫做延迟任务。延迟任务的使用场景有以下这些&#xff1a;红包 24 小时未被查收&#xff0c;需要延迟执退还业务&#xff1b;每个月账单日&#xff0c;需要给用户发送当月的对账单&#xff1b;订单下单…

计算机网络之MAC和IP地址

MAC地址 在局域网中&#xff0c;硬件地址&#xff0c;又称为物理地址或MAC地址。 目前现在的局域网中实际上使用的都是6字节的MAC地址&#xff0c;所以每一个以太网设备都具有唯一的MAC地址。 MAC地址的格式 假设传输使用的是IP数据&#xff0c;V2的MAC帧较为简单&#xff…

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube

需求描述 公司为项目代码配置了Sonar检测&#xff0c;希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9&#xff0c;否则SonarLint无法连接&#xff08;GitHub-SonarLint-Wiki第一行就有说明&#xff09;&#xff01;&#xff01;&#xff01;S…

【前端】一个更底层库-React基础知识点第2篇

目录属性状态PROPSPROP VALIDATIONSTATEFORMCONTROLLED COMPONENTSMIXINCOMPONENT APICOMPONENT LIFECYCLETOP API上一篇文章也是React基础知识点&#xff0c;了解到了React是什么&#xff1f;为什么要使用React&#xff1f;还知道了JSX概述&#xff0c;JSX嵌入变量&#xff0c…

python Django中的cookies和session会话保持技术

cookies和session都是为了保持会话状态而诞生的两个存储技术会话定义&#xff1a; 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话HTTP协议是无状态的&#xff0c;导致会话状态难以保持Cookies-定义 cookies是保存在客户端浏览器上的…

超简单的卷积和加法融合

神经网络的优化除了之前提到的一些硬件优化手段(AI硬件加速拾遗)之外&#xff0c;还有很多图层方面的优化手段。大家好啊&#xff0c;我是董董灿。 而且图层方面的优化&#xff0c;有时效果更佳。往往一个有效的优化&#xff0c;甚至可以“消除”掉一个算子的存在。 这里的“…

Vue组件-$refs、$nextTick和name属性的使用

Vue组件-$refs和$nextTick使用一、获取DOM二、$refs获取组件对象三、$nextTick异步更新DOM四、组件name属性的使用一、获取DOM 通过id或ref属性获取原生DOM 在mounted生命周期 – 2种方式获取原生DOM标签 目标标签 – 添加id / ref恰当时机, 通过id / 通过ref属性 获取目标标签…

Ubuntu系统新硬盘挂载

Ubuntu系统新硬盘挂载 服务器通常会面临存储不足的问题&#xff0c;大部分服务器都是ubuntu系统&#xff0c;该篇博客浅浅记载一下在ubuntu系统上挂载新硬盘的步骤。本篇博文仅仅记载简单挂载一块新的硬盘&#xff0c;而没有对硬盘进行分区啥的。如果需要更加完善的教程&#…

【C++】平衡二叉搜索(AVL)树的模拟实现

一、 AVL树的概念 map、multimap、set、multiset 在其文档介绍中可以发现&#xff0c;这几个容器有个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树…

Java文档搜索引擎总结

Java文档搜索引擎总结项目介绍项目使用的技术栈前端页面展示后端逻辑部分索引部分搜索模块部分Web模块部分项目介绍 Java文档搜索引擎项目是一个SSM项目&#xff0c;该项目的前端界面部分是由搜索页面和展示页面组成&#xff0c;后端部分索引模块&#xff08;ScanAnalysis、in…

UNET 对 CARVANA 数据集的分割

目录 1. 介绍 2. UNET 网络 3. dataset 数据加载 4. utils 工具模块 4.1 get_loaders 函数 4.2 check_accuracy 函数 4.3 save_predictions_as_imgs 函数 4.4 完整代码 5. train 函数 5.1 关于导入的库文件 5.2 设置超参数 5.3 train_fn 训练一个epoch函数 5.4 m…

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

【Java基础】30分钟Git 从入门到精通

一、 版本控制工具1、什么是版本控制系统&#xff1f;版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且可以对…

主成分分析(PCA)方法 和协方差 相关系数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.主成分分析&#xff08;PCA&#xff09;方法2.算法步骤前言 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种数据降…