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

13--memcache与redis

前言:数据库读取速度较慢一直是无法解决的问题,大型网站应对的方式主要是使用缓存服务器来缓解这种情况,减少数据库访问次数,以提高动态Web等应用的速度、提高可扩展性。

1、简介

Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。

2、memcache

2.1、memcache简介

memcache特点如下:

  • 内置内存存储方式:数据完全不走硬盘,重启操作系统会导致全部数据消失。
  • 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可,所以极其方便读取。 存储项由“键、过期时间、可选的标志及数据”四个部分组成;
  • 不互相通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共 享信息,由客户端决策信息存放位置。

memcache工作流程:

  1. 检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,无需查询数据库。
  2. 如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份
  3. 保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

2.2、memcache部署

下述环境已提前更换阿里基础仓房,epel源,关闭防火墙和selinux

[root@localhost ~]# yum install -y memcached

修改配置文件

[root@localhost ~]# vim /etc/sysconfig/memcached 
[root@localhost ~]# cat /etc/sysconfig/memcached 
PORT="11211"          # Memcached服务监听的端口号
USER="memcached"       # 运行Memcached服务的用户
MAXCONN="1024"         # 允许的最大并发连接数
CACHESIZE="64"         # Memcached的缓存大小,单位为MB,可以根据内存大小进行调整
OPTIONS=""             # 其他启动选项,例如可用于设置内存分配策略或其他配置

启动memcache

[root@localhost ~]# systemctl start memcached[root@localhost ~]# ps aux | grep memcache
memcach+  62086  0.0  0.1 344100  1688 ?        Ssl  22:20   0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root      62095  0.0  0.0 112824   988 pts/0    R+   22:21   0:00 grep --color=auto memcache

尝试简单的memcache的使用(实际功能中此处为应用程序逻辑设计,和运维无关,此处仅为测试memcache功能使用)

[root@localhost ~]# yum install -y telnet
[root@localhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set name 0 900 9
liumuquan
STORED
get name
VALUE name 0 9
liumuquan
END
^]
telnet> quit
Connection closed.#    此处set参数解释#    set key的名字 key的id号 缓存过期时间(0为无限) 字符串最大长度

memcache这里简单整理了一下,主要重心还是放在redis上,redis对于memcache优势太明显了。

3、redis

3.1、redis简介

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。目前,Vmware在资助着redis项目的开发和维护。目前使用redis公司主要有暴雪、github、digg等。

redis特点:丰富的数据结构、支持持久化、支持事务(可以做集群分布式保证数据安全)、支持主从。

3.2、redis部署

基础环境

IP角色
192.168.188.128master1

安装redis

[root@localhost ~]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /redis-
[root@localhost ~]# cd /
[root@localhost /]# tar zxf redis-4.0.9.tar.gz 
[root@localhost /]# cd redis-4.0.9
[root@localhost redis-4.0.9]# pwd
/redis-4.0.9
[root@localhost redis-4.0.9]# make

配置开机启动

[root@localhost redis-4.0.9]# mkdir /etc/redis
[root@localhost redis-4.0.9]# cp /redis-4.0.9/redis.conf /etc/redis/6379.conf
[root@localhost redis-4.0.9]# cp /redis-4.0.9/utils/redis_init_script /etc/init.d/redis

编辑启动文件(此处尽量全文复制,后台运作容易遗忘)

