Redis线程模型
Redis线程模型和IO多路复用Redis是单线程的吗?redis6.0后,全面支持多线程。redis单线程指的是 接收请求、解析请求、进行数据读写操作、返回数据给客户端这个过程是由一个线程来完成的以及Redis的网络IO是由一个线程来完成的。所以我们称redis为单线程。
但是redis服务在启动的时候,会启动后台线程,常见的有两个
后台刷盘线程:当我们配置AOF策略为everysec时,每隔一秒,由后台线程完成刷盘操作
后台释放内存线程:redis 提供unlink命令,异步释放内存,特别是大key
之所以有后台线程,只为了不让主线程去执行这些操作,避免阻塞主线程,无法响应请求。
Redis为什么采用单线程?Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,因此 Redis 瓶颈可能是机器的内存或者网络带宽,而并非 CPU,所以 Redis 核心网络模型使用单线程并没有什么问题,而且单线程避免了多线程之间并发竞争问题,省去了多线程切换带来的时间和性能上的开销,也不会导致死锁问题。
Redis 6.0引入多线程后,会产生并发安全问题吗?不会,引入的多线程只是针对网 ...
Redis持久化(AOF|RDB)
Redis持久化(AOF|RDB)AOFAOF是什么?AOF全称是append only file, 即只追加文件。
AOF持久化是通过保存Redis服务器执行的写命令来记录数据库状态的。
AOF默认是不开启的,,需要在redis.conf文件中配置:
12appendonly yesappendfilename "appendonly.aof"
AOF持久化配置项说明:
appendonly:是否开启AOF持久化
appendfilename:持久化文件名
redis处理写命令的时,会采取先写内存数据,再记录AOF日志的方式,这样做有两个好处:
减少额外检查开销: 只有内存数据被修改成功后才会写AOF日志,保证了日志都是可执行且正确的
不会阻塞当前的写操作
风险
如果命令执行完成,写日志之前宕机了,会丢失数据。
可能会阻塞下一条写命令的执行: 写操作和记录日志都是主进程(主进程中的redis_aof_write_thread线程),如果在刷盘时,服务器I/O压力过大,导致写硬盘速度很慢,就会阻塞后续的写命令
写AOF日志的过程redis在执行完一个写命令之 ...
现代密码学基础技能
现代密码学基础技能大数据安全与隐私这门课的lab1,要求如下图:
实现思路:• 通过Socket实现文件传输,使用TCP协议确保数据传输的可靠性。• 代码通过读取文件的二进制数据进行传输,支持任意类型的文件。• 通过AES加密算法进行文件数据的加密和解密。• 使用RSA加密算法对AES密钥进行加密,确保密钥的安全传输。• 通过在AES密钥中加入时间戳的方式,确保每次生成不同的密钥,从而保证相同文件每次发送的加密结果不同。
具体实现:客户端 (client.py)
连接服务器o 创建Socket并连接到服务器的指定端口。
AES密钥生成与加密o 生成16字节的随机AES密钥。o 加入时间戳生成唯一的AES密钥。o 使用RSA公钥加密AES密钥并发送给服务器。
文件传输o 读取文件信息(文件名和大小),发送给服务器。o 分块读取文件数据,使用AES进行加密,发送加密数据到服务器。服务端 (server.py)
监听客户端连接o 创建Socket,绑定指定端口,并设置监听队列。
接收并解密AES密钥o 生成RS ...
Redis缓存问题:穿透,击穿,雪崩,双写一致性等
Redis缓存问题:Redis缓存问题:穿透,击穿,雪崩,双写一致性等在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用redis来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的redis缓存问题.
缓存击穿缓存击穿一般指redis中的一个热点数据过期,导致大量请求直接访问数据库的情况,导致数据库瞬间压力过大甚至崩溃.
解决方案:
设置热点数据永不过期,这是一个不错的方案(要考虑业务特性,体量以及成本),前提是热点数据不能频繁发生改变,否则就会出现缓存污染.最好是根据一定的策略进行定时更新
重要接口限流,做好熔断和降级的准备,sentinel是个不错的选择
使用互斥锁,保证同一时刻只有一个线程可以访问数据库,这何尝不是一种限流呢
缓存穿透缓存穿透指缓存和数据库中都没有的数据,用户不断发起请求.这种情况最可能就是有人试图恶意攻击系统
解决方案:
加校验:拦截非法请求,用户鉴权等
redis缓存一个无效值,以防止对同一个key在数据库中的多次查询,但redis中可能会出现大量无效值 ...
海外访问阿里云服务器失败
海外访问阿里云服务器失败由于我的图床是挂在github上,然后使用cloudflare的CDN加速,但在国内访问时,图片的加载速度仍然较慢,所以我经常使用魔法访问已获得更好的体验。但我发现,最近使用魔法访问时,我无法访问到我的网站。我去检查了下,安全组规则配置是没问题的,那么原因很可能就出现在防火墙上.
我去检查了下,发现我的服务器根本就没开防火墙,这是一个很奇怪的事,没开就不应该有问题啊.然后我尝试将防火墙打开,开放80和443端口,重启防火墙,然后就可以成功访问了.
步骤如下:
查看防火墙状态:1systemctl status firewalld
打开防火墙1systemctl start firewalld
查看已开放的端口1firewall-cmd --list-ports
打开80和443端口12firewall-cmd --zone=public --add-port=80/tcp --permanentfirewall-cmd --zone=public --add-port=443/tcp --permanent
重启防火墙1firewall-cmd --reload ...
数据库分库分表
数据库分库分表分库分表到底是什么分库分表其实是分库,分表,分库分表的总称
分库将数据按照一定规则存储到不同的数据库中,每个数据库存储一部分数据
分库主要解决的是并发量过大的问题,并发量一旦上升,那么数据库就可能成为系统的瓶颈,因为数据库的连接数量是有上限的,虽然可以进行调整,但并不是无限调整的。所以,当数据库的读或者写的 QPS(每秒查询数) 太高,从而导致你的数据库连接数量不足的时候,就需要考虑到分库了,通过在增加数据库实例的方式来提供更多的数据库连接,从而提升系统的并发度。这里拿一个电商系统的数据库来举例,当你微服务在做服务拆分的时候,你会按照功能模块去把你的系统进行服务拆分,这个时候,就需要将每个模块的数据从一个单独的数据库中拆开,分成订单、物流、商品、用户等多个数据库,然后随着业务的发展,每个单独的业务数据库也需要进行分库了,如下图所是。
分表将一张表按照一定规则拆分成多张表,每张表存储一部分数据
相比较于分库,分表主要解决的是数据量大的问题,即通过将数据拆分到多个表,减少单表的数据量,从而提升查询速度。
分库分表这一般发生在数据库连接不够(分库解决的问题)以及单表数据量过大 ...