【Redis】深入探索 Redis 的数据类型 —— 字符串 string
文章目录
- 前言
- 一、string 类型的操作命令
- 设置和获取相关命令
- 1. SET 和 GET
- 2. MSET 和 MGET
- 3. SETNX、SETEX、SETPX
- 计数相关命令
- 1. INCR 和 INCRBY
- 2. DECR 和 DECRBY
- 3. INCRBYFLOAT
- 字符串操作相关命令
- 1. APPEND
- 2. GETRANGE
- 3. SETRANGE
- 4. STRLEN
- string 相关命令总结
- 二、string 类型的编码方式
- 三、string 类型的使用场景
- 1. 缓存(Cache)
- 2. 计数(Counter)
- 3. 共享会话(Session)
- 4. 手机验证码
前言
string 字符串类型是 Redis 中最基础的数据类型,关于字符串类型需要注意以下几点:
- 在 Redis 中,所有的 key 的类型都是 string 类型的,并且其他几种数据类型也都是在字符串类型的基础上构建的,例如列表和集合的元素的类型都是字符串类型的。
- 在 Redis 中,字符串都是直接按照二进制的形式储存的,因此在使用 Redis 的时候,不需要像 MySQL 那样考虑编码问题(编码不匹配则会出现乱码)。所以 Redis 不会处理字符集的编码问题,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。
- Redis 中的 string 类型的值可以是字符串,JSON、XML格式的字符串,数字、整型、浮点数,甚至是二进制流数据,如图片、音频、视频等。不过一个 string 的最大值不能超过 512MB 。
一、string 类型的操作命令
设置和获取相关命令
1. SET 和 GET
a)SET:
SET 命令的作用是将 string 类型的 value 设置到 Redis 中。如果 key 在设置之前已经存在了,无论原来的数据类型是什么,都会覆盖原来的 value,并且 key 设置的 TTL 也会失效。
SET 的语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
选项说明:
EX seconds
:以秒为单位设置 key 的过期时间,相当于 EXPIRE;PX milliseconds
:以毫秒为单位设置 key 的过期时间,相当于 PEXPIRE;NX
:只有在 key 不存在的时候才进行设置,如果 key 之前已经存在了,则设置不会执行;XX
:只有在 key 存在的时候才进行设置,通过 key 之间不存在,则设置不会执行。
注意事项:
[]
之内的选项只能选择一个,[]
之间的选项则可以同时存在。即EX
和PX
选项不能同时存在,而NX
和XX
不能同时存在,因为它们之间是互斥关系。- 带选项的 SET 命令可以被 SETEX、PSETEX、SETNX等命令替代。
返回值:
- 如果设置成功,则返回 OK。
- 如果由于 SET 指定了 NX 或者 XX 选项但条件不满足,则执行失败,返回
nil
。
使用示例:
EX 和 PX:
NX 和 XX
SET
、SET NX
、SET XX
执行流程:
b)GET
GET 命令的作用是获取 key 对应 的 value。如果 key 不存在,就返回 nil
,如果 value 的数据类型不是 string,就会报错。
使用示例:
2. MSET 和 MGET
MSET 的作用是一次设置多个键值对;而 MGET 的作用是一次性获取多个 key 的 value,如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil
。
使用案例:
a)MSET:
b)MGET:
注意事项:
在前面的文章提到过,Redis 是处理任务是单线程的,并且 Redis 的客户端和服务端之间是通过网络进行通信的,因此要设置或者获取多个key 的时候,建议同时进行操作,以减少网络请求的次数。
3. SETNX、SETEX、SETPX
a)SETNX 命令的作用是在如果 key 不存在则设置,否则就不设置,例如:
b)SETEX 命令的作用是在设置 key 的时候指定秒级的过期时间
语法:
SETEX key seconds value
例如:
c)PSETEX 命令的作用是在设置 key 的时候指定毫秒级的过期时间
语法:
SETEX key milliseconds value
例如:
计数相关命令
1. INCR 和 INCRBY
INCR
INCR
命令的作用是将 key 对应的 string 表示的数字加一。
- 如果 key 不存在,则视为 key 对应的 value 的值为 0,然后再加一;
- 如果 key 对应的 value 不是一个整数或者其范围超出了 64 位有符号整型,则会报错;
- 如果
INCR
执行成功,则返回加一后的值,否则返回相应错误信息。
使用示例:
INCRBY
INCRBY
命令的作用是为 key 对应的 string 表示的整数加上一个指定的整数。
- 如果 key 不存在,则视为 key 对应的 value 的值为 0,然后再加指定的数;
- 如果 key 对应的 value 不是一个整数或者其范围超出了 64 位有符号整型,则会报错;
- 如果
INCRBY
执行成功,则返回相加后的值,否则返回相应错误信息。
使用示例:
2. DECR 和 DECRBY
DECR
DECR
命令的作用是将 key 对应的 string 表示的数字减一。
- 如果 key 不存在,则视为 key 对应的 value 的值为 0,然后再减一;
- 如果 key 对应的 value 不是一个整数或者其范围超出了 64 位有符号整型,则会报错;
- 如果
DECR
执行成功,则返回减一后的值,否则返回相应错误信息。
使用示例:
DECRBY
DECRBY
命令的作用是为 key 对应的 string 表示的整数减去一个指定的整数。
- 如果 key 不存在,则视为 key 对应的 value 的值为 0,然后再减指定的数;
- 如果 key 对应的 value 不是一个整数或者其范围超出了 64 位有符号整型,则会报错;
- 如果
DECRBY
执行成功,则返回相减后的值,否则返回相应错误信息; - 如果
DECRBY
指定要减去的是一个负数,则表示加上这个数。
使用示例:
3. INCRBYFLOAT
INCRBYFLOAT
命令的作用是将 key 对应的 string 表示的浮点数加上指定的数。
语法:
INCRBYFLOAT key increment
- 如果 key 不存在,则默认为0,然后在进行相加操作;
- 如果 key 对应的 string 不是一个数,则会报错
- 如果指定的数是负数,则表示减去这个数;
- 如果
INCRBYFLOAT
执行成功,则返回运算结果,否则返回错误信息; - 允许采用科学计数法表示浮点数。
使用示例:
字符串操作相关命令
1. APPEND
APPEND
命令的作用是中 key 对应的 string 后面追加字符串。
语法:
APPEND key value
- 如果 key 不存在,其效果等同于 SET 命令;
- 如果
APPEND
执行成功,则返回最终字符串的长度。
2. GETRANGE
GETRANGE
命令的作用是截取key 对应的 string 中的子串。
语法:
GETRANGE key start end
- 截取的内容由指定的偏移量 start 和 end 确定,并且区间是左右闭合的;
- 指定的偏移量可以是负数,当指定为负数时,表示的是倒数第几个字符,如 -1 表示倒数第一个字符;
- 超出范围的偏移量会根据 string 的长度调整成正确的值。
使用示例:
3. SETRANGE
SETRANGE
命令的作用是覆盖从指定位置开始的 key 对应 string 中的一部分。
语法:
SETRANGE key offset value
- 替换的长度为替换字符串的长度,如果原字符串后面的长度不足,则将后面的全部替换;
- 如果 key 不存在,并且指定替换的位置大于 0,则前面的位置由十六进制的 0 替换;
- 替换成功则返回最终字符串的长度。
4. STRLEN
STRLEN
命令的作用是获取 key 对应的 string 的长度。
语法:
STRLEN key
- 其返回值为字符串的长度;
- 如果 key 不存在,则返回 0;
- 如果 key 对应的 value 的类型不是 string 则会报错;
- 字符串的长度有当前编码规则所决定。
使用示例:
string 相关命令总结
以下是 Redis 中与 string 类型相关的命令的总结,包括命令、作用和时间复杂度:
命令 | 作用 | 时间复杂度 |
---|---|---|
SET | 设置key的值为指定字符串 | O(1) |
GET | 获取key对应的字符串值 | O(1) |
MSET | 批量设置多个键值对 | O(N)(N为键值对数量) |
MGET | 批量获取多个key的值 | O(N)(N为键的数量) |
SETNX | 仅当key不存在时设置值 | O(1) |
SETEX | 设置key的值和过期时间(秒) | O(1) |
PSETEX | 设置key的值和过期时间(毫秒) | O(1) |
INCR | 将key对应的数字值加一 | O(1) |
INCRBY | 将key对应的数字值加上指定整数 | O(1) |
DECR | 将key对应的数字值减一 | O(1) |
DECRBY | 将key对应的数字值减去指定整数 | O(1) |
INCRBYFLOAT | 将key对应的浮点数值加上指定浮点数 | O(1) |
APPEND | 在key对应的字符串值后追加字符串 | O(1) |
GETRANGE | 获取key对应的字符串的子串 | O(N)(N为子串长度) |
SETRANGE | 覆盖key对应字符串的部分内容 | O(N)(N为替换字符串长度) |
STRLEN | 获取key对应的字符串的长度 | O(1) |
二、string 类型的编码方式
在Redis中,字符串(string)类型的值可以使用多种不同的编码方式存储,具体的编码方式是根据数据的内容和大小来动态选择的,以最大程度地节省内存和提高性能。以下是Redis中字符串类型的常见编码方式:
-
RAW(简单动态字符串):这是最常见的字符串编码方式。它用于存储较短的字符串,长度不超过字符串编码结构的限制。这种编码方式不会对字符串进行压缩,因此在存储较小的字符串时效率高。
-
INT(整数编码):当一个字符串可以被解释为整数时,Redis会将其编码为整数,以节省内存。整数编码分为以下几种子编码方式:
- int16_t:16位整数编码,存储16位以内的整数。
- int32_t:32位整数编码,存储32位以内的整数。
- int64_t:64位整数编码,存储64位以内的整数。
-
EMBSTR(嵌套字符串编码):用于存储较短的字符串,但与RAW不同的是,EMBSTR的编码方式将字符串长度也一并存储在编码结构中,以节省内存。
-
RAW和EMBSTR共享编码:在某些情况下,Redis会使用一种特殊的编码方式,该方式可以共享RAW和EMBSTR编码方式的优点。这意味着它既可以存储较短的字符串,又可以高效地存储较大的字符串。
-
SDS(简单动态字符串):SDS是一种用于表示字符串的数据结构,它具有动态大小,可以在不需要重新分配内存的情况下进行扩展。这种编码方式用于存储较大的字符串,以节省内存和提高性能。
需要注意的是,Redis会根据字符串的内容和大小动态选择适当的编码方式,因此开发者无需手动指定编码方式。这种动态编码方式使得Redis能够在不同情况下充分利用内存,提高效率。
可以使用Redis的OBJECT ENCODING
命令来查看特定键的编码方式,例如:
OBJECT ENCODING mykey
这将返回键mykey
的编码方式。
例如:
三、string 类型的使用场景
1. 缓存(Cache)
由于 Redis 速度快的特点,因此常用于缓存功能。比较典型的缓存使用场景就是,Redis 作为缓冲层,MySQL 作为存储层,绝大部分请
求的数据都是从 Redis 中获取。由于 Redis 具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
Redis + MySQL 组成的缓存存储架构:
下面通过伪代码模拟了上图的业务数据的访问过程:
1)假设业务是根据用户的 uid 获取用户信息
UserInfo getUserInfo(long uid) {...
}
2)首先从 Redis 获取用户信息,我们假设用户信息保存在 “user:info:” 对应的键中
// 根据 uid 得到 Redis 的键
String key = "user:info:" + uid;
// 尝试从 Redis 中获取对应的值
String value = Redis 执⾏命令:get key;
// 如果缓存命中(hit)
if (value != null) {// 假设用户信息按照 JSON 格式存储UserInfo userInfo = JSON 反序列化(value);return userInfo;
}
3)如果没有从 Redis 中得到用户信息或者缓存未命中(miss),则进一步从 MySQL 中获取对应的信息,随后写入缓存并返回
// 如果缓存未命中(miss)
if (value == null) {// 从数据库中,根据 uid 获取⽤⼾信息UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>// 如果表中没有 uid 对应的⽤⼾信息if (userInfo == null) {// 响应 404return null;}// 将用户信息序列化成 JSON 格式String value = JSON 序列化(userInfo);// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒)Redis 执⾏命令:set key value ex 3600// 返回用户信息return userInfo;
}
通过增加缓存功能,在理想情况下,每个用户信息,一个小时期间只会有一次 MySQL 查询存在,极大地提升了查询效率,同时也降低了MySQL 的访问数。
PS: Redis 键名的设计原则和示例
- 业务名前缀:将键名以业务名开头,以便将不同业务或项目的键隔离开来。这有助于确保不同的应用程序或团队之间的键不会发生冲突。
示例:
user_info:6379
order_info:1234- 对象名:指定键名中的对象名,以描述存储的内容是什么。这有助于清晰地了解键存储的数据类型或业务对象。
示例:
user_profile:6379
product_catalog:5678- 唯一标识:如果需要,可以在键名中包含唯一标识符,以便更具体地标识存储的数据。这有助于将数据细分为不同的实体。
示例:
user:12345:profile
product:7890:details- 属性:如果数据具有多个属性,可以在键名中包含属性名称,以进一步细化键的用途。
示例:
user:12345:profile:name
product:7890:details:price- 键名缩写:如果键名变得过长,可以使用缩写来减少键名的长度,但要确保缩写对团队内部是清晰可理解的。
示例:
u:12345:pr:n(缩写版)通过使用这种键名命名空间约定,可以使Redis键更有组织,易于维护和管理。它还可以帮助避免键名冲突,特别是在多个应用程序或团队使用同一个Redis实例的情况下。但请注意,键名过长可能会导致性能下降,所以需要权衡键名的可读性和性能需求。
2. 计数(Counter)
计数(Counter)功能是Redis中常见且有用的功能之一,它可以用来快速记录和查询某个对象的计数值。这种功能在许多应用中都非常有用,例如网站的访问计数、点赞数、评论数、播放次数等。
例如记录视频播放次数:
伪代码:
// 在 Redis 中统计某视频的播放次数
long incrVideoCounter(long vid) {key = "video:" + vid;long count = Redis 执⾏命令:incr keyreturn counter;
}
然而,在实际开发一个成熟、稳定的计数系统时,会面临许多挑战和复杂性。以下是一些可能需要应对的挑战和考虑因素:
- 防作弊:确保计数系统不容易被恶意操纵是至关重要的。常见的防作弊措施包括限制每个用户或IP地址的计数速率,使用验证码或令牌来验证用户行为等。
- 按不同维度计数:有时需要按照不同的维度进行计数,例如按时间、地理位置、用户类型等。为了实现这种灵活性,需要设计适应性强的计数系统架构。
- 避免单点问题:单点故障可能会导致计数系统的不可用性。为了确保高可用性,可以考虑使用Redis的主从复制或集群模式,或者使用其他分布式计数系统。
- 数据持久化:Redis默认将数据存储在内存中,但为了持久化数据,可以将数据定期快照到磁盘或使用持久化选项,如AOF(Append-Only File)。
- 性能优化:处理大量计数请求可能会对性能造成压力。需要优化Redis配置、考虑使用缓存层、分布式计数系统或负载均衡策略,以应对高负载情况。
- 并发控制:并发操作可能导致计数不一致。要确保计数的原子性,可以使用Redis的事务或乐观锁等技术。
- 监控和日志:建立监控和日志系统,以实时追踪计数系统的性能和运行状况,以及检测潜在的问题。
- 容量规划:考虑计数系统的容量规划,包括数据存储需求、内存和硬盘空间等,以支持未来的增长。
- 数据清理:定期清理不再需要的计数数据,以防止数据膨胀和内存占用过多。
总之,开发一个真实的计数系统是一个复杂的任务,需要考虑众多因素。选择合适的技术栈、设计良好的架构、实施安全性和防作弊措施、确保高可用性以及建立监控和维护策略都是成功实现计数系统的重要步骤。这些挑战需要仔细的规划和实施,以满足特定项目的需求。
3. 共享会话(Session)
在一个分布式 Web 服务中,用户的会话信息通常存储在各自的服务器上,这包括用户的登录状态和其他会话相关数据。然而,由于负载均衡的需要,用户的请求会被分发到不同的服务器上,而不同服务器上的会话数据并不共享。
这就导致了一个问题:如果用户的请求被均衡到不同的服务器上,用户在刷新页面或发送下一个请求时可能会发现自己需要重新登录,这种体验对用户来说是不可接受的。
例如下图所示的 Session 分散储存:
为了解决这个问题,可以使用Redis将用户的 Session 信息进行集中管理。在这种模式下,只要确保 Redis 是高可用和可扩展的,不论用户被均衡到哪台 Web 服务器上,都可以集中从 Redis 中查询、更新Session信息。
4. 手机验证码
为了增强用户登录的安全性,许多应用会采取以下步骤:
- 在每次用户尝试登录时,要求用户输入其手机号,并通过向其手机发送验证码来进行二次验证。这个验证码需要用户再次输入,以确保登录请求来自于用户本人。
- 此外,为了防止滥用短信接口和提高安全性,通常会限制用户每分钟获取验证码的频率,例如,在一分钟内,同一手机号最多只能获取验证码5次。
这种流程可以有效地降低恶意登录和滥发验证码的风险,同时保障用户的账户安全。
短信验证码:
此功能可以用以下伪代码说明基本实现思路:
String 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使用 NX,只在不存在 key 时才能设置成功bool r = Redis 执行命令:set key 1 ex 60 nxif (r == false) {// 说明之前设置过该手机号的验证码了long c = Redis 执行命令:incr keyif (c > 5) {// 说明超过了一分钟 5 次的限制了// 限制发送return null;}}// 说明要么之前没有设置过手机号的验证码;要么次数没有超过 5 次String validationCode = 生成随机的 6 位数的验证码();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟(300 秒)内有效Redis 执行命令:set validationKey validationCode ex 300;// 返回验证码,随后通过手机短信发送给用户return validationCode;
}// 验证用户输入的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {validationKey = "validation:" + phoneNumber;String value = Redis 执行命令:get validationKey;if (value == null) {// 说明没有这个手机号的验证码记录,验证失败return false;}if (value == validationCode) {return true;} else {return false;}
}
以上介绍了使用 Redis 的字符串数据类型在缓存、计数、会话管理和手机验证码等场景中的应用。然而,Redis 的字符串类型的适用场景远不止这些,开发人员可以根据字符串类型的特点以及提供的命令,充分发挥自己的创造力和想象力,将其应用到各种业务场景中。
相关文章:

