当前位置: 首页 > news >正文

【Python】Redis数据库

Redis数据库

  • Unit01
  • 一、`Redis`
    • 1.1 概述
    • 1.2 安装
    • 1.3 `Redis-cli`
    • 1.4 数据类型
    • 1.5 字符处理
    • 1.6 键的命名规则
  • 二、通用命令
  • 三、字符串(`String`)
    • 3.1 概述
    • 3.2 常用命令
    • 3.3 应用场景
  • 四、列表(`List`)
    • 4.1 概述
    • 4.2 常用命令
  • 五、集合(`SET`)
    • 5.1 概述
    • 5.3 常用命令
  • 六、有序集合
    • 6.1 概述
    • 6.2 常用命令
  • 七、哈希(`Hash`)
    • 7.1 概述
    • 7.2 常用命令
  • 八、数据类型的应用场景
  • Unit02
  • 一、`Redis`模块
    • 1.1 概述
    • 1.2 安装
    • 1.2 构造函数
    • 1.4 通用方法
    • 1.5 字符串
    • 1.6 列表
  • 二、缓存
    • 2.1 概述
    • 2.2 缓存方式
      • 2.2.1 本地内存缓存
      • 2.2.2 数据库缓存
      • 2.2.3 文件缓存
    • 2.3 缓存实现
      • 2.3.1 视图缓存
      • 2.3.2 模板片断缓存
      • 2.3.3 底层缓存`API`
  • 三、`Django-Redis`
    • 3.1 概述
    • 3.2 安装
    • 3.3 作为 `cache backend` 使用配置
    • 3.4 原生客户端使用

Unit01

一、Redis

1.1 概述

Redis是一款开源的、高性能的key-value数据库,它支持数据的持久化,并可以将数据保存在内存或磁盘中。

Redis支持多种数据结构,包括字符串、列表、集合和有序集合等。它还支持数据备份和集群化操作,可以提高系统的可用性和易用性。

Redis是一个非常流行的数据存储系统,被广泛应用于缓存、消息队列、计数器、排行榜等场景。

Redis的官网地址为:https://redis.io/

1.2 安装


# 安装
$ sudo apt install redis-server#检查 Redis 是否已经安装成功
redis-cli ping

1.3 Redis-cli

Redis-cliRedis的命令行接口,可以让用户直接在命令行终端中与Redis数据库进行交互。

在交互模式下,Redis-cli具有基本的行编辑功能,以提供熟悉的输入体验,其语法结构为:


redis-cli [OPTIONS] [cmd [arg [arg ...]]]

常用的redis-cli选项及其含义如下:

参数含义
-h <host>连接的Redis实例的主机,默认为127.0.0.1
-p <port>Redis实例的端口,默认为6379
-a <password>Redis实例的认证密码
-n <db>Redis实例的数据库编号,默认为0
--raw以原始格式输出 Redis 命令的结果


$ redis-cli -h 127.0.0.1 -p 6379 -n 2

知识回顾:登录MySQL服务器


$ mysql -u用户名 -p密码 -P端口号 -h服务器地址 -D数据库名称

默认情况下,Redis实例有16个数据库,编号从015。可以使用SELECT命令在不同的数据库之间进行切换

SELECT命令的语法结构为:


SELECT dbid

Redis的配置文件为redis.conf

Redis 的默认配置文件通常位于 /etc/redis/usr/local/etc 目录


# 停止Redis服务器
$ sudo systemctl stop redis-server# 启动Redis服务器
$ sudo systemctl start redis-server# 重新启动Redis服务器
$ sudo systemctl restart redis-server

1.4 数据类型

Redis 支持多种数据类型,常用的数据类型有:

