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

Java技术栈总结:Redis篇

一、数据类型

Redis 自身是一个 Map,其中的所有数据均采用“key:value”的形式存储。

数据类型指的是存储的数据的类型,即 value 部分的类型,key 的部分只能是字符串。

value 部分的数据类型:<String、List、Hash、Set、Zset、HyperLogLog>

  • List 是双向链表实现,存储的数据都是 String 类型;
  • Hash 底层为数组加链表,出现哈希冲突使用的是头插法向链表添加数据;Rehash 的过程为渐进式 Rehash,内部维护了两个哈希表 Ht[0]、Ht[1],其中 Ht[0]是一般用到的哈希表,Ht[1]只在 Rehash 的过程中才会用到;
  • Set
  • Zset 如何实现排行榜?
  • HyperLogLong

1、使用场景

String:缓存、分布式锁(setnx、redission)

List:消息队列

Zset:延迟队列


二、I/O模型

<socket请求--I/O多路复用程序--文件事件分派器--事件处理器>

I/O多路复用机制:通过监视多个描述符,一旦某个描述符就绪,就能够通知程序进行响应;包括select、poll、epoll等;

Redis的I/O模型默认采用的机制为epoll

【采用单线程较快的原因】

  • Redis大部分操作都是在内存中直接完成的,采用的数据结构如哈希表、跳表;
  • 采用了多路复用机制,使得网络I/O操作能并发处理大量的客户端请求。

三、持久化 AOF|RDB

AOF写操作追加记录,RDB为某一时刻数据快照。

  • AOF 文件的内容是操作命令;
  • RDB 文件的内容是二进制数据。

1、AOF(append only file)

写操作记录到日志文件,命令执行成功才进行写入。

(1)功能开启

Redis默认是关闭的,需要在redis.conf配置文件中修改配置开启:

# 是否开启AOF功能,默认为no

appendonly yes

# AOF文件

appendfilename "appendonly.aof"

(2)刷盘策略

  • always,同步写回--有写命令执行成功,立即将日志写入磁盘;(满足持久性)
  • everysec,命令执行完,先把日志写入到AOF缓冲区,每隔一秒写一次磁盘(默认方案);
  • no,命令执行完,写入到AOF缓存区,由操作系统决定何时写磁盘。

# 配置示例

appendfsync always

配置项刷盘时机特点
always同步刷盘可靠性高,几乎不丢失数据。性能较差
everysec每秒性能适中。最多丢失1秒的数据
no操作系统控制可靠性差,可能丢失大量数据

(3)bgrewriteaof 优化key多次修改

AOF文件记录过程中,同一个key可能会存在被多次修改的情况。这时AOF中就会记录该key的多条记录数据,而只有最后一条有意义。

可以通过bgrewriteaof命令,让AOF文件执行重写功能,用最少的命令达到相同的效果。

同时,AOF支持在触发一定阈值时自动重写AOF文件,对应的redis.conf配置:

# AOF文件比之前增长超过多少百分比触发重写

auto-aof-rewite-percentage 100

# AOF文件体积达到多大以上触发重写

auto-aof-rewrite-min-size 64mb

2、RDB(Redis BackUp file)

Redis数据备份文件,也被称为Redis数据快照。

把内存数据以快照的形式保存的磁盘上,与AOF相比,它记录的是某一时刻的数据,不是操作。当Redis出现故障重启后,从磁盘中读取快照文件,恢复数据。

(1)数据备份操作

【客户端主动备份】

# redis-cli

  • 方式1:save   # 由主进程执行RDB,会阻塞所有命令
  • 方式2:bgsave  # 开启子进程执行RDB,避免主进程受到影响

【系统自动备份】

在redis.conf中,配置,示例:

save 100 1   # 表示在100秒内,至少有一个key出现了修改,则执行bgsave;

save 500 200 # 500秒内,至少有200个key出现了修改,则执行bgsave。

(2)执行原理

bgsave执行开始时,会fork主进程得到子进程,并拷贝主进程的页表,共享主进程得的内存数据。完成fork后,读取内存数据并写入RDB文件中。

同步数据的过程中,主进程执行了写操作导致数据变动影响的处理:

  • fork采用了copy-on-write技术(写时复制),
    • 当主进程执行读操作时,访问共享内存;
    • 主进程执行了写操作的情况,则会拷贝一份内存中的数据,执行读写操作。

3、性能对比

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之前的数据可能会丢失相对完整,取决于刷盘策略
文件大小有压缩,文件体积小记录命令,文件体积很大
宕机数据恢复速度
数据恢复优先级低,因为数据完整性不如AOF
资源占用高,大量消耗CPU及内存低,主要是磁盘I/O资源,但AOF重写时会占用大量的CPU和内存资源
使用场景可以容忍一定的数据丢失,追求更快的启动速度对数据安全要求较高

4、组合使用

为了兼顾RDB恢复速度快及AOF丢失数据少的优点,Redis4.0开始支持混合使用AOF日志与内存快照,称为混合持久化。

开启混合持久化功能,在配置文件redis.conf中设置:

aof-use-rdb-preamble yes  # yes表示开启

混合持久化工作在 AOF日志重写过程

