【Redis】Redis十大类型
文章目录
- 前言
- 一、string字符串类型
- 二、List列表类型
- 三、 Hash表
- 四、 Set集合
- 五、 ZSet有序集合
- 六、 GEO地理空间
- 七、 HyperLogLog基数统计
- 八、Bitmap位图
- 九、bitfield位域
- 十、 Stream流
- 10.1 队列指令
- 10.2 消费组指令
- 10.3 ACK机制
前言
redis是k-v键值对进行存储,key
的类型都是字符串,而数据类型是value
的数据类型
Tip:命令不区分大小写,而key的值是区分大小写的
Key常用命令
keys * //当前库的所有key
exists key //判断某个key是否存在,可以同时判断多个key,返回几就是存在几个
type key //查看你的key是什么类型// 删除
del key //是原子操作,删除指定的key数据
unlink key //常用于多线程时,非阻塞删除,仅仅将keys从keyspace元数据中删除,没真正的删除,会在后续异步中操作// 过期时间
ttl key // 查看还有多少秒过期 -1表示永不过期 -2 表示已过期
expire key 秒 // 给key设置过期时间// 数据库操作
move key dbindex [0-15] // 将当前数据库的key移动到指定的数据库中 redis默认是有16个数据库的
select dbindex [0-15] // 切换数据库[0-15],默认为0
dbsize // 查看当前数据库key的数量flushdb // 清空当前库
flushall // 清空16个数据库 慎用
help @+数据类型
会出现命令提示 比如 help @string
一、string字符串类型
- string是redis最基本的类型,一个key对应一个value。
- string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
- string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
1. set命令
// 常用命令
set key value [NX|XX][GET][EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTLJ// 设置过期时间,秒为单位
set key1 value1 EX 3 // 过期时间为3秒// 设置键存在时的键值(即覆盖作用),并返回原来的值
set key1 value2 get// 将key1进行修改时,继续使用之前的过期时间(因为默认修改时是直接设置为永不过期了)
set key1 value1 keepttl // 过期时间为3秒
SET命令有NX、XX、EX、PX以及KEEPTTL五个可选参数,
- NX:键不存在的时候设置键值(NX可以理解为not exit)
- XX:键存在的时候设置键值
- GET:返回指定键原本的值,若键不存在时返回nil
- EX seconds:以秒为单位设置过期时间
- PX milliseconds:以毫秒为单位设置过期时间
- EXAT timestamp:设置以秒为单位的UNIX时间戳所对应的时间为过期时间
- PXAT milliseconds-timestamp:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
- KEEPTTL:保留设置前指定键的生存时间
2. mset同时设置多个键值对
MSET [key1] [value1] [key2] [value2] [key3] [value3] // 同时设置一个或多个键值对
MGET [key1] [key2] [key3] // 同时获取多个key的值
MSETNX [key1] [value1] [key2] [value2] // 同时设置一个或多个 key-value 对 必须保证key都不存在才能成功
3. 获取键的指定区间的值
GETRANGE [key] 0 -1 // 获取这个key的值的全部
GETRANGE [key] 0 2 // 获取这个key的值索引0到索引2之间的值
SETRANGE [key] 1 xxx // 设置指定区间范围内的值// 获取key1的0-3的值,类似于获取字符串的子字符串
getrange key1 0 3// 将key1从1索引开始设置为aayy
setrange key1 aayy
4. 数值增减
key键对应的value类型必须为数字
INCR [key] // 递增数字 +1
INCRBY [key] [increment] // 增加指定的整数 +increment
DECR [key] // 递减数字 -1
DECRBY [key] [increment] // 减少指定的整数 -increment
5. 获取字符串长度和内容相加
STRLEN [key] // 获取key对应的值的长度
APPEND [key] [vale] // 添加字符串内容// 向key1中追加aaaa
append key1 aaaa
6. 分布式锁
setnx/setex [key] [过期时间] [value] // 设置带过期时间的key,动态设置
setnx [key] [value] // 只有在 key 不存在时设置 key 的值。
// 一般是两个命令连用,写成lua脚本连用,具体在Redis高级分布式锁中使用
7. getset
getset [key] [value] // 给定 key 的值设为 value ,并返回 key 的旧值
// 类似于 set [key] [value] get
应用
- dy点赞某个视频或商品,点一次加一次
- 使用incr key 获得多少人喜欢
- 对于文章是否喜欢
- 使用incr key 获得多少人喜欢
二、List列表类型
- 列表是简单的字符串列表,按照插入顺序排序。
- 可以添加一个元素到列表的头部(左边)或者尾部(右边)它的底层实际是个双端链表
- 最多可以包含2^32- 1个元素(4294967295,每个列表超过40亿个元素)
- 单key多vlue
主要功能有push/pop
等,一般用在栈、队列、消息队列等场景
- left、right都可以插入添加;
- 如果键不存在,创建新的链表
- 如果键已存在,新增内容
- 如果键全移除,对应的键也就消失了
常见命令
lpush [key] [value] ... // 往 列表头部(左边)放入元素
Rpush [key] [value] ... // 往 列表(右边)放入元素
lrange [key] 0 -1 // 从左边开始遍历列表 只能从左边遍历
lpop [key] // 最左边的出栈 也就是lrange遍历的第一个
rpop [key] // 最右边的出栈 也就是lrange遍历的最后一个
lindex [key] [index] // 通过索引值获取值
llen [key] // 获得元素个数
lrem [key] [num] [value] // 从左往右删除 num个值为 value的值(因为list允许有重复的值)
lrem [key] 0 [value] // 从左往右删除所有值为value的值
ltrim [key] [开始] [结束] // 截取指定范围的值后再赋给[key],也就是删除这个区间外的值
RPOPLPUSH [key1] [key2] //移除key1列表的最后一个元素(也即R端),并将该元素添加到另一个key2列表的第一个(L端)并返回这个元素的值
lset [key] [index] [value] //将key的第 index 个索引值改为value
linsert [key] before/after [value1] [value2] // 在list某个已有值的前后再添加具体值
应用场景
公众号的订阅的消息
- 关注的人发布文章,就会到本人的列表中 List,进行Ipush操作: lpush likearticle:id 文章id
- 查看自己订阅的文章 lrange likearticle:id 0 9
三、 Hash表
- Hash是一个string类型的 field(字段)和 value(值)的映射表,Hash特别适合用于存储对象。
- 它也是k-v 模式不变,但v是一个键值对 => Map<String,Map<Object,Object>>
- Redis 中每个hash可以存储2个32-1键值对(40多亿)|
常用命令
hset/hget/hmset/hmget/hgetall/hdel
hlen // 获取在某个key内的全部数量
hexists [key] [k1] // 看key中是否有k1这个键
hkeys [key] // 获取key里面的所有key
hvals [key] // 获取key里面的所有value
hincrby [key] k1 [num] // key里面k1的值增长num 整数
hincrbyfloat [key] k1 [num] // key里面k1的值增长num 小数
hsetnx [key] k1 [value] // 不存在赋值,存在了无效\
四、 Set集合
- 单值多value,也就是无重复。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是intset或者hashtable。
- Redis 的 Set 是String类型的无序集合。
- Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
- 集合中最大的成员数为2^32- 1(4294967295,每个集合可存储40多亿个成员)
常用命令
SADD key [member ...] // 添加元素,有重复值时,自动去重
SMEMBERS key // 遍历集合中所有元素
SISMEMBER key member // 判断元素是否在集合中
SREM key [member ...] // 删除元素
SCARD key // 获取集合长度
SRANDMEMBER key m // 从set集合里面随机取出m个元素展示,不会删除 如果超过最大数量就全部取出 如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值
SPOP key m // 从集合中随机弹出一个元素,会删除
SMOVE key1 key2 value1 // 将key1的已存在的某个值value1迁移给key2,key1中value1便没有了
集合运算
SDIFF keyA keyB // A - B 属于A但不属于B的元素构成的集合
SUNION keyA keyB // A U B 属于A或者属于B的元素合并后的
SINTER keyA keyB // A ∩ B 属于A同时属于B
SINTERCARD numkeys keyA keyB [LIMIT limit] // 不返回结果集,只返回结果的基数(即个数)
应用场景
抽奖小程序
- 将所有抽奖用户
sadd key 用户ID
- 显示多少人参加
SCARD key
- 从set中任意选取N个中奖人
SRANDMEMBER key 2
随机抽奖两个人,元素不删除SPOP key 2
随机抽奖两个人,元素会删除
朋友圈点赞
- 新增点赞
SADD pub:msgID 点赞用户Id1 点赞用户Id2
- 取消点赞
SREM pub:msgID 点赞用户Id
- 展现所有点赞过的用户
SMEMBERS pub:msgID
- 点赞用户统计
SCARD pub:msgID
- 判断某个朋友是否对楼主点赞过
SISMEMBER pub:msgID 用户Id
可能认识的人
- 求两个人的差集
SDIFF user1 user2
五、 ZSet有序集合
- zset和 set一样也是string类型元素的集合,且不允许重复的成员。
zset k1 score1 v1 score2 v2
- zset和set的区别,就是在set的基础上加了一个score分数值,redis正是通过分数来为集合中的成员进行从小到大的排序。
- zset的成员是唯一的,但分数(score)却可以重复。
- zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
- 集合中最大的成员数为2^32 -1
常用命令
ZADD key score member [score member ] // 添加元素
ZRANGE key start stop [WITHSCORES] // 返回元素分数从小到大的顺序 返回索引从start到stop之间的所有元素,0 -1是返回全部
ZREVRANGE key 0 - 1 [WITHSCORES] // 反序,WITHSCORES参数表示显示分数
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] // 获取指定分数范围的元素,在min或max前加"("时,表示开区间 limit是返回限制,返回多少个
// 实例:ZRANGEBYSCORE key (60 90 limit 0 1 // 表示在key中筛选一个分数在(60,90]区间中的值ZSCORE key member // 获取元素的分数
ZCARD key // 获取集合中元素的数量
ZREM key 某score下对应的value值 // 删除元素
ZINCRBY key increment member // 增加某个元素的分数
ZCOUNT key min max // 获得指定分数范围内的元素个数
ZRANK key value // 获得value下标
ZREVRANK key values // 逆序获得下标
ZMPOP numkeys key [key …] <MIN | MAX> [COUNT count] // 弹出元素,弹出后删除
- numkeys 表示几个key
- <MIN | MAX> 小 | 大
- [COUNT count] count num 弹出num个
在myzset集合中,有元素:(1,one),(2,two),(3,three)
以上命令意思是,在myzset这一个键中,取出最小的一个(分数,值)这样的‘分数-值’对
应用场景
根据商品销售对商品进行排序显示
- 思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
- 商品编号1001的销量是9,商品编号1002的销量是15
zadd goods:sellsort 9 1001 15 1002
- 有一个客户又买了2件商品1001,商品编号1001销量加2
zincrby goods:sellsort 2 1001
- 求商品销量前10名
ZRANGE goods:sellsort 0 9 withscores
六、 GEO地理空间
Redis GEO主要用于存储地理位置信息,并对存储的信息进行操作,包括
- 添加地理位置的坐标。
- 获取地理位置的坐标。
- 计算两个位置之间的距离。
- 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
经纬度去地图上直接复制
// 多个经度(longitude)、纬度(latitude)、位置名称(member) 添加到指定的key中
GEOADD key longitude latitude member [经度 纬度 名称 ...]// 从键里面返回所有给定位置元素的位置(经度和纬度)
GEOPOS key member [...]GEODIST 返回两个给定位置之间的距离。
GEORADIUS 以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER 跟GEORADIUS类似// 返回一个或多个位置元素的Geohash表示
GEOHASH key member [...]
- GEORADIUS
应用场景 - 美团附近的饭店、酒店
- 高德地图附近的店
七、 HyperLogLog基数统计
HyperLogLog是用来做基数统计的算法。
- 去重复统计功能的基数估计算法就是 HyperLogLog
- 基数:是一种数据集,去重复后的真实个数
- 基数统计:用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
- 只需要花费12KB内存,就能记录 2的64次方=18446744073709551616 个不同元素的基数
HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
HyperLogLog类型的本质是string类型。但是,因为 HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。(即不能用get)
PFADD key element [element ...] // 添加指定元素到 HyperLogLog 中。
PFCOUNT key [key ...] // 返回给定HyperLogLog的基数估算值。
PFMERGE destkey sourcekey [sourcekey ...] // 将多个HyperLogLog合并为一个HyperLogLog
应用场景
- 统计某个网页的UV、某个文章的UV
- UV Unique Visitor 独立访客,一般理解为客户端IP,需要去重
- 用户搜索网站关键词数量
- 统计用户每天搜索不同词条个数
八、Bitmap位图
由0和1状态表现的二进制位的bit数组
- 用String类型作为底层数据结构实现的一种统计二值状态(Y/N)的数据类型
- 位图本质是
数组
,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。 - 一个键对应的位图类型应该是8的整数倍。
- Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2的32次方 = 4294967296)
常用命令
SETBIT key offset value // 将key键中的第offset的值设为value value只能是0或1 offset 从0开始
GETBIT key offset // 获得第offset位的值
STRLEN key // 得出占多少字节 超过8位后自己按照8位一组一byte再扩容
BITCOUNT key // 得出该key里面含有几个1
BITOP and destKey key1 key2 // 对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP or destKey key1 key2 // 对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destKey key1 key2 // 对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destKey key // 对key 求逻辑非,并将结果保存到 destkey
应用场景
做签到很适合位图
- 每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。
- 在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。
- 对于电影和广告是否被点击播放过也可以用位图
九、bitfield位域
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。
十、 Stream流
Redis Stream主要用于消息队列(MQ,Message Queue)
实现消息队列的三个方式
-
List实现消息队列
- 常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进Redis的列表,另个线程从这个列表中轮询数据进行处理。
-
Pub/Sub 发布订阅,
- 但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。并且没有ACK机制保证数据的可靠性
-
Stream流 (Redis版的MQ消息中间件+阻塞队列)
- Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
Stream底层结构
10.1 队列指令
XADD // 添加消息到队列末尾
XTRIM maxlen|minid len|id // 限制Stream的长度,如果已经超长会进行截取// maxlen 允许的最大长度,对流进行修剪限制长度,按id保留最大的len个// minid 允许的最小id,从某个id值开始比该id值小的将会被抛弃XDEL key ID // 删除消息
XLEN key // 获取Stream中的消息长度XRANGE key start end [count] // 获取消息列表(可以指定范围),忽略删除的消息
XREVRANGE // 和XRANGE相比区别在于反向获取,ID从大到小XREAD [COUNT count] [BLOCK milliseconds] key id // 获取消息(阻塞/非阻塞),返回大于指定ID的消息
// count 最多读取几条消息,不指定时返回key中所有满足的消息
// BLOCK是否已阻塞的方式读取消息,默认不阻塞,如果milliseconds设置为0,表示永远阻塞
// id $表示比最大ID还大的id;0-0表示从最小id获取消息
XADD 添加消息
*
号表示服务器自动生成MessageID(类似mysq|里面主键auto_increment),后面顺序跟着一堆业务key/value
- Redis对于ID有强制要求,
*
号的位置可以是自己指定的ID,但格式必须是时间戳-自增Id这样的方式,且后续ID不能小于前一个ID
XRANGE 获取消息
xrange - + 10 表示获取10条ID从小到大的数据
XREAD 获取消息(阻塞态)
Stream的基础方法,使用xadd存入消息和xread循环阻塞读取消息的方式可以实现简易版的消息队列,交互流程如下
10.2 消费组指令
创建消费组的目的:
让组内的多个消费者共同分担读取消息,所以,我们通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的
XGROUP CREATE key GROUP ID //创建消费者组,消费者按组创建,id为$时表示从尾部消费,为0时表示从头消费
XREADGROUP GROUP // 读取消费者组中的消息XACK // ack消息,消息被标记为“已处理”
XPENDING key GROUP // 打印待处理消息的详细信息(即已读但未ack确认的消息)XGROUP SETID // 设置消费者组最后递送消息的ID
XGROUP DELCONSUMER // 删除消费者组
XCLAIM // 转移消息的归属权(长期未被处理/无法处理的消息,转交给其他消费者组进行处理)
XINFO // 打印Stream\Consumer\Group的详细信息
XINFO GROUPS // 打印消费者组的详细信息
XINFO STREAM // 打印Stream的详细信息
XREADGROUP命令中
- stream中的消息—旦被消费组里的一个消费者读取了,就不能再被该消费组内的其他消费者读取了,即同一个消费组里的消费者不能消费同一条消息。
- 但不同消费组的消费者可以消费同一条信息。
XPENDING 打印待处理消息的详细信息
10.3 ACK机制
基于Stream 实现的消息队列,如何保证消费者在发生故障或宕机再次重启后,仍然可以读取未处理完的消息?
- Streams 会自动使用内部队列(也称为 PENDING List)留存消费组里每个消费者读取的消息保底措施,直到消费者使用XACK命令通知Streams"消息已经处理完成"。
- 消费确认增加了消息的可靠性,一般在业务处理完成之后,需要执行
XACK
命令确认消息已经被消费完成。
下面抓图所示: consumer2已读取的消息的ID是1659430293537-0
一旦消息1659430293537-0
被consumer2处理了
consumer2就可以使用XACK
命令通知Streams,然后这条消息就会被删除
此时回复命令:
XACK mystream groupC 1659430293537-0
表示已确认
相关文章:

