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

redis常用命令和内部编码

文章目录

  • redis 为什么快
  • redis中的String
    • set
      • setnx
      • setex
    • get
    • mset
    • mget
    • 计数操作incr、incrby、decr、decrby、incrbyfloat
      • incr
      • incrby
      • incrbyfloat
    • 拼接(append)、获取(getrange)、修改字符串(setrange)、获取字符串长度(strlen)操作
      • append
      • getrange
      • setrange
      • strlen
    • String编码方式
      • 查看String类型(object endoding key)
    • String类型的应用场景
      • 缓存(cache)
      • 计数(counter)
    • 共享会话(session)
    • 手机验证码
  • 哈希Hash
    • hset
    • hget
    • hexists
    • hdel
    • hkeys
    • hvals
    • hgetall
    • hmget
    • hlen
    • hsetnx
    • hincrby
    • hincrbyfloat
    • hash类型编码方式
    • hash的应用场景
      • 缓存(cache)
  • 列表(list)
    • list特点
    • lpush(头插)
    • lrange(查看list元素)
    • lpushx
    • rpush(尾插)
    • rpushx
    • lpop(头删)
    • rpop(尾删)
    • lindex
    • linsert
    • llen
    • lrem
    • ltrim
    • lset
    • 阻塞版本命令(消息队列)
      • blpop & brpop
      • blpop
      • brpop
    • list内部编码
    • list的应用场景
      • 作为数组
      • 作为消息队列
      • 栈或者队列
  • 集合(set)
    • sadd
    • smembers
    • sismember
    • spop
    • smove
    • srem
    • 集合间操作
      • 交集(inter)、并集(union)、差集(diff)
      • sinter
      • sinterstore
      • sunion
      • sunionstore
      • sdiff
      • sdiffstore
    • 集合的内部编码
    • set的应用场景
      • 保存用户的标签
      • 使用set计算出用户之间的共同好友
      • 使用set统计UV
  • 有序集合(zset)
    • zadd
    • zrange
    • zcard
    • zcount
    • zrevrange
    • zrangebyscore
    • zpopmax
    • zpopmin
    • bzpopmax
    • bzpopmin
    • zrank
    • zrevrank
    • zscore
    • zrem
    • zremrangebyrank
    • zremrangebyscore
    • zincreby
    • 集合间操作
      • 交集(zinterstore)、并集(zunionstore)
        • zinterstore
        • zunionstore
    • 内部编码
    • 应用场景
      • 排行榜系统
  • 其他数据类型
    • Streams
    • Geospatial
    • HyperLogLog
    • Bitmaps
    • Bitfields
  • 渐进式遍历
    • scan
  • 数据库管理

redis 为什么快

参照物:数据库(mysql、oracle、sql server)等
1.redis 主要是访问内存,数据库主要是访问硬盘
2.redis 的核心功能比数据库的核心功能更简单(干的活比数据库要少很多)例如数据库对数据的插入删除都有更复杂的功能支持,例如主键约束等
3.reids 采取的单线程模型,避免了一些不必要的线程竞争开销(例如加锁)因为redis每个基本操作都是短平快的简单操作一些内存
4.redis 在处理网络IO的时候,使用了epoll的IO多路复用机制(事件通知/回调机制)IO多路复用:一个线程就可以管理多个socket(操作系统给程序员提供的一套API,Java中可以使用NIO(底层封装的就是epoll)),当多件事情都是交互不是特别频繁的时候,可以采用IO多路复用

redis中的String

reids所有的可以都是字符串,value类型是存在差异的

redis中的字符串直接就是按照二进制数据的方式存储的(不会做任何编码的转换,
存的是啥取出来就是啥,所以什么都可以存储)但是有大小限制,最大是512M,
但是不建议存储太大的数据,因为redis是单线程模型,希望每次的操作都是短平快的

set

set key value ex(秒)/px(毫秒) 10 (~原子性操作~)
相当于 
set key value
expire key 10(过期时间)

setnx

setnx key1 111
相当于
set key1 111 nx

setex

setex key1 10 222
相当于
set key1 222 ex 10

get

对于get来说只是支持字符串类型的value

get key

mset

一次可以操作多组键值对可以只通过一次网络通信操作多个键值对