当开启了混合持久化后,在 AOF 重写日志时,fork 出来的子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录到重写缓冲区里。重写缓冲区里的增量命令会以 AOF 的方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。

使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据


四、主从复制

1、主从复制设置:

  • 通过1)在从节点执行“SLAVE OF 主节点ip 端口号”;
  • 或者2)设置“slaveof选项”;

2、旧版主从同步

分为两个步骤:同步、命令传播。

  • 同步:
    • 从向主发送“SYNC命令”;
    • 主服务器收到后执行“BGSAVE”命令,生成一个“RDB”文件,并使用缓冲区记录从现在开始执行的所有命令;
    • BGSAVE命令执行完成后,主向从发送RDB文件,从服务器接收并载入,将自己更新成主服务器执行BGSAVE命令时刻的数据库状态;
    • 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行,更新状态到主服务器当前状态。
  • 命令传播:
    • 主服务器将自身执行的写命令,发送给从服务器执行。

   问题:一旦断开连接,需要从头开始执行,而不是只同步断开期间的命令,效率低。

3、新版主从同步(版本2.8开始)

  • 使用“PSYNC命令”代替了旧版的“SYNC命令”;包括完整重同步部分重同步两种模式,其中完整重同步同旧版的同步过程,用于初次同步;部分重同步用于处理断线后的重连接情况。
  • 断线后重连接,如果条件允许,主服务器可将断线期间执行的写命令发送给从服务器,从服务器接收并执行,从而将状态更新为主服务器当前状态。

断线重连接后的“如果条件允许”,条件是判断从服务器断开时刻的复制偏移量和主服务器的“复制积压缓冲区”数据的关系。如果偏移量之后的数据存在于缓冲区则执行部分重同步,否则全量。

4、高可用性

哨兵 + 主从架构。

主节点负责进行写数据操作,从节点进行读数据操作。主节点写数据成功会直接返回成功的消息通知,但是如果还没有将数据同步给从节点,主节点就宕机的话,从节点成为新的主节点,刚新写入的数据就丢失了。

哨兵的数量为奇数个。


五、过期淘汰策略

Redis 的过期策略以及内存淘汰机制?

1、过期策略:

定时删除、定期删除、惰性删除。

实际使用:<定期 + 惰性>

(1)如何判断已过期

当我们对一个key设置了过期时间,Redis会把该key与过期时间存储到一个字典中(expires dict)。即,过期字典中保存了所有key的过期时间。

当我们查询一个 key 时,Redis 首先检查该 key 是否存在于过期字典中:

  • 如果不在,则正常读取键值;
  • 如果存在,则会获取该 key 的过期时间,然后与当前系统时间进行比对,如果比系统时间大,那就没有过期,否则判定该 key 已过期。

(2)各种过期策略

定时删除策略:设置key的过期时间时,Redis同时创建一个定时事件,当时间到达时,由事件处理器自动删除对应的key。

优点:删除快,及时释放内存空间;缺点:CPU资源消耗大。

定期删除策略:每隔一定的时间,对数据进行扫描(支持随机和全量),删除过期的key。

优缺点:性能及及占用空间居中。难以确定删除操作执行的时长和频率,频率过高类似定时删除,CPU不友好;频率过低,类似惰性删除,内存不友好。

惰性删除策略:不主动删除过期的key,当出现请求访问key时判断当前key是否过期,如果过期则删除。

优点:CPU资源占用少;缺点:内存释放不及时。

# 定期删除的随机取数与全量扫描

Q:默认是哪种策略?

A:Redis的默认定期删除策略是基于LRU(最近最少使用)算法的,而不是随机取数或全量扫描。当Redis的内存使用率超过配置的最大内存限制时,它会自动删除一些旧的键,以释放内存空间。这种策略称为"LRU"策略,即最近最少使用的键会被删除

然而,Redis并没有直接提供随机取数或全量扫描的定期删除策略。如果你想实现这样的功能,你需要通过自定义脚本或者第三方插件来实现。

Redis的定期删除策略(如基于LRU的策略)通常不会扫描全部的键。相反,它会跟踪每个键最后一次被访问的时间,并根据这个时间戳来决定哪些键是最少使用的。当内存使用率超过配置的最大内存限制时,Redis会根据LRU算法删除那些最长时间未被访问的键,而不是随机选择或者扫描所有键。

2、内存淘汰机制:

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:……,在整个键空间中,移除最近最少使用的key。(这个是最常用的)(间隔时间长)
  • allkeys-lfu:……,在整个键空间中,移除最不经常(最少)使用的key(使用频率低)。
  • allkeys-random:……,在整个键空间中,随机移除某个key。
  • volatile-lru:……,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-lfu:……,在设置了过期时间的键空间中,移除最不经常(最少)使用的key。
  • volatile-random:……,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:……,在设置了过期时间的键空间中,过期时间早的key优先移除。

Redis 6.0及更高版本,默认策略是volatile-lru。而对于Redis 5.x及更早版本,这个默认策略是allkeys-lru。(另有地方说默认策略是noeviction,待考证)

(1)机制配置

配置文件配置:

maxmemory-policy = allkeys-lru

命令操作:

redis-cli config set maxmemory-policy allkeys-lru