【Redis】深入探索 Redis 的数据类型 —— 字符串 string
文章目录 前言一、string 类型的操作命令设置和获取相关命令1. SET 和 GET2. MSET 和 MGET3. SETNX、SETEX、SETPX 计数相关命令1. INCR 和 INCRBY2. DECR 和 DECRBY3. INCRBYFLOAT 字符串操作相关命令1. APPEND2. GETRANGE3. SETRANGE4. STRLEN string 相关命令总结 二、strin…...

Linux操作命令笔记
Linux Linux的字母大小写下载和卸载软件更新查看空间使用情况当前目录所在的位置查看文件中的内容查看目录下的文件重启关机移动文件磁盘管理软件修改权限删除文件或文件夹新建文件夹移动一个文件夹文件重命名编译C和C文件VIM编辑器的相关操作 Linux的字母大小写 Linux的文件以…...

1.8 工程相关解析(各种文件,资源访问
目录 1.8 工程相关解析(各种文件,资源访问) 分类 Android 基础入门教程 本节引言: 1.工程项目结构解析: 1.res资源文件夹介绍: 2.如何去使用这些资源 2.深入了解三个文件: MainActivity.java: 布局…...

unity 前后左右 移动
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public float moveSpeed 5f; // 移动速度 public float rotateSpeed 180f; // 旋转速度 // Start is called before the firs…...

计算机视觉传统图像处理库opencv的使用
人工智能领域的图像处理分支,整理了计算机视觉传统图像处理库opencv的使用网址链接。 opencv使用范围,主要用在计算机视觉、视频分析、机器学习、医学影像处理、自动驾驶、工业检测、游戏开发上。 1):opencv效果视频 opencv10个应…...