[root@localhost redis-4.0.9]# vim /etc/init.d/redis 
[root@localhost redis-4.0.9]# cat /etc/init.d/redis 
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 10 90
# description: Start and Stop redisREDISPORT=6379
#EXEC=/usr/local/bin/redis-server
EXEC=/redis-4.0.9/src/redis-server
#CLIEXEC=/usr/local/bin/redis-cli
CLIEXEC=/redis-4.0.9/src/redis-cliPIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"case "$1" instart)if [ -f $PIDFILE ]thenecho "$PIDFILE exists, process is already running or crashed"elseecho "Starting Redis server..."$EXEC $CONF &fi;;stop)if [ ! -f $PIDFILE ]thenecho "$PIDFILE does not exist, process is not running"elsePID=$(cat $PIDFILE)echo "Stopping ..."$CLIEXEC -p $REDISPORT shutdownwhile [ -x /proc/${PID} ]doecho "Waiting for Redis to shutdown ..."sleep 1doneecho "Redis stopped"fi;;*)echo "Please use start or stop as first argument";;
esac
[root@localhost redis-4.0.9]# chmod +x /etc/init.d/redis 
[root@localhost redis-4.0.9]# chkconfig --add redis#    这个命令是老版本centos添加开机启动项用的,这里是按照官方文档选用的这种方式[root@localhost redis-4.0.9]# chkconfig redis on#    设置redis开机启动[root@localhost redis-4.0.9]# chkconfig --list注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 'systemctl list-unit-files'。查看在具体 target 启用的服务请执行'systemctl list-dependencies [target]'。netconsole     	0:关	1:关	2:关	3:关	4:关	5:关	6:关
network        	0:关	1:关	2:开	3:开	4:开	5:开	6:关
redis          	0:关	1:关	2:开	3:开	4:开	5:开	6:关#    这里的0-6对应的是centos的0-6状态,1是单用户模式[root@localhost redis-4.0.9]# systemctl daemon-reload#    重新加载自启动信息[root@localhost redis-4.0.9]# systemctl start redis
[root@localhost redis-4.0.9]# systemctl status redis

redis测试

[root@localhost redis-4.0.9]# /redis-4.0.9/src/redis-cli 
127.0.0.1:6379> set name liumuquan
OK
127.0.0.1:6379> get name
"liumuquan"
127.0.0.1:6379> 

3.3、redis持久化

3.3.1、持久化简介

Redis 持久化是指将 Redis 内存中的数据持久化保存到硬盘上,以防止服务器重启或宕机时数据丢失。在 Redis 中,有两种主要的持久化方式:RDB(Redis DataBase)和 AOF(Append Only File)。

  1. RDB 持久化

    • RDB 持久化通过定期将 Redis 内存中的数据快照写入磁盘来实现。管理员可以配置 Redis 定期将内存中的数据以快照的形式保存到一个 .rdb 文件中。
    • 这种方式类似于拍照,Redis 在指定的时间点将当前的数据状态保存下来。这种方式适合用于备份,恢复较大数据集时速度较快,因为只需要读取一个文件即可还原数据。
  2. AOF 持久化

    • AOF 持久化则是通过记录 Redis 服务器所执行的写命令(例如 SET、INCR 等)来记录数据变化。这些命令以追加的方式写入一个文件中,称为 AOF 文件。
    • 这种方式类似于录制操作日志,Redis 在执行写命令时将其追加到文件末尾。当服务器需要恢复时,会重新执行 AOF 文件中的命令,从而重建数据状态。
    • AOF 文件通常比 RDB 文件更大,因为它记录了每个写操作,但它提供了更精细的数据恢复和更小的数据丢失风险。

大概可以这么理解

  • RDB 类比:想象你在玩一个游戏,游戏允许你在每个关卡结束时保存进度。这样,即使你在下一个关卡失败,你可以重新加载上一个关卡的进度并继续游戏。

  • AOF 类比:而 AOF 则像你在玩一个没有保存功能的游戏,但它可以记录下你每一步的操作。如果你因为失误或游戏崩溃而需要重新开始,你可以根据你的操作日志重新执行每一步,从而恢复到你离开的地方,虽然过程有点麻烦,但是保证了你不会丢失任何进度。

两种方法虽然有不同,但是由于实际使用中的特殊性,当不需要数据安全时两个全关就行,需要时双开,因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段。

3.3.2、配置redis持久化

RDB默认开启,查看配置