Q:如果数据库有1000万数据 ,Redis只能缓存20w数据,如何保证Redis中的数据都是热点数据 ?

A:使用allkeys-lru(选用最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据。

Q:Redis内存用完会发生什么?

A:主要看配置的淘汰策略是什么。如果是 noeviction ,有新数据写入会直接报错...

3、内存淘汰算法:

  • 先进先出(FIFO)算法;
  • 最近最少使用算法(LRU)算法;
  • 最不常用(LFU)算法;

LRU(Least Recently Used,最近最少使用)和 LFU(Least Frequently Used,最少使用频率)都是缓存淘汰策略,用于在缓存空间满时决定删除哪些数据。它们的区别在于:

  1. 淘汰依据

    • LRU:根据数据最近一次被访问的时间进行淘汰。
    • LFU:根据数据被访问的频率进行淘汰。
  2. 适用场景

    • LRU:适用于数据访问具有时间相关性的情况,比如Web服务器的动态内容缓存。
    • LFU:适用于数据访问具有统计规律的情况,比如搜索引擎的索引缓存。
  3. 实现复杂度

    • LRU:实现简单,只需要维护一个链表即可。
    • LFU:实现复杂,需要维护一个哈希表或类似的数据结构来记录每个数据的访问次数。

总的来说,LRU适合于对时间敏感的应用场景,而LFU适合于对访问频率敏感的应用场景。


六、Redis事务

1、相关命令

涉及命令:MULTI、EXEC、WATCH等;

开启事务:MULTI;

提交事务:EXEC;

2、实现

(1)事务队列

开启事务到提交事务之间的命令都会被放入“事务队列”中,事务队列是一个 multiCmd 类型的数组。以先进先出的方式保存入队的命令。

客户端执行事务提交命令EXEC时,该命令会立即被服务器执行。

服务器会遍历对应客户端的事务队列,执行队列中保存的命令,然后将执行的结果全部返回给客户端。

(2)WATCH命令

一个乐观锁,在EXEC命令执行前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否有被修改的情况。如果有,服务器拒绝执行该事务,并向客户端返回执行失败的空回复。

每个Redis数据库都保存着一个watched_keys”字典,该字典的键为被WATCH命令监视的数据库键,字典的值为一个链表,链表的内容为所有监视该数据库键的客户端

所有对数据库修改的命令,都会触发对 watched_keys 字典的检查,如果有对应的key的话,会把监视该键的所有客户端的 REDIS_DIRTY_CAS 标志打开,表示该客户端事务的安全性已经被破坏。

3、与关系型数据库事务的区别

不支持回滚。

即使在执行过程中出现了错误,出现错误前后的命令也不会受到影响,会全部执行完。


七、分布式寻址算法

分布式寻址算法:1)hash算法;2)一致性哈希 + 虚拟节点;3)hash slot(hash槽)算法

  • hash算法:将不同的请求hash碰撞后放到固定的hash桶中;扩缩容可用性低;
  • 一致性hash:将hash值空间组织成一个虚拟的圆环;顺时针查找;使用虚拟节点解决分布不均的问题;
  • hash槽(默认):记录和物理机之间引入了虚拟桶层,记录通过hash函数映射到虚拟桶,记录和虚拟桶是多对一的关系;第二层是虚拟桶和物理机之间的映射,同样也是多对一的关系,即一个物理机对应多个虚拟桶,这个层关系是通过内存表实现的。

八、布隆过滤器

bitmap(位图):相当于一个以 bit(位) 为单位的数组,数组中的每个单元只能存储数据0或者1。

布隆过滤器的作用:判断一个元素是否在一个集合中。

误判的情况:在查询某个不存在的数据时,如果该数据经过hash运算对应的值恰好在布隆过滤器的位图上都为1,则会被误判为存在。只会出现不存在的数据被误判为存在,反之不会出现。

误判率:数组越小误判率越大;数组越大的情况误判率就越小,但同时消耗的内存也越大。

注:误判断的情况,可以考虑使用两套布隆过滤器。本身是进行的哈希运算,很难出现两套都冲突的情况。


九、分布式锁

1、特性

互斥性、超时释放、可重入性、高性能及高可用、安全性

2、基本实现

setnx + expire

先用setnx进行锁抢占,再用expire给锁设置一个过期时间

# NX是互斥,EX是超时时间
SET lock value NX EX 10
# 释放锁
DEL key

Redis实现分布式锁如何设置有效时长?

  • 根据业务执行时间预估;
  • 给锁续期(单独开启一个线程);

3、Redission

(1)定义

  • Redisson是Redis官方推荐的Java版的Redis客户端。
  • 基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。
  • 在网络通信上是基于NIO的Netty框架,保证网络通信的高性能。
  • 在分布式锁的功能上,它提供了一系列的分布式锁;如:
    • 可重入锁(Reentrant Lock)
    • 公平锁(Fair Lock)
    • 非公平锁(unFair Lock)
    • 读写锁(ReadWriteLock)
    • 联锁(MultiLock)
    • 红锁(RedLock),不是只在一个Redis实例上创建锁,而是在多个实例(N/2 + 1,其中N为节点数)上加锁。