【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate
目录 一.基础概念 二.数据库的管理 1.创建数据库 2.删除数据库 二.集合的管理 1.显示所有集合 2.创建集合 3.删除当前集合 4.向集合中插入元素 三.文档的管理 1.文档插入 2.文档的更新 3.文档的删除 4.文档查询 (1)查询基本语法࿱…...

vue + video.js 加载多种视频流(HLS、FLV、RTMP、RTSP)
起因: 由于需要在一个项目内接入多种常用的视频流,所以接触到video.js,这里就做个记录。 框架: vue2 video.js videojs-contrib-hls videojs-flvjs-es6 videojs-flash video-js.swf vue安装就不讲了,直接从项目…...

用 Python 微调 ChatGPT (GPT-3.5 Turbo)
用 Python 微调 ChatGPT (GPT-3.5 Turbo) 备受期待的 GPT-3.5 Turbo 微调功能现已推出,并且为今年秋季即将发布的 GPT-4 微调功能奠定了基础。 这不仅仅是一次简单的更新——它是一个游戏规则改变者,为开发人员提供了完美定制人工智能模型的关键解决方案…...

单目标应用:基于蜘蛛蜂优化算法(Spider wasp optimizer,SWO)的微电网优化调度MATLAB
一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、蜘蛛蜂优化算法 蜘蛛蜂优化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,该…...