【Redis】Redis十大类型
文章目录 前言一、string字符串类型二、List列表类型三、 Hash表四、 Set集合五、 ZSet有序集合六、 GEO地理空间七、 HyperLogLog基数统计八、Bitmap位图九、bitfield位域十、 Stream流10.1 队列指令10.2 消费组指令10.3 ACK机制 前言 redis是k-v键值对进行存储,k…...

存储实验:Linux挂载iscsi硬盘与华为OceanStor创建LUN全流程
目录 目的环境规划实验实验流程Centos配置0. 关闭防火墙1. 设置网卡信息2. 配置路由3. iscsiadm连接存储 iSCSI LUN创建(以华为OceanStor为例)验证1. 验证是否成功2. 开启自动挂载 目的 实现Linux连接iscsi硬盘,同时实现开机自启挂载 环境规…...

高可用系统架构设计技术方案:Java架构师视角
在现代互联网环境下,高可用性(High Availability, HA)已成为衡量系统质量的重要指标之一。对于Java架构师而言,设计一套能够保证业务连续性、快速恢复和持续服务的高可用系统架构,是一项复杂而挑战性的任务。本文将从J…...

C++ --> 类和对象(三)
欢迎来到我的Blog,点击关注哦💕 前言 前面已经对类和对象有一定的了解,接下来再次深入的了解一下。 一、深入理解构造函数 构造函数体赋值: 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能…...