[root@localhost ~]# vim /redis-4.0.9/redis.confdbfilename dump.rdb
#使用RDB时,持久化存在本地的文件叫dump.rdbdir ./
#持久化数据存储在本地的路径save 900 1
save 300 10
save 60 10000
#触发快照的时机,
#save 多少时间内 被改过多少次
#出发以上条件就会被拍摄快照stop-writes-on-bgsave-error yes
#当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等,这里配置的是报错拒绝继续写入rdbcompression yes
#是否启用rdb文件压缩,默认为“yes”,压缩很占用cpu,同时同时可以节省存储空间和减少网络传输时间 

客户端使用命令进行持久化save存储

[root@localhost ~]#./redis-cli -h ip -p port save
#前台进行存储
[root@localhost ~]#./redis-cli -h ip -p port bgsave
#后台进行存储#每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。

AOF默认关闭,开启方式

[root@localhost ~]# vim /redis-4.0.9/redis.conf##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
##只有在“yes”下,aof重写/文件同步等特性才会生效  
appendonly yes  appendfilename appendonly.aof
#指定aof文件名称appendfsync everysec
#指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec
#这行指令设置了 AOF 文件的同步方式。everysec 表示每秒钟将 AOF 文件同步到磁盘一次,以确保即使系统崩溃,最多丢失一秒钟的数据。no-appendfsync-on-rewrite no  
#在aof-rewrite(重写)期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”auto-aof-rewrite-min-size 64mb
#触发aof rewrite的最小文件尺寸auto-aof-rewrite-percentage 100
#这行指令设置了触发自动 AOF 重写的增长百分比。100 表示当当前 AOF 文件大小比上一次重写时的大小增长了 100%(即翻倍)时,触发自动 AOF 重写。重写是为了使aof体积保持最小,而确保保存最完整的数据。

3.4、redis主从

3.4.1、redis主从简介

  1. 用法

    Redis支持类似于MySQL的主从结构,允许配置一主多从甚至多级从结构。主从结构旨在提供冗余备份和增强读性能,例如将性能消耗较大的SORT操作分担给从服务器。Redis的主从同步是异步进行的,不会影响主服务器的主要逻辑或性能。在主从架构中,可以考虑关闭主服务器的数据持久化,由从服务器承担这一任务,以提高主服务器的处理性能。通常情况下,从服务器设置为只读,以防止误修改数据,但仍可接受CONFIG等命令。对于不安全的网络环境,建议重命名重要命令以避免误操作。

  2. 原理

    从服务器通过发送SYNC指令向主服务器请求同步。主服务器收到SYNC指令后,会执行BGSAVE命令生成RDB文件进行数据持久化。在持久化期间,主服务器将所有写操作缓存在内存中。BGSAVE完成后,主服务器将RDB文件发送给从服务器,从服务器将文件存储到磁盘并加载到内存。然后,主服务器以Redis协议格式将缓存的写操作发送给从服务器。即使多个从服务器同时发出SYNC指令,主服务器也只执行一次BGSAVE,并将生成的RDB文件发送给所有从服务器。在Redis 2.8版本之前,主从断开连接后会进行全量数据同步,而2.8版本后支持高效的增量同步,显著降低了连接断开恢复成本。主服务器在内存中维护缓冲区,用于存储将发送给从服务器的内容。如果从服务器与主服务器连接断开,从服务器会尝试重新连接,成功后发送“希望同步的主服务器ID”和“希望请求的复制偏移量”。主服务器验证ID匹配后,检查缓冲区中是否存在请求的偏移量,并根据需要向从服务器发送增量内容。增量同步功能需要服务器端支持全新的PSYNC指令,该指令从Redis 2.8版本开始提供。

3.4.2、 redis主从部署

3.4.2.1、基础环境
IP角色
192.168.188.128master
192.168.188.129slave1
192.168.188.130slave2

在slave1和slave2上部署上redis

slave1操作如下