2023年7月京东饮料行业数据分析(京东运营数据分析)
饮料消费已成为当下快消品行业里的主力军,随着社会群体喜好的改变、消费群体的不断扩大,可选择的饮料种类越来越多,我国饮料市场的体量也较为庞大。根据鲸参谋电商数据分析平台的数据显示,今年7月份,京东平台饮料的销量…...

执行 JUnit 单元测试前,修改环境变量
同一份代码,在不改变配置文件的情况下,可以连接不同的数据库,进行JUnit测试。 非开发、测试、生产环境的区别。而是 我就站在这里,指哪打哪! 避免重复造轮子,参考博文: 使用junit&spri…...

openGauss学习笔记-63 openGauss 数据库管理-资源池化架构
文章目录 openGauss学习笔记-63 openGauss 数据库管理-资源池化架构 openGauss学习笔记-63 openGauss 数据库管理-资源池化架构 本文档主要介绍资源池化架构下的一些最佳实践和使用注意事项,用于支撑对相关特性感兴趣的开发者可以快速部署、实践或进行定制化开发。…...

计算机竞赛 基于深度学习的植物识别算法 - cnn opencv python
文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** …...

ChatGPT如何应对紧急情况和灾害应对?
ChatGPT是一个文本生成模型,它可以用于各种任务,但在处理紧急情况和灾害应对方面,它有一些潜在的用途和限制。在这篇文章中,我们将讨论ChatGPT在紧急情况和灾害应对中的应用,以及如何充分利用这一技术,并提…...