(2)实现分布式锁

  • Redisson配置;
  • 代码:
    @AutowiredRedissonClient redissonClient;public void redissionLock() throws InterruptedException{// 获取锁(可重入锁)RLock lock = redissonClient.getLock("YOUR_LOCK_NAME");// 获取锁的最大等待时间,时间单位boolean isLock = lock.tryLock(10, TimeUnit.SECONDS);// 最大等待时间,锁的失效时间,时间单位。使用此方法,watchDog 不会生效// boolean isLock = lock.tryLock(10, 30, TimeUnit.SECONDS);if (!isLock) {return;}try {// 执行具体的业务逻辑} finally {lock.unlock();}}

Q:Redisson分布式锁的底层实现?

A:底层实现为 setnx + lua脚本(保证原子性)

Q:Redisson的分布式锁,可以重入吗?

A:可以重入。在Redis存储的时候,使用的是hash结构,key为锁的名称,value包括了持有锁的线程信息加锁的次数。只有持有当前锁的线程可以重入。

Q:Redisson锁可以解决主从数据一致的问题吗?

A:不能解决。如果持有锁的节点发送宕机,锁的信息未同步,恢复后新的节点作为了主节点,这时候其他线程可以加锁成功。

可以使用Redisson提供的红锁解决(N/2 + 1 个节点加锁),但是性能较低。如果业务要求强一致性,可以考虑使用ZooKeeper实现的分布式锁。

 


十、常见问题

1、*缓存穿透、击穿、雪崩

(1)缓存穿透:

  • 查找的数据系统中不存在,既不在Redis,也不在DB

解决:

  • 1)缓存空对象;(查询的数据为空,仍然把这个空数据进行缓存。{key:1, value:null})
    • 优点:实现简便;
    • 缺点:内存消耗大;可能出现数据不一致(先前不存在的数据,DB中后续已存储,缓存未同步的情况)。
  • 2)布隆过滤器;
    • 预热:添加数据到缓存中的同同时,"添加"到布隆过滤器。

(2)缓存击穿:

  • Redis中数据过期,查找的数据不在Redis,但DB存在。给某个key设置了过期时间,在这个key过期的时候,恰好有大量查询该key的请求过来,这些请求在查询Redis获取数据失败后去查询数据库,可能会导致把DB打垮。

解决:

  • 1)互斥锁;(使用分布式锁)
  • 2)逻辑过期;
    • 假设有一条数据:key:1,value: {"id":5, "name":"zhangfei", "expire":1720069442000};不对这条数据设置过期时间,而是使用Value的一个字段作为是否过期的判断。例如这里的expire字段,对应内容为逻辑过期时间的时间戳。
  • 3)预设热门数据,并实时监测变化调整;

互斥锁能够保证数据的强一致性,性能较差。逻辑过期优先保证高可用,非强一致,性能较好。 

(3)缓存雪崩:

  • 大量数据缓存过期失效,导致查DB。
  • 在同一时间段,大量的key失效,或者Redis服务宕机,导致大量请求访问数据库,给数据库造成访问压力。

解决:

  • 1)失效时间增加随机数;
  • 2)对数据库或者服务,增加过载保护或限流(Nginx、微服务网关);
  • 3)考虑多级缓存(Guava或Gaffeine作为一级缓存,Redis作为二级缓存);
  • 4)针对宕机的情况,可以利用Redis集群提高服务的可用性(哨兵模式、集群模式)。

注:限流一般作为保底策略使用。


【缓存清洗】

  • flushdb:清空当前数据库中的所有 key;
  • flushall:清空整个 Redis 服务器的数据(删除所有数据库的所有 key )

【并发竞争Key】

  • 乐观锁--Redis事务,watch指定keys;
  • 分布式锁;
  • 时间戳--类似数据库的乐观锁,判断处理的时间是否对的上;
  • 消息队列。

2、大 Key

大 key 是值 key 对应的 value 内容很大

一般而言,下面这两种情况被称为大 key:

  • String 类型的值大于 10 KB;
  • Hash、List、Set、ZSet 类型的元素的个数超过 5000个。

(1)可能造成的问题

  • 客户端超时阻塞。Redis命令单线程处理,操作大key时,会比较耗时,从而阻塞Redis。
  • 引发网络阻塞。每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的。
  • 阻塞工作线程。如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令。
  • 内存分布不均。集群模型在 slot 分片均匀情况下,会出现数据和查询倾斜情况,部分有大 key 的 Redis 节点占用内存多,QPS 也会比较大。

(2)查找大Key

方法1:“ridis-cli  --bigkeys”

注意事项:

  • 最好选择在从节点上执行该命令。因为主节点上执行时,会阻塞主节点;
  • 如果没有从节点,那么可以选择在 Redis 实例业务压力的低峰阶段进行扫描查询,以免影响到实例的正常运行;或者可以使用 -i 参数控制扫描间隔,避免长时间扫描降低 Redis 实例的性能。

不足:

  • 这个方法只能返回每种类型中最大的那个 bigkey,无法得到大小排在前 N 位的 bigkey;
  • 对于集合类型来说,这个方法只统计集合元素个数的多少,而不是实际占用的内存量。但是,一个集合中的元素个数多,并不一定占用的内存就多。因为,有可能每个元素占用的内存很小,这样的话,即使元素个数有很多,总内存开销也不大。