mset key1 111 key2 222 key3 333 ......

mget

一次可以操作多组键值对

mget key1 key2 key3 ......

计数操作incr、incrby、decr、decrby、incrbyfloat

incr         针对value+1
incrby       针对value+n
decr         针对value-1
decrby       针对value-n
incrbyfloat  针对value+/-小数

incr

incr key(key对应的value必须是正数,否则报错,返回的值就是key的value+1的结果)
注意:incr操作的key如果不存在,就会把不存在的结果当成0之后+1返回的是1

incrby

incrby key 10(key对应的value+10并返回)

incrbyfloat

incrbyfloat key 0.5/-0.5(key对应的value+-小数运算)

拼接(append)、获取(getrange)、修改字符串(setrange)、获取字符串长度(strlen)操作

append

append key value(直接将value拼接到key的value后面,
如果key不存在则创建新的key存储)

getrange

类似于Java中subString
getrange key start end(~左闭右闭~)
注意:start end 是可以传递负数的如果value中保存的是中文,使用getrange得到的结果可能是会乱码的因为一个汉字代表2-3个字节

setrange

setrange key offset value
offset:偏移量(从第几个字节开始替换)
value:要替换的结果(替换多长,看value的长度)
返回值是替换之后新的字符串长度
注意:如果value中保存的是中文,使用setrange得到的结果可能是会乱码的因为一个汉字代表2-3个字节

strlen

获取字符串的长度
单位:字节(Byte)
Java中的字符串是以字符为单位的,一个char是两个字节
(Java中汉字编码是用的unicode编码一个汉字使用两个字节,
但是String用的是utf-8一个汉字是三个字节)
strlen key
返回string的长度

String编码方式

int: 8个字节的长整型
embstr: 小于等于39字节的字符串
raw: 大于39个字节的字符串
redis会根据当前值的类型和长度动态决定内部的编码方式
注意:redis存储小数默认是embstr类型

查看String类型(object endoding key)

objeckt endoding key

String类型的应用场景

缓存(cache)

redis缓存只存放热点数据,应用服务器访问数据库的时候,先访问redis缓存,如果有就不会访问数据库,如果没有就访问数据库中的数据,并把数据库中的此数据调用到redis缓存中,以便下次使用,并且会给此数据设置一个过期时间,如果时间到了就销毁,这样redis数据就不会太多,并且redis也提供了淘汰策略

计数(counter)

例如视频的播放量,如果是一个热点视频,频繁的修改数据库中的播放量是效率很慢的,所以可以使用redis作为一个计数器,使用incr计数操作这样效率就会快很多

共享会话(session)

cookie:浏览器存储数据的机制
session(会话) :服务器存储数据的机制
使用redis单独把session会话拎出来,为所有的服务器共享

手机验证码

重点是使用了redis的过期机制

哈希Hash

哈希表是数据结构中最重要的一个数据结构(业务中常涉及到、面试中常问道)

redis本身已经是键值对结构了,redis自身的键值对就是通过哈希的方式来组织的,把key这一层组织完之后,到了value这一层value的其中一种类型还可以是哈希(value中是一个哈希表)

注意:在value中的哈市表键值对为field-value,目的是为了区分外层(key-value)和value中内层的两组不同的键值对

hset

设置hash中指定的字段(field)的值(value)

hset key field1 value1 field2 value2 .....
返回值是设置成功的键值对的个数

hget

获取hash类型键值对的值

hget key field

hexists

判断hash中是否有指定的字段

hexists key field

hdel

删除hash中指定的字段

hdel key field1 field2 .....

hkeys

获取hash中所有的field

hkeys key
时间复杂度:O(n) n表示key中键值对的个数(field个数)
注意:如果hash表中有大量的filed-value,可能会导致redis服务器阻塞

hvals

获取hash中所有的value

hvals key
时间复杂度:O(n) n表示key中键值对的个数(field个数)

hgetall

获取hash中所有的field-value

hgetall key
时间复杂度:O(n) n表示key中键值对的个数(field个数)

hmget

一次查询多个field

hmget key field1 field2 ......

hlen

获取hash中键值对个数

hlen key
时间复杂度:O(1)  不需要遍历