JS【详解】类 class ( ES6 新增语法 )
本质上,类只是一种特殊的函数。 console.log(typeof 某类); //"function"声明类 class 方式 1 – 类声明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 类表达式 匿名式 const Car class {constructor(mod…...

vue中使用$set方法给对象添加属性
vue中可以使用$set()给对象添加属性,但不是所有的对象都可以使用,vue中api明确说明,它必须用于向响应式对象上添加属性 响应式对象,vue的响应式原理,可以查看:深入响应式原理 — Vue.js ①对象赋值 this…...

【Python】ftplib的使用
仅描述基础要点,备忘。 python自带ftplib库,可实现ftp读写。 1 要点 ftp未使用默认端口21时,需显示指定端口。ftp路径带有中文,可能需要设置ftp的encoding属性为 gbk。ftplib不支持递归创建目录,需手动创建层级目录…...

CSS 【详解】CSS 函数(含 calc,min,max,clamp,cubic-bezier,env,steps 等)
函数描述CSS 版本attr()返回选择元素的属性值。2calc()允许计算 CSS 的属性值,比如动态计算长度值。3cubic-bezier()定义了一个贝塞尔曲线(Cubic Bezier)。3hsl()使用色相、饱和度、亮度来定义颜色。3hsla()使用色相、饱和度、亮度、透明度来定义颜色。3linear-grad…...