方法2:使用SCAN命令(Redis 5.0及以上)

使用 SCAN 命令对数据库扫描,然后用 TYPE 命令获取返回的每一个 key 的类型。

对于 String 类型,可以直接使用 STRLEN 命令获取字符串的长度,也就是占用的内存空间字节数。

对于集合类型来说,有两种方法可以获得它占用的内存大小:

  • 如果能够预先从业务层知道集合元素的平均大小,那么,可以使用下面的命令获取集合元素的个数,然后乘以集合元素的平均大小,这样就能获得集合占用的内存大小了。List 类型:LLEN​ 命令;Hash 类型:HLEN​ 命令;Set 类型:SCARD​ 命令;Sorted Set 类型:ZCARD 命令;
  • 如果不能提前知道写入集合的元素大小,可以使用MEMORY USAGE 命令(需要 Redis 4.0 及以上版本),查询一个键值对占用的内存空间。

方法3:使用RdbTools工具

使用 RdbTools 第三方开源工具,可以用来解析 Redis 快照(RDB)文件,找到其中的大 key。

比如,下面这条命令,将大于 10 kb 的  key  输出到一个表格文件。

“rdb dump.rdb -c memory --bytes 10240 -f redis.csv”

(3)删除方法

方式一:分批次删除

  • 删除大 Hash,使用 hscan 命令,每次获取 100 个字段,再用 hdel 命令,每次删除 1 个字段。
  • 删除大 List,通过 ltrim 命令,每次删除少量元素。
  • 删除大 Set,使用 sscan 命令,每次扫描集合中 100 个元素,再用 srem 命令每次删除一个键。
  • 删除大 ZSet,使用 zremrangebyrank 命令,每次删除 top 100个元素。ZREMRANGEBYRANK key min max

方式二:异步删除(4.0版本以上)

用 unlink 命令代替 del 来删除。

这样 Redis 会将这个 key 放入到一个异步线程中进行删除,这样不会阻塞主线程。

3、双写一致性问题

多个线程同时操作一条数据,

(1)加锁

RedissClient读写锁,读锁为共享锁,写锁为独占锁。

RReadWriteLock readWriteLock = redissionClient.getReadWriteLock("YOUR_LOCK_NAME");
// 读锁
RLock readLock = readWriteLock.readLock();
try {readLock.lock();...
} finally {readLock.unlock();
}// 写锁
RLock writeLock = readWriteLock.writeLock();
try{writeLock.lock();...} finally {writeLock.unlock();
}

特点:强一致性,性能较低。

(2)异步通知

有操作修改数据的场景,操作修改数据库数据,并发送MQ消息。缓存对应的服务接收到MQ消息后,修改缓存数据。


参考:

Redis过期策略及内存淘汰机制;

什么是可重入锁?详解redis实现分布式重入锁的方法;

Redis大key删除的相关问题;redis随手记-大key删除法;面试官:Redis 大 Key 要如何处理;

Redis删除大key引发的线上事故;

Redis的持久化 ROB+AOF;图解Redis介绍 | 小林coding

https://www.bilibili.com/video/BV1yT411H7YK

相关文章:

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…...

django models对应的mysql类型

Django模型字段类型与MySQL数据库类型的对应关系如下&#xff1a; Django 模型字段类型MySQL 数据库类型AutoFieldBIGINT UNSIGNEDCharFieldVARCHARIntegerFieldINTDecimalFieldDECIMALDateFieldDATEDateTimeFieldDATETIMEFileField, ImageFieldVARCHAR (用于文件路径)Boolean…...

2024攻防演练:亚信安全新一代WAF,关键时刻守护先锋

实网攻防 网络安全如同一面坚固的盾牌&#xff0c;保护着我们的信息资产免受无孔不入的威胁。而其中&#xff0c;WAF就像网络安全的守门员&#xff0c;关键时刻挺身而出&#xff0c;为您的企业筑起一道坚实的防线。 攻防不对等 防守方实时应答压力山大 在攻防对抗中&#xf…...

富格林:曝光有效方案安全交易

富格林认为&#xff0c;近些年来大家的投资理财意识逐渐增强&#xff0c;现货黄金作为一种自带优质避险功能的投资产品&#xff0c;自然就受到投资者的关注和追捧。但现货黄金的交易市场相对来说还是比较混杂&#xff0c;投资小白稍不留神就可能会陷入受害陷阱当中无法安全交易…...

ArtTS系统能力-窗口管理的学习(3.2)

上篇回顾&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 本篇内容&#xff1a; ArtTS系统能力-窗口管理的学习&#xff08;3.2&#xff09; 一、 知识储备 1. 基本概念 窗口渲染式能力&#xff1a;指对状态栏、导航栏等系统窗口进行控制&#xff0c;减…...

C++ 运算符的优先级和关联性表

C 运算符的优先级和关联性表 1. Precedence and associativity (优先级和结合性)2. Alternative spellings (替代拼写)3. C operator precedence and associativity table (C 运算符的优先级和关联性表)References C documentation (C 文档) https://learn.microsoft.com/en-us…...