[root@localhost /]# tar xf redis-4.0.9.tar.gz 
[root@localhost /]# cd /redis-4.0.9
[root@localhost redis-4.0.9]# make
[root@localhost redis-4.0.9]# mkdir /etc/redis
[root@localhost redis-4.0.9]# cp /redis-4.0.9/redis.conf /etc/redis/6379.conf
[root@localhost redis-4.0.9]# cp /redis-4.0.9/utils/redis_init_script /etc/init.d/redis
[root@localhost redis-4.0.9]# vim /etc/init.d/redis
[root@localhost redis-4.0.9]# vim /etc/init.d/redis 
[root@localhost redis-4.0.9]# cat /etc/init.d/redis 
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 10 90
# description: Start and Stop redisREDISPORT=6379
#EXEC=/usr/local/bin/redis-server
EXEC=/redis-4.0.9/src/redis-server
#CLIEXEC=/usr/local/bin/redis-cli
CLIEXEC=/redis-4.0.9/src/redis-cliPIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"case "$1" instart)if [ -f $PIDFILE ]thenecho "$PIDFILE exists, process is already running or crashed"elseecho "Starting Redis server..."$EXEC $CONF &fi;;stop)if [ ! -f $PIDFILE ]thenecho "$PIDFILE does not exist, process is not running"elsePID=$(cat $PIDFILE)echo "Stopping ..."$CLIEXEC -p $REDISPORT shutdownwhile [ -x /proc/${PID} ]doecho "Waiting for Redis to shutdown ..."sleep 1doneecho "Redis stopped"fi;;*)echo "Please use start or stop as first argument";;
esac
[root@localhost redis-4.0.9]# scp /etc/init.d/redis 192.168.188.130:/etc/init.d/
[root@localhost redis-4.0.9]# chmod +x /etc/init.d/redis 
[root@localhost redis-4.0.9]# chkconfig --add redis
[root@localhost redis-4.0.9]# chkconfig redis on
[root@localhost redis-4.0.9]# systemctl daemon-reload
[root@localhost redis-4.0.9]# systemctl start redis

slave2操作同slave1

3.4.2.2、master配置
[root@localhost ~]# vim /etc/redis/6379.conf#bind 127.0.0.1
#注释掉
bind 0.0.0.0
#增加监听地址为所有ip#protected-mode yes
protected-mode no
#关闭保护模式[root@localhost ~]# systemctl restart redis
3.4.2.3、salve1配置
[root@localhost redis-4.0.9]# vim /etc/redis/6379.confslaveof 192.168.188.128 6379
#bind 127.0.0.1
bind 0.0.0.0
#protected-mode yes
protected-mode no[root@localhost redis-4.0.9]# systemctl restart redis
3.4.2.3、salve2配置

同slave1

3.4.3、redis主从测试

在master上

[root@localhost ~]# /redis-4.0.9/src/redis-cli 
127.0.0.1:6379> set your_id 1210
OK
127.0.0.1:6379> get your_id
"1210"
#查询主从状态
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.188.129,port=6379,state=online,offset=1557,lag=1
slave1:ip=192.168.188.130,port=6379,state=online,offset=1557,lag=0
master_replid:65eda2694558d007f08f5645d92fb67c4423c265
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1557
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1557
127.0.0.1:6379> 

在slave1上

[root@localhost redis-4.0.9]# /redis-4.0.9/src/redis-cli
127.0.0.1:6379> get your_id
"1210"
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.188.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1669
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:65eda2694558d007f08f5645d92fb67c4423c265
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1669
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:253
repl_backlog_histlen:1417
127.0.0.1:6379> 

主从架构实现,可以保持数据同步,但此时集群无法实现灾备冗余,主服务器宕机时,从服务器此时无法承担主服务器角色,需要使用redis-sentine来实现。

3.5、redis-sentinel

3.5.1、redis-sentinel简介

Redis Sentinel是Redis官方推荐的高可用性(HA)解决方案,允许你创建一个能够自动处理各种故障的Redis部署,无需人工干预。

作用:

  1. 检测Master状态。
  2. 在Master异常时进行Master-Slave切换,将一个Slave提升为新的Master,原Master降级为Slave。
  3. 切换后,会自动更新配置文件:master_redis.conf会新增slaveof配置,sentinel.conf中的监控目标也会相应调整。