ElementUI浅尝辄止37:Select 选择器
当选项过多时,使用下拉菜单展示并选择内容。 1.如何使用?基础单选 v-model的值为当前被选中的el-option的 value 属性值 <template><el-select v-model"value" placeholder"请选择"><el-optionv-for"item in …...

PCL 基于任意四点计算球心坐标
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 继续基于之前的思路PCL 基于三个点计算圆心坐标之二(二维),假设存在四个不共面的点, ( x 1 , y 1 ) (x_1,y_1)...

飞书即时消息无需API开发连接Cohere,打造飞书AI智能问答助手
飞书即时消息用户使用场景: 许多企业都在使用飞书系统进行协同办公,而现在有了Cohere大语言模型技术,能够根据用户的提问来自动产生回答,无需人为干预。对于企业负责人来说,他们认为如果将Cohere技术融入到飞书机器人中…...

FPGA实现Cordic算法——向量模式
FPGA实现Cordic算法——向量模式 FPGA实现Cordic算法——向量模式1.cordic算法基本原理2.FPGA实现cordic算法向量模式i、FPGA串行实现cordicii、FPGA流水线实现cordiciii、实验结果 FPGA实现Cordic算法——向量模式 1.cordic算法基本原理 FPGA中运算三角函数,浮点数…...