正则表达式替换字符串的方法

正则表达式替换字符串的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一个非常实用的编程技术&#xff1a;使用正则表达式替换字符串。正则…...

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(五)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…...

2024/7/4总结

http协议 http协议,是一个客户端请求和响应的标准协议&#xff0c;这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。 通信规则规定了客户端发送给服务器的内容格式&#xff0c;也规定了服务器发送给…...

【Android面试八股文】Looper如何在子线程中创建?

文章目录 一、Looper的几个重要方法二、子线程中使用Looper的方式1三、子线程中使用Looper的方式23.1 使用HandlerThread实现3.2 HandlerThread源码解析创建子线程的 Looper必须要通过 Looper.prepare()初始化looper,然后再通过 Looper.loop()方法让 Loop运行起来。 那么具…...

IT项目管理文档体系

IT项目管理文档体系是确保项目顺利进行、有效沟通和合规性的关键组成部分。一个完善的文档体系能够帮助项目团队记录决策过程、明确职责、跟踪进度、管理变更并提供审计痕迹。 项目启动文档&#xff1a; 项目章程&#xff1a;正式授权项目启动&#xff0c;定义项目目标、范围、…...

ELK企业内部日志分析系统(1)

ELKKafkaFilebeat企业内部日志分析系统(1) Elasticsearch集群部署 1.部署环境 IP地址主机名配置系统版本192.168.222.129es12核4GRockyLinux192.168.222.130es22核3GRockyLinux192.168.222.131es32核3GRockyLinux 2.配置主机名解析和主机名 #关闭防火墙与selinux #更改主机…...

反序列化POP链技术详解

POP&#xff08; Procedure Oriented Programming &#xff09;链是反序列化安全问题中相对比较重要的技术点&#xff0c;相比于其他的反序列化问题&#xff0c;这种漏洞的产生更加难以发现&#xff0c;以及在利用上也比较复杂。 要掌握这个东西首先要先了解面向对象中的几个特…...

process.env.VUE_APP_BASE_API

前端&#xff1a;process.env.VUE_APP_BASE_API 在Vue.js项目中&#xff0c;特别是使用Vue CLI进行配置的项目&#xff0c;process.env.VUE_APP_BASE_API 是一个环境变量的引用。Vue CLI允许开发者在不同环境下配置不同的环境变量&#xff0c;这对于管理API基础路径、切换开发…...

面试题--SpirngCloud

SpringCloud 有哪些核心组件?(必会)  Eureka: 注册中心, 服务注册和发现  Ribbon: 负载均衡, 实现服务调用的负载均衡  Hystrix: 熔断器  Feign: 远程调用  Zuul: 网关  Spring Cloud Config: 配置中心 (1)Eureka 提供服务注册和发现, 是注册中心. 有两个组…...

中位数贪心,3086. 拾起 K 个 1 需要的最少行动次数

一、题目 1、题目描述 给你一个下标从 0 开始的二进制数组 nums&#xff0c;其长度为 n &#xff1b;另给你一个 正整数 k 以及一个 非负整数 maxChanges 。 Alice 在玩一个游戏&#xff0c;游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums 中拾起 k 个 1 。游戏开始…...

xml_woarchive undefined symbol

最近在linux中编译一个自己写的老代码。是个C动态库。可以编译成功&#xff0c;但直到运行的时候才报 boost xml_woarchive undefined symbol. 解决的方法是在编译时要加上 wserialization 库。 注意&#xff0c;这个库有含 w 和不含 w 两个。在我这里需要使用含 w 的。 如果…...

SiCat:一款多功能漏洞利用管理与搜索工具

关于SiCat SiCat是一款多功能漏洞利用管理与搜索工具&#xff0c;该工具基于纯Python 3开发&#xff0c;旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat专注于网络安全管理方面的实践工作&#xff0c;允许研究人员快速实现在线搜索&#xff0c;…...

毕业论文初稿写作方法与过程

毕业论文初稿写作方法与过程 毕业论文是大学生在学业结束前必须完成的一项重要任务&#xff0c;它不仅是对学生所学知识的综合运用&#xff0c;也是对学生研究能力和写作能力的检验。写好毕业论文初稿是完成高质量毕业论文的关键一步。下面将具体阐述毕业论文初稿的写作方法和过…...

SLAM 精度评估

SLAM 精度的评估有两个最重要的指标&#xff0c;即绝对轨迹误差&#xff08;ATE&#xff09;和相对位姿误差&#xff08;RPE&#xff09;的 均方根误差&#xff08;RMSE&#xff09;: 绝对轨迹误差:直接计算相机位姿的真实值与 SLAM 系统的估计值之间的差值&#xff0c;首先将…...

Postman使用教程

传统接口风格 RESTful风格 使用Postman完成测试用例目标&#xff1a; Postman教程 &#xff08;1&#xff09;准备工作&#xff0c;下载Postman新建 &#xff08;2&#xff09;登录接口调试-获取验证码 &#xff08;3&#xff09;登录接口调试-登录 &#xff08;4&#xff09;…...

UDP协议深入解析