工作方式:

  1. 每个Sentinel每秒向已知的Master、Slave和其他Sentinel实例发送PING命令。
  2. 如果一个实例超过配置的down-after-milliseconds时间未响应PING命令,Sentinel会将其标记为主观下线。
  3. Sentinel持续检查主观下线的Master状态,确认是否达到客观下线条件。
  4. 当足够多的Sentinel在指定时间内确认主观下线状态时,Master会被标记为客观下线。

3.5.2、redis-sentinel部署

继续使用上面的环境

1)每台机器上修改redis主配置文件设置:bind 0.0.0.0(略)

2)每台机器上修改sentinel配置文件:

master如下

[root@localhost ~]# vim /redis-4.0.9/sentinel.conf
#sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 192.168.188.128 6379 2#    当集群中有2个(超过半数)sentinel认为master死了时,才能真正认为该master已经不可用了。#sentinel down-after-milliseconds mymaster 30000
sentinel down-after-milliseconds mymaster 3000#    3秒内没收到有效回复后认定主服务器离线(默认30秒)#sentinel failover-timeout mymaster 180000
sentinel failover-timeout mymaster 10000#    故障发生后10秒内完成选举,若sentinel在该配置值内未能完成failover(故障转移)操作(即故障时master/slave自动切换),则认为本次failover失败。# protected-mode no
protected-mode no#    关闭保护模式

slave1、slave2同上

3)启动哨兵,三台都要启动

[root@localhost ~]# cd /redis-4.0.9
[root@localhost redis-4.0.9]# ./src/redis-sentinel sentinel.conf 

3.5.3、redis-sentinel测试

关闭主服务器,观察从服务器改变状态

在master上使用ctrl+c停止当前进程

[root@localhost redis-4.0.9]# systemctl stop redis

观察从服务器返回信息

 选举slave2成为主服务器,slave2状态如下

[root@localhost redis-4.0.9]# /redis-4.0.9/src/redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.188.129,port=6379,state=online,offset=63531,lag=0
slave1:ip=192.168.188.128,port=6379,state=online,offset=63531,lag=0
master_replid:b417e01353b4a576aaba97987acd33602ba5d9df
master_replid2:bd33fbabce342aeb3ec5c5aa85aaf1a2e5a02b23
master_repl_offset:63676
second_repl_offset:4257
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:63676
127.0.0.1:6379> 

3.6、redis使用经验

  1. Master的工作不应包括持久化任务,如RDB快照和AOF日志文件。
  2. 如果数据非常重要,可以让某个Slave开启AOF备份数据,设置为每秒同步一次。
  3. 为了提高主从复制的速度和连接稳定性,最好将Master和Slave部署在同一个局域网内。
  4. 在主库压力较大时,应尽量避免增加从库,可以通过为现有从库增加从库来缓解压力。
  5. 主从复制应采用单向链表结构而不是树状结构,例如:Master(写) <- Slave1(读) <- Slave2(读) <- Slave3(读)... 这种结构有助于提高稳定性和处理单点故障问题。如果Master宕机,可以立即将Slave1提升为新的Master,其他从库保持不变。

相关文章:

13--memcache与redis

前言&#xff1a;数据库读取速度较慢一直是无法解决的问题&#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…...

QT学习日记一

创建QT文件步骤 这是创建之后widget.cpp和widget.h文件的具体代码解释&#xff0c;也是主要操作的文件&#xff0c;其中main.cpp不用操作&#xff0c;ui则是图形化操作界面&#xff0c;综合使用时&#xff0c;添加一个元件要注意重编名和编译一下&#xff0c;才能在widget这类…...

redhat7.x 升级openssh至openssh-9.8p1

1.环境准备&#xff1a; OS系统&#xff1a;redhat 7.4 2.备份配置文件&#xff1a; cp -rf /etc/ssh /etc/ssh.bak cp -rf /usr/bin/openssl /usr/bin/openssl.bak cp -rf /etc/pam.d /etc/pam.d.bak cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak 3.安装…...

Spring Cloud Eureka