【常用代码14】el-input输入框内判断正则,只能输入数字,过滤汉字+字母。
问题描述: el-input输入框,只能输入数字,但是不能显示输入框最右边的上下箭头, <el-input v-model"input" type"number" placeholder"请输入内容" style"width: 200px;margin: 50px 0;&…...

[NLP]LLM--使用LLama2进行离线推理
一 模型下载 二 模型推理 本文基于Chinese-LLaMA-Alpaca-2项目代码介绍,使用原生的llama2-hf 克隆好了Chinese-LLaMA-Alpaca-2 项目之后,基于GPU的部署非常简单。下载完成以后的模型参数(Hugging Face 格式)如下: 简单说明一下各个文件的作…...

初始化一个Gin框架的Go-Web项目
使用到的第三方库 gin Gin 框架viper 配置文件管理cors 跨域资源请求配置gorm ORM 库zap 日志记录 main 包 Go 语言程序的入口点 main.go 文件 使用 flag 读取配置文件路径参数,默认当前目录下使用 viper 读取 config.ini 配置文件初始化初始数据初始化随机数种子初…...

Mybatis日期检索格式报错
问题复现 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String ##…...

如何把Android Framework学彻底?一条龙学习
Framework通俗易懂 平时学习 Android 开发的第一步就是去学习各种各样的 API,如 Activity,Service,Notification 等。其实这些都是 Framework 提供给我们的。Framework 层为开发应用程序提供了非常多的API,我们通过调用这些 API …...