hsetnx

类似于setnx,不存在的时候才设置成功

hsetnx key field value

hincrby

hash这里的value也是可以进行加减操作的

hincrby key field 1/-1

hincrbyfloat

hincrbyfloat key field 0.5/-0.5

hash类型编码方式

ziplist : 压缩列表(节省空间)
hashtable:hash表
但是ziplist付出的代价,是进行读写操作的时候,速度是比较慢的,如果是少数元素并不明显,但是当元素个数比较多,就会比较慢了
如果:
1.哈希中的元素个数比较少,使用ziplist表示,元素个数比较多使用hashtable来表示
2.每个value的值长度都比较短,使用ziplist表示,如果某个value的长度太长了,也会转换成hashtable

hash的应用场景

缓存(cache)

存储一些结构化的数据

列表(list)

相当于数组或者顺序表

list特点

1.列表中的元素是有序的
2.要区分获取和删除的区别(因为删除操作会返回被删除元素的值)
3.列表中的元素是允许重复的
4.因为当前的list头和尾都能高效的插入和删除元素,就可以把这个list当作一个栈/队列来使用

lpush(头插)

lpush key value1 value2 ......
返回值:list的长度
时间复杂度:O(1)

lrange(查看list元素)

lrange key start stop
区间:闭区间  
支持负数下标

lpushx

如果key存在时,将一个或多个元素头插到list中,不存在什么也不做

lpushx key value1 value2 .......
返回值:list的长度

rpush(尾插)

rpush key value1 value2 ......

rpushx

如果key存在时,将一个或多个元素尾插到list中,不存在什么也不做

rpushx key value1 value2 ......
返回值:list的长度

lpop(头删)

lpop key
返回值:删除的value值

rpop(尾删)

rpop key
返回值:删除的value值

lindex

给定下标获取对应的元素

lindex key index
时间复杂度 :O(N)  N指的是list中元素的个数
如果是非法下标,返回的是nil
下标可以是负数

linsert

linsert key before/after pivot value
在pivot的前面(before)/后面(after)插入value
注意:如果有相同的pivot他会从左往右找到第一个pivot的前/后进行插入
时间复杂度 :O(N)  N指的是list中元素的个数

llen

获取列表中的长度

llen key

lrem

删除列表中的元素

lrem key count value
count : 要删除的个数(正数,代表从左往右找,负数,代表从右往左找,零,代表删除所有符合的元素)
value : 要删除的元素
返回:删除的元素的个数

ltrim

保留start和stop之间区间内的元素,区间外的两边元素直接删除

ltrim key start stop

lset

根据下标修改元素

lset key index value

阻塞版本命令(消息队列)

blpop & brpop

如果list中存在元素,blpop和brpop就和lpop和rpop作用完全相同
如果list中不存在元素,blpop和brpop就会阻塞,一直阻塞到队列不为空为止
阻塞版本会根据timeout阻塞一段时间,所以说是可以设置阻塞时间的(不一定是无休止的等待!)
但是在阻塞期间redis可以使用其他命令

此处的blpop和brpop看起来耗时很久,但是实际上并不会对redis服务器造成很大的影响,因为redis还是可以在阻塞期间实行其他命令的

blpop和brpop是可以尝试获取多个列表的,从左往右依次访问,
如果访问到某个匹配的元素之后,就会直接弹出元素,命令返回
如果多个客户端同时对同一个key执行pop,则是最先执行命令的客户端会得到弹出的元素

blpop

blpop key1 key2 ... timeout
可以指定一个key或者多个key,每个key对应的是一个list
如果这些list有任何一个非空,blpop都能够把这里的元素给获取到,立即返回
如果这些list都为空,就需要阻塞等待,等待其他客户端往这些list中插入元素
此处还可以指定超时时间timeout(单位秒),如果过了超时时间阻塞自动解除,返回nil

brpop

brpop和blpop完全一样,只不过brpop是尾删

list内部编码

老版本:ziplist(元素个数少)linkedlist(元素个数多)
redis5及之后:quicklist:结合了ziplist和linkedlist。整体还是一个链表,但是链表的每个节点是一个压缩列表

list的应用场景

作为数组