一. UDP报文结构 UDP报文由以下4个字段组成: 源端口号(Source Port)&#xff1a;16位,标识发送方的端口号。如果发送方没有使用端口号,则该字段为0。 目标端口号(Destination Port)&#xff1a;16位,标识接收方的端口号。 长度(Length)&#xff1a;16位,表示UDP报文的总长度,…...

Rethinking Federated Learning with Domain Shift: A Prototype View

CVPR2023,针对分布式数据来自不同的域时,私有模型在其他域上表现出退化性能(具有域转移)的问题。提出用于域转移下联邦学习的联邦原型学习(FPL)。核心思想是构建集群原型和无偏原型,提供富有成效的领域知识和公平的收敛目标。将样本嵌入拉近到属于相同语义的集群原型,而…...

打卡第2天----数组双指针,滑动窗口

今天是参与训练营第二天&#xff0c;这几道题我都看懂了&#xff0c;自己也能写出来了&#xff0c;实现思路很重要&#xff0c;万事开头难&#xff0c;希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号&#xff1a;977 不止是在卡尔这里…...

Running cmake version 2.8.12.2解决方案

Centos7安装mysql8.0&#xff0c;编译环节出现如下报错&#xff1a; Running cmake version 2.8.12.2 CMake Warning at CMakeLists.txt:82 (MESSAGE):Please use cmake3 rather than cmake on this platform-- Please install cmake3 (yum install cmake3) CMake Error at CMa…...

stm32中IIC通讯协议

参考资料&#xff1a;大部分均引用b站江协科技课程、GPT及网络资料 什么是IIC&#xff08;i2C&#xff09;通讯协议&#xff1f; 关键字&#xff1a;SCL、SDA、半双工、同步、串行。 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为I2C&#xff08;In…...

允许防火墙通过端口 6379(通常用于 Redis 服务)那些年因为连接失败而一起熬过的夜

要允许防火墙通过端口 6379&#xff08;通常用于 Redis 服务&#xff09;&#xff0c;您可以按照以下步骤在防火墙中添加规则。这里提供了使用 firewalld 和 ufw 两种常见防火墙管理工具的方法。 使用 firewalld &#xff08;CentOS、Red Hat 等&#xff09; 1. 启动并启用 f…...

tsconfig.json的include和exclude作用

tsconfig.json中的include和exclude属性用于指定需要被编译的TypeScript文件和需要被排除的文件。‌ include属性&#xff1a;‌用于指定哪些.ts、‌.tsx或.d.ts文件需要被编译。‌如果不指定include属性&#xff0c;‌则默认当前目录下除了exclude之外的所有.ts、‌.d.ts、‌…...

firewalld(8) policies

简介 前面的文章中我们介绍了firewalld的一些基本配置以及NAT的相关配置。在前面的配置中&#xff0c;我们所有的策略都是与zone相关的&#xff0c;例如配置的rich rule&#xff0c;--direct,以及NAT,并且这些配置都是数据包进入zone或者从zone发出时设置的策略。 我们在介绍…...

为什么进口主食冻干那么高贵?必入榜主食冻干总结分享

新手养猫人常常会有这样的疑问&#xff1a;为何进口主食冻干价格如此昂贵&#xff0c;但仍有大量养猫达人对其推崇备至&#xff1f;与国产主食冻干相比&#xff0c;进口产品的价格高出3-4倍之多&#xff0c;那么这高昂的价格背后&#xff0c;进口主食冻干是否真的值得推荐&…...

状态模式在金融业务中的应用及其框架实现

引言 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态的相关行为分离到独立的状态类中&#xff0c;使得状态转换更加明确和简洁。在金融业务中&#xff0c;状态模式可以用于实现交易状…...

redis学习(002 安装redis和客户端)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第5p-第p7的内容 文章目录 安装redis启动启动方式1&#xff1a;可执行文件启动启动方式2 基于配置文件启动修改redis配置文件 …...

在线客服系统多国语言,适合跨境外贸业务对外沟通 ,哈萨克语客服系统,根据浏览器语种标识自动切换...

我们看一下我们客服系统的哈萨克语展示。 演示网站&#xff1a;gofly.v1kf.com 有个客户&#xff0c;他们的业务主要是位于哈萨克斯坦&#xff0c;需求是访客端使用哈萨克语来展示。 现在这个界面就是哈萨克语的。当然&#xff0c;也可以切换成中文。界面上的文案已经切换成中文…...

等保2.0是否强制要求所有物联网设备都必须支持自动更新?

等保2.0对物联网设备自动更新的要求 等保2.0&#xff08;网络安全等级保护2.0&#xff09;是中国政府为了加强网络安全而推出的一套标准和要求。在物联网设备的安全管理方面&#xff0c;等保2.0确实提出了一系列措施&#xff0c;以确保设备的软件安全更新。这些措施包括&#…...

gin框架解决跨域问题

文章目录 前言一、使用github.com/gin-contrib/cors 前言 今天遇到了前后端跨域问题&#xff0c;前后端跨域解决蛮简单的&#xff0c;下面是解决方案 一、使用github.com/gin-contrib/cors go get github.com/gin-contrib/cors在路由的地方 r : gin.Default()corsConfig : c…...