简单理解Lua 协程(coroutine)
也许更好的阅读体验 协程简单理解为可以暂停的线程,但是同一时刻只有一个协程可以处于运行状态。 文章目录 coroutine.create()coroutine.resume()coroutine.wrap()coroutine.yield()coroutine.resume()参数传递resume和yield之间互换数据 coroutine.create() lua…...

(day18) leetcode 204.计数质数
描述 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出:0示例 3…...

SadTalker数字人服务器部署
一、单独SadTalker部署 git clone https://github.com/OpenTalker/SadTalker.gitcd SadTalker conda create -n sadtalker python3.8conda activate sadtalkerpip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pyto…...

Python实现一对多WebSocket发送给指定多个客户端
在一对多的WebSocket场景下,如果你想要向特定的多个客户端发送消息,而不是广播给所有客户端,你需要维护一个能够标识每个客户端的方式,比如使用用户名或者客户端ID。这样,你就可以根据需要选择向哪些客户端发送消息。 …...

Power BI 工具介绍
Power BI是一款商业智能(BI)软件,由微软开发,旨在帮助用户将复杂的数据转化为视觉化的交互式见解。Power BI提供了一套完整的工具,包括数据连接、数据准备、数据建模、数据分析和数据可视化等功能,使用户能…...

银河麒麟高级服务器操作系统V10加固操作指南
1:检查系统openssh安全配置: 2:检查是否设置口令过期前警告天数: 3:检查账户认证失败次数限制: 修改/etc/pam.d/system-auth文件中deny的参数即可 4:检查是否配置SSH方式账户认证失败次数限制:...