uview indexList 按字母跳转不了
点击字母跳转不到位的问题:在<u-index-list>添加方法select“clickSelect“ 锚点要加id,用对应的字母做为id值, <u-index-anchor :id"key" :index"key"/> <template><view><view class&qu…...

安全模型中的4个P
引言:在安全模型中,经常会碰到PDR,PPDR,IPDRR,CARTA-PPDR等模型,其中的P,是predict?是prevent?还是protect?还是policy呢? 一、4P字典意思解释 1、predict&a…...

网站优化搜索引擎与关键词
网站优化搜索引擎与关键词 人们不应该高估搜索引擎的智商。这不利于seo的研究,事实上,搜索引擎是非常愚蠢的,让我们举一个非常简单的例子,你在搜索引擎中输入“教师”这个词,搜索引擎就会给出一个准确的搜索列表。我们…...

aws-msk-托管kafka集群的简单使用(VPC内部访问:无验证和SASL认证)
1.使用控制台创建即可 根据实例类型创建需要至少15分以上,可以提前创建好ec2实例和Secrets Manager,一会会使用到 2. 创建Secrets Manager (使用无认证时请跳过) 官方文档:https://docs.aws.amazon.com/zh_cn/msk/latest/deve…...

Unity UGUI(二)核心组件
Unity Canvas相关知识学习 文章目录 Unity Canvas相关知识学习1. Canvas:1.1 Render Mode1.2 多个Canvas的显示顺序 2.Canvas Scaler:屏幕分辨率自适应2.1 UI Scale Mode 3. EventSystem4. Standalone Input Module5. Graphic Raycaster:图形…...

代码随想录二刷第二天(Python)
27. 移除元素 题目链接:https://leetcode.cn/problems/remove-element/ 题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必…...

Mybatis学习笔记1 Mybatis入门
差不多根据mybatis中文文档:创建第一个mybatismaven项目,将它跑起来 入门_MyBatis中文网 新建库 建表 创建项目 重启之后 配置下Maven与encoding 成习惯了 新建模块 注意:这个GroupId和ArtifactId version是之后,你用Maven install时候后存放的包路径和包名 目录结构:虽然换…...