例如:用来当作不同表之间的关联关系,因为一个list中可以包含多个值

作为消息队列

栈或者队列

集合(set)

1.集合中的元素是无序的
2.集合中的元素是不能重复的,唯一的
3.和list类似,集合中的每一个数据都是string

sadd

为了区分,我们把集合中的每元素叫做member

sadd key member1 member2......

smembers

获取set中所有元素,顺序是无序的

smembers key

sismember

判断元素是否存在

sismenber key member

spop

随机删除

spop key count
count: 随即删除几个(可写可不写,不写只删除一个)

smove

把member从source上删除,再插入到destination中

smove source destination member

srem

删除若干元素

srem key member1 member2 ......

集合间操作

交集(inter)、并集(union)、差集(diff)

sinter

sinter key1 key2 ......
写多少个集合就是对多少个集合求交集
时间复杂度:O(N*M) N是最小集合个数  M是最大集合个数

sinterstore

直接把算好的交集,放到destination这个key对应的集合中

sinterstore destination key1 key2......

sunion

sunion key1 key2 ......
时间复杂度:O(N) N指的是总的元素个数

sunionstore

直接把算好的并集,放到destination这个key对应的集合中

sunionstore destination key1 key2 ......

sdiff

求差集

sdiff key1 key2 ......
时间复杂度:O(N) N指的是总的元素个数

sdiffstore

直接把算好的差集,放到destination这个key对应的集合中

sdiffstore destination key1 key2 ......

集合的内部编码

intset(整数集合) :为了节省空间做出的优化,当元素均为整数,并且元素个数并不是很多的时候
hashtable(哈希表) : 只要是存有字符类型,或者元素个数比较多

set的应用场景

保存用户的标签

用户画像:
分析出一个用户的特性(标签)之后,再投其所好~

使用set计算出用户之间的共同好友

基于“集合求交集”

使用set统计UV

UV:一个互联网产品如何衡量用户量?主要是两个方面PV、UV

1.PV (page view): 用户每次访问都会产生一个PV

2.UV (user view): 每个用户访问服务器都会产生一个UV,但是同一个用户多次访问,不会产生新的UV

UV统计需要去重,可以通过set集合来实现

有序集合(zset)

有序 : 升序

分数(score):再zset中每一个member同时引入了要给属性,叫做分数(浮点类型),进行排序的时候,就会按照分数的大小进行升序排列

注意:zset中的member仍然要求是唯一的,但是分数(score)可以重复

zadd

添加元素和分数

zset key [NX | XX] [LT | GT] [CH] [INCR] score1 member1 score2 member2 ......
LT : 如果更新的分数比原来的值小就更新,否则不更新
GT : 如果更新的分数比原来的值大就更新,否则不更新
CH : 如果不加ch默认返回的是新增元素的个数,如果加了就会返回修改的元素
INCR : 可以对现有的分数进行运算
时间复杂度 : O(logN) N指的是有序集合中的元素的个数,每次添加都是logN

zrange

查看有序集合 类似于 lrange

zrange key start stop [withscores]
时间复杂度 :O(logN + M) logN找到start和stop下标,M遍历之间的元素

zcard

获取集合中的元素个数

zcard key

zcount

给分数定区间筛选符合元素的个数

zcount key min max
min和max是可以写成浮点数的(inf无穷大,-inf负无穷大)
默认是闭区间,如果设置开区间使用左小括号`(`
时间复杂度 : O(logN)

zrevrange

逆序遍历(降序遍历)

zrevrange key start stop [withscores]
时间复杂度 :O(logN + M) logN找到start和stop下标,M遍历之间的元素

zrangebyscore

按照分数区间查询

zrangebyscore key min max [withscores]
默认是闭区间,如果要使用开区间,就在前面加上左括号`(`
时间复杂度 : O(logN + M)

zpopmax

删除并返回分数最高的count个元素

zpopmax key [count]
如果不写count默认删除一个最大的元素
返回值是被删除的元素
如果存在多个元素分数相同,会删除其中的一个
时间复杂度 : O(log(N) * M) N是有序集合的个数  M是count要删除的元素的个数

zpopmin

删除并返回分数最低的count个元素

zpopmin key [count]
其他的同zpopmax