(leetcode学习)15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&a…...

算法训练 | 图论Part8 | 117. 软件构建、47. 参加科学大会
目录 117. 软件构建 拓扑排序法 47. 参加科学大会 dijkstra法 117. 软件构建 题目链接:117. 软件构建 文章讲解:代码随想录 拓扑排序法 代码一:拓扑排序 #include <iostream> #include <vector> #include <queue> …...

编程从零基础到进阶(更新中)
题目描述 依旧是输入三个整数,要求按照占8个字符的宽度,并且靠左对齐输出 输入格式 一行三个整数,空格分开 输出格式 输出它们按格式输出的效果,占一行 样例输入 123456789 -1 10 样例输出 123456789-1 10 #include "stdio.…...

MySQL运维实战之ProxySQL(9.6)SQL黑名单
作者:俊达 利用mysql_query_rules表中的error_msg字段,可以实现SQL黑名单的功能。如果规则设置了error_msg,当SQL语句匹配这条规则时,proxysql会直接将error_msg的内容返回给客户端。 当遇到一些大查询严重影响数据库性能时&…...

深入了解MySQL中的innodb_lock_wait_timeout
引言 在数据库管理中,确保数据的一致性和完整性是至关重要的。MySQL的InnoDB存储引擎通过行级锁定机制来实现这一点。然而,当多个事务同时操作数据库时,可能会出现锁等待的情况。了解并合理配置innodb_lock_wait_timeout参数,对于…...

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程
自定义实现的Table控件,支持跨qt版本,兼容qt5,qt6! 截图如下所示: 黑色风格如下所示: 视频演示入口:Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…...