引入&#xff1a;远程调用时&#xff0c;url是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 解决思路&#xff1a; 比如&#xff08;医院&#xff0c;学校等&#xff09;机构的电话号码发生变化&#xff0c;就需要通知各个使⽤…...

threejs

1.场景清空&#xff0c;释放内容 // 假设你已经有一个Three.js的场景对象scene// 函数&#xff1a;清空场景中的所有对象 function clearScene(scene) {while(scene.children.length > 0){const object scene.children[0];if(object.isMesh) {// 如果有几何体和材质&#…...

将pytorch 模型封装为c++ api 例子

在 PyTorch 中&#xff0c;通常使用 Python 来定义和训练模型&#xff0c;但是可以将训练好的模型导出为 TorchScript&#xff0c;然后在 C 中加载和使用。以下是一个详细的过程&#xff0c;展示了如何将 PyTorch 模型封装成 C API&#xff1a; 步骤 1: 定义和训练模型&#x…...

珠宝迷你秤方案

珠宝迷你秤作为一种便携式电子称重设备&#xff0c;因其小巧、便携、精度高等特点&#xff0c;广泛应用于各种需要精确称重的场景。可能这个目前在国内使用的人比较少&#xff0c;但在西方国家珠宝迷你秤却是可以用来送礼的物品。因为珠宝迷你秤的外观跟手机外观大多相似&#…...

边缘概率密度、条件概率密度、边缘分布函数、联合分布函数关系

目录 二维随机变量及其分布离散型随机变量连续型随机变量边缘分布边缘概率密度举例边缘概率密度 条件概率密度边缘概率密度与条件概率密度的区别边缘概率密度条件概率密度举个具体例子 参考资料 二维随机变量及其分布 离散型随机变量 把所有的概率&#xff0c;都理解成不同质量…...

软件架构之系统分析与设计方法(2)