● 字符串(string

● 列表(list

● 集合(set

● 有序集合(sorted set

● 哈希(hash

1.5 字符处理

redis-cli命令行中,空格会被认为是两个参数之间的分隔符,所以输入包含空格或不可打印字符的字符串值时,要使用带引号的字符串。引号可以使用单引号或者双引号。

双引号字符串支持以下转义序列:

\"- 双引号

\n- 换行

\r- 回车

\t- 水平制表符

\b- 退格键

\a- 警报

\\- 反斜杠

单引号仅允许以下转义序列:

\'- 单引号

\\- 反斜杠

1.6 键的命名规则

● 键名应该以英文字母开头,不能以数字或特殊字符开头

● 键名中只能出现小写字母、数字、英文点号(.)和英文半角冒号(😃

● 避免特殊字符,如下划线、空格、换行、单双引号以及其他转义字符

● 键名应该具有可读性和可管理性,

● 建议使用业务模块名、业务逻辑含义和value类型来命名键,以便更好地区分不同的键

如:


user:12345:name:表示用户 ID 为 12345 的用户的名称
product:67890:price:表示产品 ID 为 67890 的产品的价格
cart:54321:items:表示购物车 ID 为 54321 的购物车中的商品列表

二、通用命令

KEYS

KEYS命令用于查找符合指定模式的键,其语法结构是:


KEYS pattern

其中,pattern 可以包括一些通配符,如:

● 星号(*)匹配任意数量的字符

● 问号(?) 匹配任意一个字符

● 方括号([abc]) 匹配任意一个列在方括号中的字符

\ 用作转义字符,比如查找包含实际星号*的键名

DEL

DEL命令用于删除指定的键,如果指定键不存在,则被忽略。其语法结构是:


DEL key [key ...]

FLUSHDB

FLUSHDB命令用于删除当前数据库中的所有键


FLUSHDB

示例代码如下:


SET a 1
SET b 2 
SET c 3
KEYS * 
# 1) "b"
# 2) "c"
# 3) "a"
DEL a
# (integer) 1
FLUSHDB
# OK

EXISTS

EXISTS命令用于检测指定的键是否存在,其语法结构是:


EXISTS key [key ...]

若键存在返回1,否则返回0

EXPIRE

EXPIRE命令用于设置键的过期时间,其语法结构是:


EXPIRE key seconds 

示例代码如下:


EXPIRE username 600
#(integer) 1EXPIRE tarena 600
# (integer) 0

EXPIREAT

EXPIREAT命令用于设置键的过期时间,其语法结构是:


EXPIREAT key unix-time-seconds 

MOVE

MOVE命令用于将当前数据库的键移动到指定的数据库中,其语法结构是:


MOVE key db

RENAME

RENAME命令用于修改指定的键名,其语法结构是:


RENAME key newkey

RENAMENX

RENAMEEX命令用于仅当newkey不存在时,才将key更名为newkey,其语法结构是:


RENAMENX key newkey

TYPE

TYPE命令用于返回键所存储的值的数据类型,其语法结构是:


TYPE key

TTL

TTL命令用于返回指定键的剩余的生存时间(单位为秒),其语法结构是:


TTL key

关于TTL命令的返回值

返回值说明
-2指定键不存在
-1未关联生存时间
整数剩余的生存时间

示例代码如下:


TTL a
# (integer) -1
TTL d
#(integer) 3
TTL d
#(integer) -2

PTTL

PTTL命令用于返回指定键的剩余的生存时间(单位为毫秒),其语法结构是:


PTTL key

关于PTTL命令的返回值

返回值说明
-2指定键不存在
-1未关联生存时间
整数剩余的生存时间

SORT

SORT命令用于为列表、集合或者有序集合进行排序,其语法结构为:


SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern...]] [ASC | DESC] [ALPHA] [STORE destination]

三、字符串(String)

3.1 概述

Redis中的字符串是最基本的数据结构之一,可以存储任何类型的数据,包括文本、序列化对象和二进制数据。每个字符串都有一个键来标识它,这个键是唯一的。Redis中的字符串是二进制安全的,这意味着Redis可以存储和处理任何类型的二进制数据。

Redis字符串的最大长度是512MB。这意味着,每个字符串对象的大小不能超过512MB

3.2 常用命令

SET

SET命令用于将字符串值value关联到key,如果key已经存在,则覆盖旧值,其语法结构是:


SET key value [NX | XX] [EX seconds | PX milliseconds][KEEPTTL]

选项说明

选项说明
NX(Not Exist)只有指定键不存在时才进行设置操作,只能添加不能更新
XX(Exist)只有指定键存在时才进行设置操作,只能更新不能添加
EX seconds(EXExpire)设置生命周期时间,单位为秒
PX milliseconds(PXPixels)设置生周期时间,单位为毫秒
KEEPTTL保留与键相关的生命周期,适用于更新操作时

Pixels是图像中最小的单位,而毫秒是时间中最小的单位,因此Redis将毫秒称为时间中的"像素"

示例代码如下:


SET username Rose
SET age 23
SET password 123456#失败,因为username的key已经存在
SET username NX Frank#成功,因为username的key已经存在
SET username David XX
SET salary 4856.32 EX 30#查看salary key的生命周期
TTL salary
SET salary 5000 KEEPTTL#再次查看salary key的生命周期
TTL salary# 在key mobile_13800138000 不存在时才为其赋值为 2369,并且设置生命周期为300秒SET mobile_13800138000 2369 NX EX 300

关于SET命令的返回值

返回值描述
OK正常执行SET命令
nil在执行NXXX选项后,条件不符合时

GET

GET命令用于返回 key 所关联的字符串值,如果 key 不存在将返回 nil ,其语法结构是:


GET key

示例代码如下:


GET username# 将返加nil
GET mobile

MSET

MSET命令用于同时设置一个或多个 key-value 对,其语法结构是:


MSET key value [key value ...]

示例代码如下:


MSET mobile 13800138000 verify 6379

MGET

MGET命令用于返回所有指定的keyvalue。对于不是string类型的key或者指定key不存在时,将返回nil,其语法结构是:


MGET key [key ...]

示例代码如下:


MGET mobile verify

MSETNX

MSETNX命令用于当且仅当所有给定 key 都不存在时才设置一个或多个 key-value 对,其语法结构是:


MSETNX key value [key value ...]

示例代码如下:


MSETEX mobile 13800138000 verify 6379 
返回值描述
1所有值都设置成功时
0至少有一个值设置失败时

INCR

INCR命令用于将指定键存储的数字值加1,返回值为累加后的结果,其语法结构是:


INCR key

示例代码如下:


INCR age

INCRBY

INCRBY命令用于将指定的键存储的数字值加上增量值,返回值为累加后的结果,其语法结构是:


INCRBY key increment

示例代码如下:


INCRBY age 5

INCRBYFLOAT

INCRBYFLOAT命令用于将指定键存储的值加上或者减去指定指定的浮点增量值,返回值为累加后的结果,其语法结构是:


INCRBYFLOAT key increment

示例代码如下:


INCRBYFLOAT salary 450.79

DECR

DECR命令用于将指定键存储的数字值减1,返回值为累加后的结果,其语法结构是:


DECR key

示例代码如下:


DECR age

DECRBY

DECRBY命令用于将指定的键存储的数字值减去增量值,返回值为累加后的结果,其语法结构是:


DECRBY key decrement

示例代码如下:


DECRBY age 3

示例代码


SET age 23
# OKSET salary 3679.45
# OKINCR age
#(integer) 24INCR age
#(integer) 25INCRBY age 3
#(integer) 28INCRBYFLOAT salary 0.01
# "3679.45999999999999996"INCRBYFLOAT salary -0.01
# "3679.44999999999999996"

APPEND

APPEND命令用于将value追加到指定键的未尾,并返回字符串的新长度,其语法结构是:


APPEND key value

示例代码如下:


SET username Tom
append username AID
#(integer) 6

STRLEN

STRLEN命令用于返回指定键所存储的字符串的长度,其语法结构是:


STRLEN key

GETRANGE

GETRANGE命令用于返回部分字符串,其语法结构是:


GETRANGE key start end

示例代码如下:


SET str "This is a string"GETRANGE str 0 3GETRANGE str -3 -1GETRANGE str 0 -1GETRANGE str 10 100

3.3 应用场景

● 缓存

● 计数器

● 分布式锁

● 会话存储

四、列表(List)

4.1 概述

列表是一个有序的字符串列表,可以存储一组字符串。Redis列表的底层实现采用了双向链表,因此可以在列表的两端进行快速的插入和删除操作。

Redis列表是一个非常灵活和强大的数据结构,可以用于实现队列、栈和发布订阅等功能。

列表最多可以存储 2^32-14294967295)个元素,这是由于Redis使用32位有符号整数来保存列表的长度。


SELECT 1

4.2 常用命令

LPUSH

LPUSH命令用于将一个或多个值插入到列表的头部,并返回列表的长度,若列表不存在将自动创建之。其语法结构是:


LPUSH key element [element ...]

示例代码如下:


LPUSH databases MySQL 'SQL Server' Oracle DB2  

RPUSH

RPUSH命令用于将一个或多个值插入到列表的尾部,并返回列表的长度,若列表不存在将自动创建之,其语法结构是:


RPUSH key element [element ...]

示例代码如下:


RPUSH databases MariaDB PostgreSQL

LRANGE

LRANGE命令用于获取列表指定范围内的元素,其语法结构是:


LRANGE key start stop

示例代码如下:


LRANGE databases 0 -1LRANGE databases 2 4LRANGE databases -3 -1LRANGE databases 10 5

如果start参数超过列表总长度,则返回empty array

LLEN

LLEN命令用于获取列表的长度,其语法结构是:


LLEN key

示例代码如下:


LLEN databases

LPUSHX

LPUSHX命令用于将一个或多个值插入到已存在的列表头部,并返回列表的长度,其语法结构是:


LPUSHX key element [element ...]

示例代码如下:


LPUSHX databases SQLite

RPUSHX

RPUSHX命令用于将一个或多个值插入到已存在的列表尾部,并返回列表的长度,其语法结构是:


RPUSHX key element [element ...]

示例代码如下:


RPUSHX databases Sybase

LINSERT

LINSERT命令用于在参考点之前或之后插入元素,其语法结构是:


LINSERT key <BEFORE | AFTER> pivot element

示例代码如下:


LINSERT databases AFTER 'SQL Server' Informix

LSET

LSET命令用于通过索引设置列表元素的值,其语法结构是:


LSET key index element

示例代码如下:


LSET databases 2 'Oracle Database'

LINDEX

LINDEX命令用于获取列表中指定索引的元素的值,其语法结构为:


LINDEX key index

示例代码如下:


LINDEX databases 2

LPOP

LPOP命令用于移除并返回列表中的第一个元素,其语法结构是:


LPOP key

示例代码如下:


LPOP databases

RPOP

RPOP命令用于移除并返回列表中的最后一个元素,其语法结构是:


RPOP key 

示例代码如下:


RPOP databases

BRPOP

BRPOP命令用于移除并返回列表中的最后一个元素,如果列表不存在元素时会阻塞为指定时长,其语法结构为


BRPOP key [key ...] timeout

示例代码如下:


BRPOP databases 3  

BLPOP

RRPOP命令用于移除并返回列表中的第一个元素,如果列表不存在元素时会阻塞为指定时长,其语法结构为:


BLPOP key [key ...] timeout

示例代码如下:


BLPOP databases 3  

LREM

LREM命令用于删除列表中的元素,其语法结构为:


LREM key count element

关于count选项说明如下:

count选项说明
count > 0从头到尾删除指定元素
count < 0从尾到头删除指定元素
count = 0删除所有指定元素

LTRIM

LTRIM命令用于对列表进行修剪–只保留指定区间内的元素,其语法结构为:


LTRIM key start stop

五、集合(SET)

5.1 概述

集合是一个无序的、唯一的字符串集合,可以存储多个字符串。Redis集合的底层实现采用了哈希表,因此可以在常数时间内执行添加、删除和查找操作。

Redis集合是一个非常灵活和强大的数据结构,可以用于实现标签、好友关系和推荐等功能。

集合的最大成员数为2^32-1(即4294967295),每个集合最多可以存储40多亿个成员。


SELECT 2

5.3 常用命令

SADD

SADD命令用于向集合添加一个或多个成员,其语法结构是:


SADD key member [member ...]

示例代码如下:


SADD friends:user1 沧海 沙粒 圣女果 刘召 芬达 刀锋 秋天SADD friends:user2 战士 秋天 小烟一叼 沧海 田儿 斯威 顺期自然

SMEMBERS

SMEMBERS命令用于返回集合中的所有成员,其语法结构是:


SMEMBERS key

示例代码如下:


SMEMBERS friends:user1
SMEMBERS friends:user2

SREM

SREM命令用于从集合中删除一个或多个成员,其语法结构是:


SREM key member [member ...]

SPOP

SPOP命令用于移除并返回集合中的一个或多个随机元素,其语法结构是:


SPOP key [count]

SISMEMBER

SISMEMBER命令用于返回指定元素是否为集合中的成员,其语法结构是:


SISMEMBER key member

示例代码如下:


SISMEMBER friends:user1 田儿 
SISMEMBER friends:user2 田儿 

SRANDMEMBER

SRANDMEMBER命令用于返回集合中一个或多个随机成员,其语法结构是:


SRANDMEMBER key [count]

示例代码如下:


SRANDMEMBER friends:user1 2

SMOVE

SMOVE命令用于将指定成员从源集合移动到目标集合,其语法结构是:


SMOVE source destination member

示例代码如下:


SMOVE friends:user1 friends:user2 刘召

SDIFF

SDIFF命令用于返回指定集合的差集,其语法结构是:


SDIFF key [key ...]

SINTER

SINTER命令用于返回指定集合的交集,其语法结构是:


SINTER key [key ...]

示例代码如下:


SINTER friends:user1 friends:user2

SUNION

SUNION命令用于返回指定集合的并集,其语法结构是:


SUNION key [key ...]

SUNIONSTORE

SUNION命令用于返回指定集合的并集并存储到目标集合,其语法结构是:


SUNIONSTORE destination key [key ...]

SINTERSTORE

SINTERSTORE命令用于返回指定集合的交集并存储到目标集合,其语法结构是:


SINTERSTORE destination key [key ...]

SDIFFSTORE

SDIFFSTORE命令用于返回指定集合的差集并存储到目标集合,其语法结构是:


SDIFFSTORE destination key [key ...]

标签案例

每个商品可以有多个标签,而每个标签可以对应多个商品。使用 Redis 的无序集合来实现这个功能:


SADD tag:电脑	  1001 1002 1003 1004 1005 1006 1007 1008 1009 10010
SADD tag:游戏本  1003 1005 1007 1009 10010
SADD tag:超级本  1001 1002 1005 1008# 超级本 与 游戏本的交集SINTER tag:游戏本 tag:超级本# 其他类型的电脑
SDIFF tag:电脑 tag:游戏本 tag:超级本

六、有序集合

6.1 概述

有序集合是一个有序的、唯一的字符串集合,可以存储多个字符串,并为每个字符串关联一个分数。Redis有序集合的底层实现采用了跳跃表和哈希表,因此可以在对数时间内执行添加、删除和查找操作。

Redis有序集合是一个非常灵活和强大的数据结构,可以用于实现排行榜、计数器和时间序列等功能。

Redis有序集合的最大成员数为2^32-1(即4294967295),每个有序集合最多可以存储40多亿个成员。


SELECT 3

6.2 常用命令

ZADD

ZADD命令用于向有序集合添加一个或多个成员或者更新已存在成员的分数,其语法结构是:


ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
选项说明
NX仅在元素存在时进行创建操作
XX仅在元素不存在时进行创建操作
CH更新成员的分数值
INCR添加新成员时是否自动将其分数与现有分数相加

示例代码如下:


ZADD audience:1  8.2 singer1 8.5 singer2 9.0 singer3
ZADD audience:2  8.5 singer1 8.3 singer2 8.8 singer3
ZADD judger:1 7.8 singer1 8.3 singer2 8.8 singer3
ZADD judger:2 8.1 singer1 7.6 singer2 8.9 singer3

ZRANGE

ZRANGE命令用于返回有序集合内指定区域内的成员,其语法结构是:


ZRANGE key start stop [WITHSCORES]

示例代码如下:


ZRANGE audience:1 0 -1 WITHSCORES

ZCOUNT

ZCOUNT命令用于计算有序集合中指定区间分数的成员数量,其语法结构是:


ZCOUNT key min max

示例代码如下:


ZCOUNT audience:1 7 8.5

ZSCORE

ZSCORE命令用于返回有序集合中成员的分数值,其语法结构是:


ZSCORE key member

示例代码如下:


ZSCORE audience:1 singer3

ZREM

ZREM命令用于移除有序集合中的一个或多个成员,其语法结构是:


ZREM key member [member ...]

ZPOPMIN

ZPOPMIN命令用于删除最小分数的成员,其语法结构是:


ZPOPMIN key [count]

ZPOPMAX

ZPOPMAX命令用于删除最大分数的成员,其语法结构是:


ZPOPMIN key [count]

ZINCRBY

ZINCRBY命令用于有序集合中对指定成员的分数加上增量值,其语法结构是:


ZINCRBY key increment member

ZINTERSTORE

ZINTERSTORE命令用于计算指定的一个或多个有序集合中的交集并存储到目标集合,其语法结构是:


ZINTERSTORE destination numkeys key [key ...] 
[WEIGHTS weight [weight ...]] 
[AGGREGATE <SUM | MIN | MAX>]

示例代码如下:


ZINTERSTORE ranks 4 audience:1 audience:2 judger:1 judger:2 WEIGHTS 1 1 2 2 AGGREGATE SUM

ZUNIONSTORE

ZUNIONSTORE从用于指定指定的一个或多个有序集合的并集并存储到目标有序集合中,其语法结构是:


ZUNIONSTORE destination numkeys key [key ...] 
[WEIGHTS weight [weight ...]] 
[AGGREGATE <SUM | MIN | MAX>]

七、哈希(Hash)

7.1 概述

哈希是一个键值对集合,可以存储多个键值对。Redis哈希的底层实现采用了哈希表,因此可以在常数时间内执行添加、删除和查找操作。

Redis哈希是一个非常灵活和强大的数据结构,可以用于实现对象存储、缓存和计数器等功能。


SELECT 3

7.2 常用命令

HSET

HSET命令用于为哈希中的一个或多个字段设置值,其语法结构是:


HSET key field value [field value ...]

示例代码如下:


HSET user:1 id 5 username Rose age 25HSET  buyer_tom 6 "1,14,1"  3 "3,8199,1"

HSETNX

HSETNX 命令用于为哈希中的一个字段设置值,仅当该字段不存在时才设置成功。其语法结构是:


HSETNX key field value

示例代码如下:


HSETNX user:1 salary 4578.31

HGET

HGET命令用于获取指定字段的值,其语法结构是:


HGET key field

示例代码如下:


HGET user:1 username

HMGET

HMGET命令用于获取哈希中指定字段的值,其语法结构为:


HMGET key field [field ...]

示例代码如下:


HMGET user:1 id username

HGETALL

HGETALL命令用于获取哈希中指定键的所有字段和值,其语法结构是:


HGETALL key

示例代码如下:


HGETALL user:1

HKEYS

HKEYS命令用于获取哈希中所有的字段,其语法结构为:


HKEYS key

示例代码如下:


HKEYS user:1

HVALS

HVALS命令用于获取哈希中所有字段的值,其语法结构是:


HVALS key

示例代码如下:


HVALS user:1

HSTRLEN

HSTRLEN命令用于返回哈希中指定字段值的长度,其语法结构是:


HSTRLEN key field

HSTRLEN user:1 username

HINCRBY

HINCRBY命令用于为指定字段加上增量值,其语法结构是:


HINCRBY key field increment

示例代码如下:


HINCRBY user:1 age 1

HINCREBYFLOAT

HINCRBYFLOAT命令用于为指定字段的浮点数值加上增量值,其语法结构是:


HINCRBYFLOAT key field increment

示例代码如下:


HINCRBYFLOAT user:1 salary 500

HDEL

HDEL命令用于删除一个或多个哈希字段,其语法结构是:


HDEL key field [field ...]

示例代码如下:


HDEL user:1 sex

HEXISTS

HEXISTS命令用于返回是否存在指定字段,其语法结构是:


HEXISTS key field

示例代码如下:


HEXISTS user:1 id

HLEN

HLEN命令用于获取哈希中字段的数量,其语法结构为:


HLEN key

示例代码如下:


HLEN user:1

八、数据类型的应用场景

数据类型应用场景
String缓存、计数器、分布式锁等
List消息队列、任务队列、最新消息列表等
Set标签、好友关系、推荐等
Sorted Set排行榜、计数器、时间序列等
Hash对象存储、缓存、计数器等

Unit02

一、Redis模块

1.1 概述

Redis模块 是 Redis 的官方 Python 客户端,用于与 Redis 服务器进行交互。它提供了一组简单而强大的 API,可以方便地进行连接、数据读写、事务、管道等操作。

1.2 安装

Redis模块版本Redis版本
3.5.3<= 6.2
>= 4.5.05.0 ~ 7.0
>= 5.0.05.0 ~ 现在

$ sudo pip3 install redis

1.2 构造函数


import redis
redis.Redis(host='localhost',port=6379,db=0,password=None,decode_responses=False)

Redis获取取出的结果默认是字节,可以设定 decode_responses=True 改成字符串

示例代码如下:


import redisr = redis.Redis(host='localhost',db=0,port=6379,password=None,decode_responses=True)

1.4 通用方法

delete()

delete()方法用于删除一个或多个指定名称的键,其语法结构为:


Redis.delete(*names)

示例代码如下:


r.delete('usesrname')

select()

select()方法用于打开数据库,其语法结构为:


Redis.select(index)

示例代码如下:


r.select(4)

keys()

keys()方法用于以列表形式返回匹配指定模式的键,其语法结构为:


Redis.keys(pattern="*")

示例代码如下:


r.keys()
r.keys(pattern = '?a*')

exists()

exists()方法用于返回指定键存在的数量,其语法结构为:


Redis.exsits(*names)

示例代码如下:


r.exists('id','username','members')

expire()

expire()方法用于设置键的生命周期,其语法结构为:


Redis.expire(name=name,time=expire)

示例代码如下:


r.expire(name='username',time=86400)

expireat()

expireat()方法用于设置键的生命周期,其语法结构为:


Redis.expireat(name=name,when=when)

示例代码如下:


import time
timestamp = int(time.time()) + 86400
r.expireat(name='id',when=timestamp)

move()

move()方法用于将当前数据库的键移动到指定的数据库中,其语法结构为:


Redis.move(name=name,db)

示例代码如下:


r.move(name='id',db=2)

rename()

rename()方法用于用于修改指定的键名,其语法结构为:


Redis.rename(src,dst)

示例代码如下:


r.rename('databases','database')

renamenx()

renamenx()方法用于仅当dst不存在时,才将src更名为dst,其语法结构为:


Redis.renamenx(src,dst)

示例代码如下:


r.renamenx('databases','database')

type()

type()方法用于返回键所存储的值的数据类型,其语法结构为:


Redis.type(name)

示例代码如下:


r.type(name='username')

ttl()

ttl()方法用于用于返回指定键的剩余的生存时间(单位为秒),其语法结构为:


Redis.ttl(name)

示例代码如下:


r.ttl(name='username')

pttl()

pttl()方法用于返回指定键的剩余的生存时间(单位为毫秒),其语法结构为:


Redis.pttl(name)

示例代码如下:


r.pttl(name='username')

1.5 字符串

set()

set()方法用于将字符串值value关联到key,如果key已经存在,则覆盖旧值,其语法结构为:


Redis.set(name=KeyT,value=EncodableT,ex=None,px=None,nx=False,XX=False,keepttl=False)

示例代码如下:


r.set(name='username',value='Rose')
r.set(name='password',value='123456',ex=86400)

get()

get()方法用于返回 key 所关联的字符串值,其语法结构为:


Redis.get(name=Key)

示例代码如下:


r.get(name='username')

mset()

mset()方法用于同时设置一个或多个 key-value 对,其语法结构为:


Redis.mset(mapping={})

示例代码如下:


r.mset(mapping={'id':1,'age':25})

mget()

mget()方法用于返回所有指定的keyvalue,其语法结构为:


Redis.mget(keys=str|list)

示例代码如下:


r.mget('id','username')r.mget(keys=['id','username','password'])

msetnx()

msetnx()方法用于当且仅当所有给定 key 都不存在时才设置一个或多个 key-value 对,其语法结构为:


Redis.msetnx(mapping={})

示例代码如下:


r.mset(mapping={'salary':5600,'mobile':'13800138000'})

incr()

incr()方法用于将指定键存储的数字值累加指定量值,其语法结构为:


Redis.incr(name=key,amount=1)

示例代码如下:


r.incr(name='age')

incrby()

incrby()方法用于将指定键存储的数字值累加指定量值,其语法结构为:


Redis.incrby(name=key,amount=1)

示例代码如下:


r.incrby(name='age',amount=2)

incrbyfloat()

incrbyfloat()方法用于将指定键存储的值加上或者减去指定指定的浮点增量值,其语法结构为:


Redis.incrbyfloat(name=key,amount=1.0)

示例代码如下:


r.incrbyfloat(name='salary',amount=566.30)

decr()

decr()方法用于将指定键存储的数字值累减指定量值,其语法结构为:


Redis.decr(name=key,amount=1)

示例代码如下:


r.decr(name='age')

decrby()

decrby()方法用于将指定键存储的数字值累减指定量值,其语法结构为:


Redis.decrby(name=key,amount=1)

示例代码如下:


r.decrby(name='age',amount=2)

append()

append()方法用于将value追加到指定键的未尾,并返回字符串的新长度,其语法结构为:


Redis.append(key=key,value=value)

示例代码如下:


r.append(key='password',value='78')

strlen()

strlen()方法用于返回指定键所存储的字符串的长度,其语法结构为:


Redis.strlen(key=key)

示例代码如下:


r.strlen(key='username')

getrange()

1.6 列表

lpush()

lpush()方法用于将一个或多个值插入到列表的头部,并返回列表的长度,其语法结构为:


Redis.lpush(name, *values)

示例代码如下:


r.lpush('databases','MySQL','Oracle')

rpush()

rpush()方法用于将一个或多个值插入到列表的尾部,并返回列表的长度,其语法结构为:


Redis.rpush(name, *values)

示例代码如下:


r.rpush('databases','MariaDB','SQL Server')

lrange()

lrange()方法用于获取列表指定范围内的元素,其语法结构为:


Redis.lrange(name, start, end)

示例代码如下:


databases = r.lrange('databases', 0, -1)
print(databases)

llen()

llen()方法用于获取列表的长度,其语法结构为:


Redis.llen(name)

示例代码如下:


len = r.llen('databases')
print(f'共有{len}个元素')

lpushx()

lpushx()方法用于将一个或多个值插入到已存在的列表头部(如果name存在),并返回列表的长度,其语法结构为:


Redis.lpushx(name, *values)

示例代码如下:


r.lpushx('students', 'Tom', 'John')

rpushx()

rpushx()方法用于将一个值插入到已存在的列表尾部(如果name存在),并返回列表的长度,其语法结构为:


Redis.rpushx(name, value)

示例代码如下:


r.rpushx('students', 'Rose')

linsert()

linsert()方法用于在参考点之前或之后插入元素,其语法结构为:


Redis.linsert(name, where, refvalue, value)

示例代码如下:


r.linsert('students','AFTER','Tom','Ben')

lset()

lset()方法用于通过索引设置列表元素的值,其语法结构为:


Redis.lset(name, index, value)

示例代码如下:


r.lset('students',2,'Brandi')

lindex()

lindex()方法用于获取列表中指定索引的元素的值,其语法结构为:


Redis.lindex(name, index)

示例代码如下:


print(r.lindex('students',-1))

lpop()

lpop()方法用于移除并返回列表中的第一个元素,其语法结构为:


Redis.lpop(name)

示例代码如下:


first = r.lpop('students')
print(first)

rpop()

rpop()方法用于移除并返回列表中的最后一个元素,其语法结构为:


Redis.rpop(name)

示例代码如下:


last = r.rpop('students')
print(last)

blpop()

blpop()方法用于移除并返回列表中的第一个元素,如果列表不存在元素时会阻塞为指定时长,其语法结构为:


Redis.blpop(keys, timeout=0)

示例代码如下:


import time
print(time.time())
r.blpop(['countries','students'],3)
print(time.time())

brpop()

brpop()方法用于移除并返回列表中的最后一个元素,如果列表不存在元素时会阻塞为指定时长,其语法结构为:


Redis.brpop(keys, timeout=0)

示例代码如下:


import time
print(time.time())
r.brpop('countries',3)
print(time.time())

lrem()

lrem()方法用于删除列表中的元素,其语法结构为:


Redis.lrem(name, count, value)

ltrim()

ltrim()方法用于对列表进行修剪–只保留指定区间内的元素,其语法结构为:


Redis.ltrim(name, start, end)

二、缓存

2.1 概述

缓存是一种牺牲存储空间来换取访问时间的技术。

缓存可以将计算结果或数据存储在高速存储器中,以便提高访问速度,它可以提高应用程序的性能和响应速度。

Web 应用程序中,缓存通常用于存储动态页面和静态资源(例如图像、样式表和 JavaScript 文件)的副本,以便在下一次请求时快速提供这些内容。
在这里插入图片描述

Django所提倡缓存思想:

given a URL, try finding that page in the cache
if the page is in the cache:return the cached page
else:generate the pagesave the generated page in the cache (for next time)return the generated page

2.2 缓存方式

Django提供了多种缓存方式,包括:

• 本地内存缓存:将缓存数据存储在本地内存中,适用于小规模应用程序和开发环境

• 数据库缓存:将缓存数据存储在关系数据库中,适用于需要持久化缓存数据的应用程序

• 文件缓存:将缓存数据存储在本地文件系统中,适用于需要在多个服务器之间共享缓存数据的应用程序

Memcached 缓存:将缓存数据存储在 Memcached 缓存服务器中,适用于需要高性能缓存的大型应用程序

Redis 缓存:将缓存数据存储在 Redis 缓存服务器中,适用于需要高性能缓存和高级缓存功能的应用程序

2.2.1 本地内存缓存

settings.py中关于本地内存缓存的配置如下:

CACHES = {'memory': {# 缓存类型为本地内存缓存'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# 缓存提供了一个唯一的名称'LOCATION': 'unique-snowflake',# 存数据的过期时间(单位为秒),默认为 None,即永久存储'TIMEOUT': 300,# 缓存选项'OPTIONS': {# 限制缓存中的最大条目数'MAX_ENTRIES': 1000,# 当达到 MAX_ENTRIES 时,被删除的条目的比例。实际比例是 1 / CULL_FREQUENCY'CULL_FREQUENCY':3            },}
}

2.2.2 数据库缓存

settings.py中关于数据库缓存的配置如下:

CACHES = {'database': {# 缓存类型为数据库缓存'BACKEND': 'django.core.cache.backends.db.DatabaseCache',# 缓存数据表的名称'LOCATION': 'my_cache_table',# 存数据的过期时间(单位为秒),默认为 None,即永久存储'TIMEOUT': 300,# 缓存选项'OPTIONS': {# 限制缓存中的最大条目数'MAX_ENTRIES': 1000,# 当达到 MAX_ENTRIES 时,被删除的条目的比例。实际比例是 1 / CULL_FREQUENCY'CULL_FREQUENCY':20            },}
}

创建缓存数据表:


python3 manage.py createcachetable

2.2.3 文件缓存

settings.py中关于文件缓存的配置如下:

CACHES = {'file': {# 缓存类型为数据库缓存'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',# 缓存数据文件夹的名称'LOCATION': BASE_DIR / 'caches',# 存数据的过期时间(单位为秒),默认为 None,即永久存储'TIMEOUT': 300,# 缓存选项'OPTIONS': {# 限制缓存中的最大条目数'MAX_ENTRIES': 1000,# 当达到 MAX_ENTRIES 时,被删除的条目的比例。实际比例是 1 / CULL_FREQUENCY'CULL_FREQUENCY':3},}
}

2.3 缓存实现

Django中实现缓存的方法有:视图缓存、模板片断缓存、底层缓存API

2.3.1 视图缓存

django.views.decorators.cache 定义了一个 cache_page 装饰器,它将自动缓存视图的响应:

from django.views.decorators.cache import cache_page@cache_page(60 * 15)
def view_func(request):...

如果许多 URL 指向相同的视图,每个 URL 将被单独缓存

也可以在 URLconf 中指定视图缓存:

from django.views.decorators.cache import cache_pageurlpatterns = [path('foo/<int:code>/', cache_page(60 * 15)(view_func)),
]

2.3.2 模板片断缓存

实现模板片断缓存需要以下两个步骤:

第一步:通过{% load cache %} 标签用于加载缓存模板标签库,其语法结构为:

{% load cache %}
<html><head>...</head><body>...</body>
</html>

第二步:通过{% cache %}标签设置缓存片断及时效时间,其语法结构为:

{% cache [expire_time] [cache_key] %}Cached content goes heres
{% endcache %}

其中:

expire_time 参数指定了缓存数据的过期时间(单位为秒),默认为 None,即永久缓存

cache_key 参数指定缓存数据的键,用于将缓存数据与特定的视图或模板片段关联起来

通过传递一个或多个附加参数,参数可能是带有或不带过滤器的变量:

{% load cache %}
{% cache 500 sidebar request.user.username %}.. sidebar for logged in user ..
{% endcache %}

2.3.3 底层缓存API

可以通过django.core.cache.caches 对象访问在 CACHES 配置的缓存:

from django.core.cache import caches
cache1 = caches['myalias']
cache2 = caches['myalias']

django.core.cache.cache作为快捷方式,默认缓存可以通过 django.core.cache.cache 引用:

from django.core.cache import cache

这个对象等价于 caches['default']

set()

set()方法用于存储指定键的缓存数据。可以指定缓存数据的过期时间,其语法结构是:

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

get()

get()方法用于获取指定键的缓存数据。如果缓存不存在,则返回默认值,其语法结构是:

cache.get(key, default=None, version=None)

add()

add()方法用于存储指定的缓存数据。如果缓存已经存在,则不进行任何操作,其语法结构是:

cache.add(key, value, timeout=None, version=None)

get_many()

get_many()方法用于获取多个键的缓存数据。返回一个字典,包含所有存在的缓存数据,其语法结构是:

cache.get_many(keys, version=None)

set_many()

set_many()方法用于存储多个键的缓存数据,其语法结构是:

cache.set_many(data, timeout=None, version=None)

delete()

delete()方法用于删除指定键的缓存数据,其语法结构是:

cache.delete(key, version=None)

delete_many()

delete_many()方法用于删除多个键的缓存数据,其语法结构是:

cache.delete_many(keys, version=None)

clear()

clear()方法用于删除所有缓存数据,其语法结构是:

cache.clear()

三、Django-Redis

3.1 概述

django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cachen 后端的全功能组件。

3.2 安装


$ pip3 install django-redis

3.3 作为 cache backend 使用配置


CACHES = {# 别名"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/1","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}},
}

3.4 原生客户端使用

在某些情况下你的应用需要进入原生 Redis 客户端使用一些 django cache 接口没有暴露出来的进阶特性. 为了避免储存新的原生连接所产生的另一份设置, django-redis 提供了方法 get_redis_connection(alias) 使你获得可重用的连接字符串.


from django_redis import get_redis_connection
conn = get_redis_connection("default")

相关文章:

【Python】Redis数据库

Redis数据库 Unit01一、Redis1.1 概述1.2 安装1.3 Redis-cli1.4 数据类型1.5 字符处理1.6 键的命名规则 二、通用命令三、字符串(String)3.1 概述3.2 常用命令3.3 应用场景 四、列表(List)4.1 概述4.2 常用命令 五、集合(SET)5.1 概述5.3 常用命令 六、有序集合6.1 概述6.2 常用…...

理解并应用:JavaScript响应式编程与事件驱动编程的差异

背景介绍 在现代JavaScript开发中&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;和事件驱动编程&#xff08;Event-Driven Programming&#xff09;是两种非常重要且常用的编程范式。虽然它们都用于处理异步操作&#xff0c;但在理念和实现方式上存在显…...

第4天:用户认证系统实现

第4天&#xff1a;用户认证系统实现 目标 实现用户认证系统&#xff0c;包括用户注册、登录、登出和密码管理。 任务概览 使用Django内置的用户认证系统。创建用户注册和登录表单。实现用户登出和密码重置功能。 详细步骤 1. 使用Django内置的用户认证系统 Django提供了…...

PostgreSQL源码分析 —— FunctionScan

本文分析一下FunctionScan的源码&#xff0c;加深一下理解。以SELECT * FROM generate_series(2,4);为例进行分析。 postgrespostgres# SELECT * FROM generate_series(2,4);generate_series -----------------234 (3 rows)postgrespostgres# explain SELECT * FROM generate…...

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…...

SpringBoot三层架构

目录 一、传统方式 二、三层架构 三、代码拆分 1、dao层 2、service层 3、control层 四、运行结果 一、传统方式 上述代码存在一定的弊端&#xff0c;在进行软件设计和软件开发中提倡单一责任原则&#xff0c;使代码的可读性更强&#xff0c;复杂性更低&#xff0c;可扩展性…...

uniapp微信小程序局部刷新,无感刷新,修改哪条数据刷新哪条

uniapp做微信小程序时&#xff0c;一个商品列表滑到几百条数据时&#xff0c;点进去详情跳转去编辑信息上下架等&#xff0c;修改完成回来商品列表就到第一条数据了&#xff0c;这样页面效果体验感不是很好&#xff0c;是因为我们把数据接口放在onshow中了&#xff0c;每次回来…...

golan的雪花id

今天记录一下 golang的雪花id golang的雪花id 还是比较简单的&#xff0c;其包含的含义以及组成我这就不讲了&#xff0c;好多大佬都有文章写过&#xff0c;我直接上怎么用 先 引入包 go get "github.com/bwmarrin/snowflake" 代码块 func main() {// 设置一个时…...

RK3568 CAN波特率500K接收数据导致CPU4满载

最近调试RK3568 CAN时发现&#xff0c;当CAN作为接收端&#xff0c;在快速接收数据时会导致cpu4满载。down掉can口或者断开外设时恢复正常。并且问题只是在部门CPU版本上出现。在CAN接收中断中打印log&#xff0c;能发现log是按照接收数据的时间打印的。 驱动(rockchip_canfd…...

AI实战 | 使用元器打造浪漫仪式小管家

浪漫仪式小管家 以前我们曾经打造过学习助手和待办助手,但这一次,我们决定创造一个与众不同的智能体,而浪漫将成为我们的主题。我们选择浪漫作为主题,是因为我们感到在之前的打造过程中缺乏了一些仪式感,无法给对方带来真正的惊喜。因此,这一次我们计划慢慢调试,将它发…...

什么是隐马尔可夫模型?

文章目录 一、说明二、玩具HMM&#xff1a;5′拼接位点识别三、那么&#xff0c;隐藏了什么&#xff1f;四、查找最佳状态路径五、超越最佳得分对齐六、制作更逼真的模型七、收获 关键词&#xff1a;hidden markov model 一、说明 被称为隐马尔可夫模型的统计模型是计算生物学…...

qt中使用qsqlite连接数据库,却没有在本地文件夹中生成db文件

exe运行起来之后&#xff0c;发现没有在exe文件夹下生成数据库文件&#xff0c;&#xff0c;之前可以&#xff0c;但中间莫名其妙不行了&#xff0c;代码如下 // 建立和SQlite数据库的连接database QSqlDatabase::addDatabase("QSQLITE");// 设置数据库文件的名字da…...

Django的‘通用视图TemplateView’

使用通用视图的好处是&#xff1a;如果有一个html需要展示&#xff0c;不需要写view视图函数&#xff0c;直接写好url即可。 使用通用视图的步骤如下&#xff1a; 1、编辑项目urls.py文件 from django.views.generic import TemplateView 在该文件的映射表中添加&#xff1a…...

java功能实现在某个时间范围之内输出true,不在某个范围输出false,时间精确到分钟

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DateTimeChecker { private static final Logger log LoggerFactory.getLogger(DateTimeChecker.class); /** * 检查当前时间是否在指定的小时和分钟范围内。 * * param startHour 开…...

macbook屏幕录制技巧,这2个方法请你收好

在当今数字化时代&#xff0c;屏幕录制成为了一项不可或缺的技能&#xff0c;无论是教学演示、游戏直播&#xff0c;还是软件操作教程&#xff0c;屏幕录制都能帮助我们更直观地传达信息。MacBook作为苹果公司的标志性产品&#xff0c;其屏幕录制功能也备受用户关注。本文将详细…...

vue-loader

Vue Loader 是一个 webpack 的 loader&#xff0c;它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件 起步 安装 npm install vue --save npm install webpack webpack-cli style-loader css-loader html-webpack-plugin vue-loader vue-template-compiler webpack…...

IO系列(十) -TCP 滑动窗口原理介绍(上)

一、摘要 之前在上分享网络编程知识文章的时候&#xff0c;有网友写下一条留言&#xff1a;“可以写写一篇关于 TCP 滑动窗口原理的文章吗&#xff1f;”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清…...

IPython 使用技巧整理

IPython 是一个增强的 Python 交互式 shell&#xff0c;提供了许多实用的功能和特性&#xff0c;使得 Python 编程和数据科学工作变得更加便捷和高效。以下是一些 IPython 的使用技巧整理&#xff1a; 1. 自动补全和查询 Tab 补全&#xff1a;在 IPython 中&#xff0c;你可以…...

Python 引入中文py文件

目录 背景 思路 importlib介绍 使用方法 1.导入内置库 importlib.util 2.创建模块规格对象 spec importlib.util.spec_from_file_location("example_module", "example.py") 3.创建模块对象 module importlib.util.module_from_spec(spec) …...

qt 实现模拟实际物体带速度的移动(水平、垂直、斜角度)——————附带完整代码

文章目录 0 效果1 原理1.1 图片旋转1.2 物体按照现实中的实际距离带真实速度移动 2 完整实现2.1 将车辆按钮封装为一个类&#xff1a;2.2 调用方法 3 完整代码参考 0 效果 实现后的效果如下 可以显示属性&#xff08;继承自QToolButton&#xff09;: 鼠标悬浮显示文字 按钮…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...