文章管理小程序的设计
管理员账户功能包括:系统首页,个人中心,作者管理,文章管理,文章分类管理,论坛,系统管理 微信端账号功能包括:系统首页,文章,论坛,我的 开发系统…...

Ubuntu22.04安装NIVIDIA显卡驱动总结
1.首先在安装驱动时需要判断系统有无GPU以及GPU的型号 可以参考这篇文章: https://blog.51cto.com/u_13171517/8814753#:~:textubuntu%20%E7%B3%BB%E7%BB%9F%20%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E6%9C%89%E6%B2%A1%E6%9C%89GPU%201%20%E6%…...

Redis的配置优化、数据类型、消息队列
文章目录 一、Redis的配置优化redis主要配置项CONFIG 动态修改配置慢查询持久化RDB模式AOF模式 Redis多实例Redis命令相关 二、Redis数据类型字符串string列表list集合 set有序集合sorted set哈希hash 三、消息队列生产者消费者模式发布者订阅者模式 一、Redis的配置优化 redi…...

数据结构之初始二叉树(2)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的前置知识(概念、性质、、遍历) 通过上篇文章的学习,我们…...

如何预防最新的baxia变种勒索病毒感染您的计算机?
引言 在当今数字化时代,网络安全威胁层出不穷,其中勒索病毒已成为企业和个人面临的重大挑战之一。近期,.baxia勒索病毒以其高隐蔽性和破坏性引起了广泛关注。本文将详细介绍.baxia勒索病毒的特点、传播方式,并给出相应的应对策略…...

git列出提交记录的文件路径
一、如何列出某次提交记录中修改过/新增的文件? 方法1:使用 git diff-tree 命令来查看某个提交记录中修改过/新增的文件。具体来说,你可以使用以下命令: git diff-tree --no-commit-id --name-only -r <commit-hash>命令解…...

微信小程序密码 显示隐藏 真机兼容问题
之前使用type来控制,发现不行,修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…...

C# 中,使用 LINQ 示例 备忘
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。 此外, … 对于编写查询的开发者来说,LINQ 最明显的“语言集成”部分就是查询表达式。 …...

GaussDB DWS 详解
文章目录 GaussDB DWS 详解一、简介二、DWS的分布式架构架构概述关键组件 三、分布式查询数据查询流程SQL执行的示例 批注:本文引鉴了Forlogen博主的一些内容,并加以补充,以供学习了解。 GaussDB DWS 详解 一、简介 DWS(Data Warehouse Ser…...

【256 Days】我的创作纪念日
目录 🌼01 机缘 🌼02 收获 🌼03 日常 🌼04 成就 🌼05 憧憬 最近收到官方来信, 突然发现,不知不觉间,距离发布的第一篇博客已过256天,这期间我经历了春秋招、毕业答辩…...