4.判断登录用户选择按钮的展示

接着上一个文章&#xff0c;我们把按钮设置好了之后怎样可以做到登录的用户不同&#xff0c;选择展示的按钮不同&#xff1f; 我们可以从面向对象上手&#xff0c;例如获取到返回网站数据中&#xff0c;判断登录用户有特殊权限&#xff0c;就是管理员&#xff1a; # 1.判断登录…...

【硬核科普】存算一体化系统(Processing-in-Memory, PIM)深入解析

文章目录 0. 前言1. 提出背景1.1 存储墙1.2 功耗墙 2. 架构方案2.1 核心特征2.2 技术实现2.2.1 电流模式2.2.2 电压模式2.2.3 模式选择 2.3 PIM方案优势 3. 应用场景4. 典型产品4.1 鸿图H304.2 三星HBM-PIM 5. 存算一体化缺点6. 总结 0. 前言 按照国际惯例&#xff0c;首先声明…...

基于Java的壁纸网站设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Zookeeper底层原理

ZooKeeper 是一个高可用的分布式协调服务&#xff0c;广泛应用于分布式系统中&#xff0c;用于解决分布式系统的一致性问题。下面将详细介绍 ZooKeeper 的底层原理&#xff0c;包括其架构、数据模型、核心机制和一致性协议等方面。 1. 架构 ZooKeeper 采用主从架构&#xff0…...

Spring Boot 事件监听机制实战【自定义 Spring Boot 事件监听】

前言&#xff1a; 上一篇我们分析了 Spring Boot 事件监听的原理&#xff0c;本篇我们来自定义实现自己的监听器。 Spring Boot 系列文章传送门 Spring Boot 启动流程源码分析&#xff08;2&#xff09; Spring Boot 启动流程源码分析&#xff08;2&#xff09; Spring Bo…...

AIGC笔记--Stable Diffusion源码剖析之DDIM

1--前言 以论文《High-Resolution Image Synthesis with Latent Diffusion Models》 开源的项目为例&#xff0c;剖析Stable Diffusion经典组成部分&#xff0c;巩固学习加深印象。 2--DDIM 一个可以debug的小demo&#xff1a;SD_DDIM 以文生图为例&#xff0c;剖析SD中DDIM的…...

【BUUCTF-PWN】13-jarvisoj_level2_x64

参考&#xff1a;BUU pwn jarvisoj_level2_x64 64位函数调用栈 - Nemuzuki - 博客园 (cnblogs.com) 64位&#xff0c;开启了NX保护 执行效果如下&#xff1a; main函数&#xff1a; vulnerable_function函数 read函数存在栈溢出&#xff0c;溢出距离为0x808 查找后门…...

项目实战--Spring Boot 3整合Flink实现大数据文件处理

一、应用背景 公司大数据项目中&#xff0c;需要构建和开发高效、可靠的数据处理子系统&#xff0c;实现大数据文件处理、整库迁移、延迟与乱序处理、数据清洗与过滤、实时数据聚合、增量同步&#xff08;CDC&#xff09;、状态管理与恢复、反压问题处理、数据分库分表、跨数据…...

开发者工具攻略:前端测试的极简指南

前言 许多人存在一个常见的误区&#xff0c;认为测试只是测试工程师的工作。实际上&#xff0c;测试是整个开发团队的责任&#xff0c;每个人都应该参与到测试过程中。 在这篇博客我尽量通俗一点地讲讲我们前端开发过程中&#xff0c;该如何去测试 浏览器开发者工具简介 开…...

git保存分支工作状态

git stash...

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机&#xff1a;主机是计算机的核心部分&#xff0c;包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算&#xff1b;控制器负责协调和控制计算机的各个部件&#xff1b;主存…...

3D鸡哥又上开源项目!单图即可生成,在线可玩

大家好&#xff0c;今天和大家分享几篇最新的工作 1、Unique3D Unique3D从单视图图像高效生成高质量3D网格&#xff0c;具有SOTA水平的保真度和强大的通用性。 如下图所示 Unique3D 在 30 秒内从单视图野生图像生成高保真且多样化的纹理网格。 例如属于一张鸡哥的打球写真照 等…...

设计模式实现思路介绍

设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的&#xff0c;并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型&#xff1a;创建型、结构型和行为型。 创建型设计模式 创建型设计模式专注于如何创…...

Node.js学习教程

Node.js学习教程可以从基础到高级&#xff0c;逐步深入理解和掌握这一强大的JavaScript运行环境。以下是一个详细的Node.js学习教程概述&#xff0c;帮助初学者和进阶者更好地学习Node.js。 一、Node.js基础入门 1. 了解Node.js 定义&#xff1a;Node.js是一个基于Chrome V8…...

项目页面优化,我们该怎么做呢?

避免页面卡顿 怎么衡量页面卡顿的情况呢&#xff1f; 失帧和帧率FPS 60Hz就是帧率fps&#xff0c;即一秒钟60帧&#xff0c;换句话说&#xff0c;一秒钟的动画是由60幅静态图片连在一起形成的。 卡了&#xff0c;失帧了&#xff0c;或者掉帧了&#xff0c;一秒钟没有60个画面&…...