软件架构之系统分析与设计方法(2&#xff09; 8.4 面向对象的分析与设计8.4.1 面向对象的基本概念8.4.2 面向对象分析8.4.3 统一建模语言 8.5 用户界面设计8.5.1 用户界面设计的原则8.5.2 用户界面设计过程 8.6 工作流设计8.6.1 工作流设计概述8.6.2 工作流管理系统 8.7 简单分…...

AD确定板子形状

方法1 修改栅格步进值&#xff0c;手动绘制 https://cnblogs.com/fqhy/p/13768031.html 方法2 器件摆放确定板子形状 https://blog.csdn.net/Mark_md/article/details/116445961...

CSS【详解】边框 border,边框-圆角 border-radius,边框-填充 border-image,轮廓 outline

边框 border border 是以下三种边框样式的简写&#xff1a; border-width 边框宽度 —— 数值 px&#xff08;像素&#xff09;,thin&#xff08;细&#xff09;,medium&#xff08;中等&#xff09;,thick&#xff08;粗&#xff09;border-style 边框线型 —— none【默认值…...

Error: EBUSY: resource busy or locked, rmdir...npm install执行报错

Error: EBUSY: resource busy or locked, rmdir...npm install执行报错 你一个文件夹目录开了两个cmd命令行&#xff08;或者powershell)&#xff0c;关掉一个就好了。...

Hot100-排序

1.快排 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; &#xff08;1&#xff09;第k大的元素在排序数组中的位置是nums.length - k。 假设我们有一个数组nums [3, 2, 1, 5, 6, 4]&#xff0c;并且我们想找到第2大的元素。 步骤 1&#xff1a;排序数…...

树链剖分相关

树链剖分这玩意儿还挺重要的&#xff0c;是解决静态树问题的一个很好的工具~ 这里主要介绍一下做题时经常遇到的两个操作&#xff1a; 1.在线求LCA int LCA(int x,int y){while(top[x]!top[y])if(dep[top[x]]>dep[top[y]]) xfa[top[x]];else yfa[top[y]];return dep[x]&l…...

如何将Grammarly内嵌到word中(超简单!)

1、下载 安装包下载链接见文章结尾 官网的grammarly好像只能作为单独软件使用&#xff0c;无法内嵌到word中&#x1f9d0;&#x1f9d0;&#x1f9d0; 2、双击安装包&#xff08;安装之前把Office文件都关掉&#xff09; 3、安装完成&#xff0c;在桌面新建个word文件并打开 注…...

OTG -- 用于FPGA的ULPI接口芯片USB3320讲解(续)

目录 1 背景 2 USB3320在FPGA上的应用 1 背景 最近使用FPGA驱动USB PHY实现高速USB功能&#xff0c;为了方便&#xff0c;购买了一块微雪的USB3300子板&#xff0c;发现怎么都枚举不了&#xff0c;使用逻辑分析仪抓取波形&#xff0c;和STM32F407USB3300波形进行对比&#xf…...

了解劳动准备差距:人力资源专业人员的战略

劳动准备差距是一个紧迫的问题&#xff0c;在全球人事部门回应&#xff0c;谈论未开发的潜力和错过的机会。想象一下&#xff0c;人才和需求之间的悬崖之间有一座桥&#xff0c;这促使雇主思考&#xff1a;我们是否为员工提供了足够的设备来应对未来的考验&#xff1f; 这种不…...

SAP PS学习笔记02 - 网络,活动,PS文本,PS文书(凭证),里程碑

上一章讲了PS 的概要&#xff0c;以及创建Project&#xff0c;创建WBS。 SAP PS学习笔记01 - PS概述&#xff0c;创建Project和WBS-CSDN博客 本章继续讲PS的后续内容。包括下面的概念和基本操作&#xff0c;以及一些Customize&#xff1a; - 网络&#xff08;Network&#xf…...

Github 2024-07-07php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-07-07统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2JavaScript项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数…...

算法训练(leetcode)第二十六天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763. 划分字母区间

刷题记录 452. 用最少数量的箭引爆气球思路一思路二 435. 无重叠区间763. 划分字母区间 452. 用最少数量的箭引爆气球 leetcode题目地址 思路一 先按起始坐标从小到大排序。排序后找交集并将交集存入一个数组中&#xff0c;遍历气球数组从交集数组中找交集&#xff0c;找到与…...

Ubuntu 下 Docker安装 2024

Ubuntu 下 Docker安装 2024 安装1.卸载老版本2.更新apt包索引3.安装必要工具包4.添加Docker GPG秘钥5.配置仓库源6.安装Docker Engine7.启动docker 国内镜像源下架的解决办法1.修改文件 /etc/docker/daemon.json2.换源3.查看是否换源成功4.重启 安装 1.卸载老版本 sudo apt-ge…...

发送者的可靠性

这篇文章是了解MQ消息的可靠性&#xff0c;即&#xff1a;消息应该至少被消费者处理1次 那么问题来了&#xff1a; 我们该如何确保MQ消息的可靠性&#xff1f;如果真的发送失败&#xff0c;有没有其它的兜底方案&#xff1f; 首先&#xff0c;我们一起分析一下消息丢失的可能…...

Profibus_DP转ModbusTCP网关模块连马保与上位机通讯

Profibus转ModbusTCP网关模块&#xff08;XD-ETHPB20&#xff09;广泛应用于工业自动化领域。例如&#xff0c;可以将Profibus网络中的传感器数据转换为ModbusTCP协议&#xff0c;实现数据的实时监控和远程控制。本文介绍了如何利用Profibus转ModbusTCP网关&#xff08;XD-ETHP…...

移动应用:商城购物类,是最常见的,想出彩或许就差灵犀一指

在移动应用中&#xff0c;商城购物类的非常常见&#xff0c;模式也非常成熟&#xff0c;想要设计的出彩也是有难度的&#xff0c;这次分享一些不同的。...

linux 查看历史命令列表来访问之前的内容的命令是:history

在Linux中&#xff0c;要查看历史命令列表以访问之前的内容&#xff0c;你可以使用history命令。这个命令会显示你当前shell会话&#xff08;或者&#xff0c;如果你指定了参数&#xff0c;可能是所有会话&#xff09;中执行过的命令列表。 基本用法 简单地输入history并按下…...

NAS免费用,鲁大师 AiNAS正式发布,「专业版」年卡仅需264元

7月10日&#xff0c;鲁大师召开新品发布会&#xff0c;正式发布旗下以“提供本地Ai部署和使用能力以及在线NAS功能”并行的复合软件产品&#xff1a;鲁大师 AiNAS。 全新的鲁大师 AiNAS将持续满足现如今大众对于数字化生活的全新需求&#xff0c;将“云存储”的便捷与NAS的大容…...

spring监听事件

1、spring-监听事件基本原理 Spring的事件监听机制和发布订阅机制是很相似的&#xff1a;发布了一个事件后&#xff0c;监听该类型事件的所有监听器会触发相应的处理逻辑 2、Spring 监听事件相关规范 在Spring中&#xff0c;事件监听机制主要涉及到了一下几个关键的规范&#x…...

微软发布E2 TTS: 一种简单但效果优秀的文本转语音技术

本文介绍了一种名为“Embarrassingly Easy Text-to-Speech&#xff08;E2 TTS&#xff09;”的文本转语音系统。 该系统通过将输入文本转换为填充标记字符序列&#xff0c;并基于音频填充值任务训练流匹配基mel频谱生成器&#xff0c;实现了人类水平的自然度和最先进的说话人相…...

python爬虫加入进度条

安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块&#xff0c;用于处理时间相关的功能 from tqdm import * # 从tqdm包中…...

力扣844.比较含退格的字符串

力扣844.比较含退格的字符串 栈模拟 class Solution {public:bool backspaceCompare(string s, string t) {int n s.size(),m t.size();stack<char> s1,s2;for(int i0;i<n;i){s1.push(s[i]);if(s[i] #){if(s1.size() 1) s1.pop();else s1.pop(),s1.pop();}}for(i…...

美女教师做爰网站/多地优化完善疫情防控措施

引言 前面Android开发之旅&#xff1a;环境搭建及HelloWorld&#xff0c;我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目&#xff0c;本篇将通过HelloWorld项目来介绍Android项目的目录结构。本文的主要主题如下&#xff1a; 1、HelloWorld项目的目录结构 1…...

做网站 报价/合肥网站推广公司排名

目录1.获取Field2.反编译Field3.通过反射机制访问对象属性4.可变长度参数5.反射Method(了解)6.反编译(了解)7.反射机制调用方法8.反射Constructor9.反射机制调用构造方法10.获取父类和父接口在前面一节我们介绍了反射机制的详细内容反射机制&#xff0c;本节我们将介绍通过反射…...

网站推广明细报价表/搜索引擎平台

作为一名全职的Go语言作家和老师&#xff0c;我花了很多时间和学生们一起&#xff0c;帮助他们写出更清晰、更好、更有用的Go程序。我发现&#xff0c;我给他们的建议可以归纳总结为一套通用原则&#xff0c;在这里我将这些原则分享给大家。1、你应该是无聊的Go社区喜欢共识&am…...

wordpress中文版源码/seo咨询解决方案

目录 EFK架构&#xff08;elasticsearch\filebeat\kibana&#xff09; 1、下载elasticsearch、kibana、filebeat 2、创建用户并授权 3、安装并启动 3.1 使用elasticsearch账号安装启动 >3.1.1 解压 elasticsearch >3.1.2 配置 elasticsearch >3.1.3 启动elast…...

政府网站需求分析/排名优化方案

lamp&#xff08;Web应用软件&#xff09;Linux ApacheMysql/MariaDBPerl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大的…...

网站怎么做支付/百度收录网址提交

一、Visual Studio安装与插件 可以到官网下载 VS Code 并安装&#xff0c;推荐配置的插件有“ C/C ” &#xff0c;“ Code Runner ”和中文简体扩展包&#xff0c;安装了 Extensions “C/C” 后就可以使用 Ctrl Shift P 打开命令面板输入“ C/C &#xff1a;编辑配置(UI…...