bzpopmax

带有阻塞的删除分数最高的元素

bzpopmax key1 key2 ...... timeout
每一个key都是一个有序集合  有序集合为空的时候触发阻塞,timeout可以设置阻塞时间
和blpop一样的
时间复杂度 : O(logN)

bzpopmin

带有阻塞的删除分数最低的元素

bzpopmin key1 key2 ...... timeout
其他的同bzpopmax

zrank

返回元素的排名(下标)

zrank key member
时间复杂度 : O(logN)

zrevrank

返回元素的逆序排名(下标)

zrevrank key member

zscore

查询指定元素的分数

zsocre key member
时间复杂度 : O(1)

zrem

删除指定的元素

zrem key member1 member2 ......
时间复杂度 : O(log(N) * M)

zremrangebyrank

按照排序,删除指定范围的元素,左闭右闭

zremrangebyrank key start stop
时间复杂度 : O(logN + M)

zremrangebyscore

按照分数,删除指定范围的元素,左闭右闭

zremrangebyscore key start stop
时间复杂度 : O(logN + M)

zincreby

为指定的元素的分数增/减一定的分数值

zincreby key increment member

集合间操作

交集(zinterstore)、并集(zunionstore)

zinterstore
zinterstore destination numkeys key1 key2 ...... [weights ...][aggregate(sum|max|min)]
weights:权重
aggregate:合计(对相同member的分数进行求和、取最大值、取最小值)默认是sum
zunionstore
zunionstore destination numkeys key1 key2 ...... [weights ...][aggregate(sum|max|min)]
weights:权重
aggregate:合计(对相同member的分数进行求和、取最大值、取最小值)默认是sum![]()

内部编码

ziplist : 如果有序集合元素个数较少,或者单个元素体积较少
skiplist(跳表) : 如果当前元素个数比较多,或者单个元素体积非常大

应用场景

排行榜系统

关键要点:用来排行的分数是实时变化的

其他数据类型

Streams

当事件来了,进行一些操作,相当于一个阻塞队列

属于是List blpop brpop 的升级版

Geospatial

用来存储坐标(经纬度)

存储一些点之后,就可以让用户在某个点的特定范围之内查找周边范围信息

HyperLogLog

估算集合中的元素个数

HyperLogLog能够记录“元素的特征”但是不记录元素的内容,在新增元素的时候,能够知道当前新增的元素是一个已经存在的元素还是一个新的,所以就能记录集合中的元素个数,但是这个始有一定的误差的(误差0.81%)!毕竟“元素的特征”不一定特别准确

Bitmaps

位图

使用bit位来表示整数

位图本质上还是一个集合,属于是Set类型针对整数的特化版本,目的是节省空间

Bitfields

位域(位段)

bitfield可以理解成一串二进制序列(字节数组)

同时可以把这个字节数组中的某几个位,赋予特定的含义,并且可以进行 读取/修改/算术运算 等 相关操作

渐进式遍历

通过渐进式便利,就能做到,既能够获取到所有的key,同时又不会卡死服务器(不同于keys *)

每次只获取到一部分,保证一次操作不会太卡

scan

scan cursor [MATCH pattern] [COUNT count] [TYPE type]
cursor : 光标位置(开始遍历位置,并不是下标,只要简单理解成一个字符串即可)
count : 遍历的个数,默认是10(不一定精确)
pattern: 匹配字符串规则
type: 指定遍历value类型的key
返回值 : 前半部分告诉你下次遍历,光标是从哪个位置开始,后半部分就是遍历到的key

数据库管理

切换数据库
select dbIndex
deIndex: 0 - 15
查询本库中的key个数
dbsize
删除当前库中所有key
flushdb
删除所有库中所有key
flushall

相关文章:

redis常用命令和内部编码

文章目录 redis 为什么快redis中的Stringsetsetnxsetex getmsetmget计数操作incr、incrby、decr、decrby、incrbyfloatincrincrbyincrbyfloat 拼接(append)、获取(getrange)、修改字符串(setrange)、获取字符串长度(strlen)操作appendgetrangesetrangest…...

UI操作总结

