redis

Redis线程模型

Redis是单线程模型还是多线程模型

Redis6.x之前是真正意义上的单线程,对外提供的键值存储服务的主要流程是单线程,也就是网络IO和数据读写是由单个线程来完成的.

Redis6.x引入的多线程是指网络请求过程采用了多线程,但是键值对读写命令依旧是单线程处理的,所以Redis依然是并发安全的,也就是Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行.

为什么设计为单线程模型速度也很快

因为Redis是基于内存的操作,查找和操作的时间复杂度都是O(1),因此CPU不是Redis的瓶颈.Redis的瓶颈很可能是机器内存或者网络带宽的大小.

1.Redis的数据都在内存中,因此所有的运算都是内存级别的,因此性能比较高.

2.数据结构简单:redis的数据结构是为自身专门量身打造的,而这些数据结构的查找和操作的时间复杂度都是O(1).

3.多路复用和非阻塞I/O

4.避免上下文切换,因为是单线程模型,因此避免了不必要的上下文切换和多线程竞争,并且不会导致死锁的现象发生.

5.Redis底层就是一个哈希表,存储的是entry对象,entry里面是一个个的key指针和value指针,其实还有其他信息.

Redis持久化

Redis是一个内存数据库,数据保存在内存中,但是因为内存的数据变化很快,也很容易发生丢失.Redis为我们提供了持久化的机制,分别是RDB和AOF.

RDB方式

RDB持久化是指在特定的时间间隔内将内存中的数据集快照写入磁盘.也是默认的持久化方式.这种方式就是将内存中的数据以快照的方式写到二进制文件中,默认的文件名为dump.rdb.在安装了redis之后,所有的配置都是在redis.conf文件中,里面保存了RDB和AOF两种持久化机制的各种配置.当符合一定条件时redis会自动将内存中的数据进行快照并持久化到硬盘.

触发快照的时机

在redis.conf文件中更改配置

当save的规则满足的情况下,会自动触发rdb规则.

save 900 1:表示900秒钟至少一个键被更改则进行快照

save 300 10:表示300秒内至少十个键被更改则进行快照

如果不需要持久化,那么就可以注释掉所有的save行来停用保存功能.

执行flush all命令,会清空所有的redis数据,生成一个空的rdb文件.

退出redis时,也会产生rdb文件,命令shutdown save,关机后下次启动redis会自动将文件的数据还原到内存中.

AOF方式

此方式是通过日志的形式来记录每个写操作,将redis执行过的指令记录下来(不记录读操作),只许追加文件但是并不会更改文件,redis启动之初会读取该文件重新构建数据.

修改redis.conf文件来开启AOF机制

appendonly no #默认是不开启 aof 模式的,改为 yes 开启.

appendfsync always 每次修改都会 sync,消耗性能
appendfsync everysec 每秒执行一次 sync,可能会丢失这 1s 的数据(默认)

重启 redis 生效

除了这两种我们还可以结合mysql,将数据存储到mysql中

Redis事务

Redis事务本质是一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中会按照顺序执行.

所有的命令在事务中,并没有直接被执行.只有发起执行exec命令的时候才会执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.但是事务**不保证同一事物中多条命令执行的原子性.**即使命令有错误也会添加到队列中,执行报错也不影响其他命令的执行.

使用命令multi开启事务,使用set a aa添加命令,再添加完所有的命令之后,使用命令exec执行事务.

     redisTemplate.multi();//开启事务
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set();
        valueOperations.set();
        valueOperations.set();
     redisTemplate.exec();//执行事务

主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点,后者称为从节点,数据的复制是单向的,只能从主节点到从节点.

主机和备份机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的**同步和读取.**也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机.

主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的.

主从机制的作用主要包括:

1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.

2.故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务的冗余.

3.负载均衡::在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载.尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量.

4.高可用(集群)基石:主从复制是哨兵和集群能够实施的基础.

主从复制配置:

主从复制时只需要配置从库即可,其默认为主库模式.

打开redis客户端登录,使用命令info replication查看

主机配置

bind 0.0.0.0 任何ip都可以访问
daemonize yes 后台运行
pidfile /var/run/redis_6379.pid 进程号文件
logfile “6379.log” 日志文件 注意文件名修改只是为了区分
dbfilename dump6379.rdb 数据文件
requirepass root #主机密码

从机配置

#bind 注释
daemonize yes 后台运行
pidfile /var/run/redis_6380.pid 进程号文件
logfile “6380.log” 日志文件 注意文件名修改只是为了区分
dbfilename dump6380.rdb 数据文件
replicaof 主机ip 主机端口
masterauth 主机密码
从机进入客户端模式 ./redis-cli -p 从机端口

进入客户端,使用 info replication 命令查看模式

哨兵机制

哨兵模式是一种特殊的模式,首先redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,他会独立运行.其原理就是哨兵定期的向集群中的redis发送信息,如果收不到信息,就表名redis服务有问题, 通过一套选举机制,在多台从机中选取一台作为主机.当主机故障恢复后,临时主机又变为从机角色.

key过期策略

1.**立即删除.**在设置key时,会自动生成一个回调函数,当key的时间到了之后,会立即删除.

不浪费内存空间,但是如果大量的key同时到期,对cpu负载要求高.

2.**惰性删除.**时间到了之后不会立即删除,在下次使用到key之后,判断是否到期,到期就删除.

对内存的开销要求高.

3.**定时删除.**每隔一段时间,删除过期的key.

每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对 cpu 的影响.另一方面定时删除也有效的减少了因惰性删除带来的内存浪费.

redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用.

缓存穿透,缓存击穿,缓存雪崩

在使用redis时,我们提到过redis可以用来缓存数据,来达到对mysql压力的缓解.

在极端的情况下,redis也会出现问题.

缓存穿透:

有一条数据在数据库中就不存在,这样redis也就不会存在这条数据,每次查询的请求依然还是会到达mysql.

也就是说这种情况是数据库没有,缓存没有.

解决办法:

1.将mysql查询到的空对象设置到缓存中去.当然这个空对象需要设置一个较短的过期时间.

2.对参数进行校验,不合法的参数进行拦截.

缓存击穿:

某个key对应的数据库中存在,但在 redis 中的某个时间节点过期了,此时若有大量并发请求过来,这些请求发现缓存过期,都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮

也就是说这种情况是缓存没有,数据库有.

解决办法:

1.热点数据设置永不过期

2.加锁:上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它,其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后将数据放到 redis 缓存起来.后面的线程进来发现已经有缓存了,就直接走缓存.

缓存雪崩:

大量的key到期,或者缓存出现故障,导致大量的请求到达mysql

解决办法;

1.设置随机key过期时间

2.设置集群部署

3.跑定时任务,将快过期的key刷新

4.不设置过期时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值