该类 SolarWebx 继承自 Webx 和 IUixLikeMixin,主要用于扩展 giraffe.EasyUILibrary 的功能,提供了一系列与网页操作、元素定位、截图、图片处理等相关的方法。以下是对该类中每个方法的简要总结: __init__ 方法 作用:初始化 Sola…...

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…...

力扣hot100-->滑动窗口、贪心

你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…...

Linux 内核中的高效并发处理:深入理解 hlist_add_head_rcu 与 NAPI 接口

在 Linux 内核的开发中,高效处理并发任务和数据结构的管理是提升系统性能的关键。特别是在网络子系统中,处理大量数据包的任务对性能和并发性提出了极高的要求。本文将深入探讨 Linux 内核中的 hlist_add_head_rcu 函数及其在 NAPI(网络接收处理接口)中的应用,揭示这些机制…...

centos哪个版本建站好?centos最稳定好用的版本

在信息化飞速发展的今天,服务器操作系统作为构建网络架构的基石,其稳定性和易用性成为企业和个人用户关注的重点。CentOS作为一款广受欢迎的开源服务器操作系统,凭借其强大的性能、出色的稳定性和丰富的软件包资源,成为众多用户建…...

软件越跑越慢的原因分析

如果是qt软件,可以用Qt Creator Profiler 作性能监控如果是通过web请求,可以用JMeter监控。 软件运行过程中逐渐变慢的现象,通常是因为系统资源(如 CPU、内存、磁盘 I/O 等)逐渐被消耗或软件中存在性能瓶颈。这个问题…...

LeetCode 力扣热题100 二叉树的直径

class Solution { public:// 定义一个变量 maxd,用于存储当前二叉树的最大直径。int maxd 0; // 主函数,计算二叉树的直径。int diameterOfBinaryTree(TreeNode* root) {// 调用 maxDepth 函数进行递归计算,并更新 maxd。maxDepth(root);// …...

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…...

小哆啦解题记:整数转罗马数字

小哆啦解题记:整数转罗马数字 小哆啦开始力扣每日一题的第十四天 https://leetcode.cn/problems/integer-to-roman/submissions/595220508/ 第一章:神秘的任务 一天,哆啦A梦接到了一项任务——将一个整数转换为罗马数字。他心想:…...

【Java数据结构】排序

【Java数据结构】排序 一、排序1.1 排序的概念1.2 排序的稳定性1.3 内部排序和外部排序1.3.1 内部排序1.3.2 外部排序 二、插入排序2.1 直接插入排序2.2 希尔排序 三、选择排序3.1 选择排序3.2 堆排序 四、交换排序4.1 冒泡排序4.2 快速排序Hoare法:挖坑法&#xff…...

我的求职之路合集

我把我秋招和春招的一些笔面试经验在这里发一下,网友们也可以参考一下。 我的求职之路:(1)如何谈自己的缺点 我的求职之路:(2)找工作时看重的点 我的求职之路:(3&…...

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…...

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代&#xff0c;数据如同新时代的石油&#xff0c;蕴含着巨大的价值。从商业决策到科研探索&#xff0c;从城市规划到环境监测&#xff0c;海量数据的高效处理、精准分析与直观可视化&#xff0c;已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…...

LBS 开发微课堂|AI向导接口服务:重塑用户的出行体验

为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务&#xff08;LBS&#xff09;开发微课堂” 系列技术案例 第六期的主题是 《AI向导接口服务的能力与接入方案》 随着地图应…...

AI导航工具我开源了利用node爬取了几百条数据

序言 别因今天的懒惰&#xff0c;让明天的您后悔。输出文章的本意并不是为了得到赞美&#xff0c;而是为了让自己能够学会总结思考&#xff1b;当然&#xff0c;如果有幸能够给到你一点点灵感或者思考&#xff0c;那么我这篇文章的意义将无限放大。 背景 随着AI的发展市面上…...

openstack单机安装

openstack单机安装 网卡配置安装依赖开启虚拟环境修改配置文件 部署openstack部署openstack客户端访问可视化界面Horizon补充 本篇主要讲述Ubuntu2204单机安装openstackstable/2024.2。其他版本的Linux系统或者openstack版本&#xff0c;请参考openstack官网。 网卡配置 需要配…...

Vue3实现小红书瀑布流布局任意组件动态更新页面方法实践

思路 1.首先定义一个瀑布流容器&#xff0c;它的高度暂定&#xff08;后面会更新&#xff09;。把需要布局的组件&#xff08;这里叫做waterfall-item&#xff09;放在瀑布流容器里面渲染出来。使用绝对定位&#xff08;position: absolute&#xff09;&#xff0c;把它移到屏幕…...

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…...

Next.js 实战 (十):中间件的魅力,打造更快更安全的应用

什么是中间件&#xff1f; 在 Next.js 中&#xff0c;中间件&#xff08;Middleware&#xff09;是一种用于处理每个传入请求的功能。它允许你在请求到达页面之前对其进行修改或响应。 通过中间件&#xff0c;你可以实现诸如日志记录、身份验证、重定向、CORS配置、压缩等任务…...

python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传

目录 鼠标事件 悬停 移动 按键 点击 滚轮操作 拖拽 键盘事件 输入文本内容 type输入内容 fill输入内容 按键操作press 文件上传 下拉选/单选框/复选框 滚动条操作 鼠标事件 悬停 page.get_by_text(设置,exactTrue).nth(1).hover() 移动 page.mouse.move(x33…...

【论文+源码】Diffusion-LM 改进了可控文本生成

这篇论文探讨了如何在不重新训练的情况下控制语言模型&#xff08;LM&#xff09;的行为&#xff0c;这是自然语言生成中的一个重大开放问题。尽管近期一些研究在控制简单句子属性&#xff08;如情感&#xff09;方面取得了成功&#xff0c;但在复杂的细粒度控制&#xff08;如…...

双目立体校正和Q矩阵

立体校正 对两个摄像机的图像平面重投影&#xff0c;使二者位于同一平面&#xff0c;而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R&#xff0c;T) 从上图中可以看出&#xff0c;该算法主要分为两步&#xff1a; 使成像平面共面 这个办法很直观&#xff…...

vscode 自用插件

vscode按住ctrl鼠标左键无法跟踪跳转方法名&#xff0c;装这些插件就可以 vscode-elm-jump:常规的代码跳转定义 Vue CSS Peek:跳转css定义 vue-helper:变量函数只跳转定义 Vetur 代码提示 Baidu Comate 自动帮你写console.log Turbo Console Log: ctrl alt l 选中变量之后&am…...

OpenCV:在图像中添加高斯噪声、胡椒噪声

目录 在图像中添加高斯噪声 高斯噪声的特性 添加高斯噪声的实现 给图像添加胡椒噪声 实现胡椒噪声的步骤 相关阅读 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像滤波、卷积与…...

DuckDB:Golang操作DuckDB实战案例

DuckDB是一个嵌入式SQL数据库引擎。它与众所周知的SQLite非常相似&#xff0c;但它是为olap风格的工作负载设计的。DuckDB支持各种数据类型和SQL特性。凭借其在以内存为中心的环境中处理高速分析的能力&#xff0c;它迅速受到数据科学家和分析师的欢迎。在这篇博文中&#xff0…...

MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

kotlin的协程的基础概念

Kotlin的协程是一种用于简化异步编程的强大工具。 理解协程的基础概念可以帮助开发者有效地利用其能力。 以下是Kotlin协程的一些关键基础概念&#xff1a; 协程&#xff08;Coroutines&#xff09; &#xff1a; 协程是一种用于处理并发任务的编程模型&#xff0c;它可以在单…...

Spring--SpringMVC使用(接收和响应数据、RESTFul风格设计、其他扩展)

SpringMVC使用 二.SpringMVC接收数据2.1访问路径设置2.2接收参数1.param和json2.param接收数据3 路径 参数接收4.json参数接收 2.3接收cookie数据2.4接收请求头数据2.5原生api获取2.6共享域对象 三.SringMVC响应数据3.1返回json数据ResponseBodyRestController 3.2返回静态资源…...

隐藏php版本信息x-powered-by

在生产环境中&#xff0c;并不想让别人知道用的是什么版本的php&#xff0c;可以把x-powered-by隐藏掉 在nginx配置文件加上fastcgi_hide_header X-Powered-By; 如下图所示 配置修改后平滑重启nginx...