阅读 115

Redis知识点总结

Redis事务 watch multi exec

在 Redi中使用 watch 命令可以决定事务是执行还是回滚(乐观锁)。一般而言,可以在 multi 命令之前使用 watch 命令监控某些键值对,然后使用 multi 命令开启事务,执行各类对数据结果操作的命令,这个时候这些命令就会进入队列。

当 Redis 使用 exec 命令执行事务的时候,它首先会对比watch监控的值是否发生变化,如果没有发生变化,那么它会执行事务队列中的命令,提交事务;如果发生变化,那么它不会执行任何事务中的命令,而去事务回滚。无论事务是否回滚,Redis 都会去取消执行事务前的 watch 命令。

Springboot 整合 Redis

RedisTemplate、序列化。

Redis三种特殊的数据格式:

GEO存储地理坐标和计算,Hyperloglog用于不重复的基数统计,Bitmap位图用于统计互斥事件。

Redis应用场景

Redis他有五大基本数据类型,String,Hash,List,Set,ZSet。

String 字符串,用法类似Java集合类中的HashMap。

set key value get key

List 队列,可以双向的存值,设计时,也可以简单用来当队列模式。

lpush/rpush key [value ...] lpop/rpop key lrange key start end

Hash 字典,一个key 对应多个值;

hset key [(field value) ...] hget key field 查看该hash:hgetall key

Set 无序的集合;

sadd key [member ...] 查看集合:smembers key 查看集合元素数量:scard key

Zset 有序的集合;

zadd key score member zrange key start end [withscores] zscore key member zcard key

因为Redis比较快,所以经常被拿来做缓存。单点登录,分布式锁。

Redis是单线程还是多线程,存在线程安全问题吗?

无论什么版本工作线程就只有一个,6.x高版本出现了IO多线程。事务失败就是失败,后面的会继续执行,不会回滚。所以少用事务,如果用了,要在客户端要做事务失败相应的处理。

6.x以前

image.png6.x以后

image.png

关于线程安全,redis内部是串行的,但是业务上的顺序还是要自行保障,否则会出现线程安全问题。

Redis穿透,击穿,雪崩

  • 穿透:请求数据库db中没有的数据。因为数据库db中没有,所以redis肯定也是没有的。解决方案:在redis中使用key null,或者使用布隆过滤器。

  • 击穿:某个热点key不在redis中,数据库db是有这条数据的。解决方案:锁。一个redis放锁即可

  • 雪崩:多个热点key不在redis中,数据库db是有这些数据的。解决方案:锁。可以整多个redis放锁

用锁解决客户端多个请求同时穿透,击穿,雪崩的问题。如果发现redis中没有数据,这些客户端去抢一把锁,抢到锁的人去数据库db中拿数据,把key null放入redis,再释放锁,等锁释放了,其他客户端去redis中取该数据即可。

缓存是如何回收(删除过期的key)和淘汰的?

  • 回收:

    1. 后台在轮询,分段分批的删除哪些过期的key

    2. 请求的时候判断时候已经过期了

  • 淘汰:内存空间不足的时候会发生淘汰。LRU(最长时间没有被使用),LFU(最近使用最少的)

如何进行缓存预热

还是要做好穿透击穿雪崩的预防。

数据库和缓存不一致怎么办

这就是高并发的可靠消息服务处理

Redis的主从不一致

  1. redis确实是弱一致性,异步的同步

  2. 主从不适合的场景有分布式锁

Redis持久化

redis可以同时开启RDB和AOF,如果同时开启了,只会用AOF来做恢复

设置redis写操作触发IO记录的频率:

  • appendfsync always

  • appendfsync everysec

  • appendfsync no

两种持久化方式的比较:

  • RDB

    • 优点:恢复速度快

    • 缺点:丢失数据较多,不支持拉链

    • save,让父进程阻塞,进行数据拷贝

    • bgsave,进行拷贝数据的时候是通过系统调用fork来创建子进程,也就是拷贝原数据的地址,然后采用copy on write 来隔离父子进程,这样父进程就可以继续写操作

    • 操作

    • 优缺点

  • AOF

    • 优点:丢失数据少

    • 4.0之前是恢复数据慢,4.0之后对这个缺点进行了优化

    • bgrewriteaof:4.0版本以前是对aof文件进行精简化,4.0版本以后是直接把RDB文件落地,然后在后面追加写操作

    • 操作

    • 优缺点

Redis主从复制

追随命令:--replicaof ip port

默认从是不可以写数据的(可以调配置文件)

某个从挂了,再次启动,主中新增的数据,这个从是先恢复本地数据再去获取增量的方式同步数据的

某个主挂了,可以手动在从中 replicaof no one,再设置从的主

配置文件:

replica-server-stale-data yes:同步数据时从机是否可以被访问

replica-read-only yes:从机是否可以写数据

repl-diskless-sync no:no是走磁盘IO后再走网络IO,yes是直接走网络IO将rdb发给从机

repl-backlog-size 1mb:增量复制,某个从挂了又好了,可以从本地数据和这个增量中恢复数据。如果挂了的期间新增的数据超过这个量,那么采用全量复制

min-replicas-to-write 3:最少写几个写成功

min-replicas-max-lag 10:

Redis哨兵sentinel

就是为了HA

配置文件,每个redis都只要指定主机的ip和端口号,num为投票数

port 26379
sentinel monitor mymaster ip port num复制代码

setnx

SET if Not eXists

将 key 的值设为 value ,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。

在SET命令中,有很多选项可用来修改命令的行为。 以下是SET命令可用选项的基本语法。

SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
(1)设置指定的到期时间(以秒为单位)。
ShellEX seconds −
(2)设置指定的到期时间(以毫秒为单位)
PX milliseconds
(3)仅在键不存在时设置键
NX
(4)只有在键已存在时才设置
XX

示例
SET mykey “redis” EX 60 NX复制代码

由于setnx无法设置过期时间,所以如果在更新数据的时候以外退出,那么这个锁会一直存在,所以要结合expire一起使用。

redis设置key的有效时间

expire key seconds
pexpire key milliseconds复制代码

scan和keys命令的区别?

两者都是用来返回key的,但是使用场景和方法不同。
keys会阻塞主线程,但是返回的结果准确无重复。每次返回所有的结果。
scan不会阻塞主线程,但是返回的结果会有重复。只有当返回的游标是0时才代表没有数据了。

pipeline管道

概念:一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

优点:

  • 通过打包命令,一次性执行,可以节省 连接->发送命令->返回结果 所产生的往返时间

  • 减少的I/O的调用次数

缺点:

  • 使用管道发送命令时,服务器将被迫回复一个队列答复,占用很多内存。所以,如果你需要发送大量的命令,最好是把他们按照合理数量分批次的处理,例如10K的命令,读回复,然后再发送另一个10k的命令,等等。这样速度几乎是相同的,但是在回复这10k命令队列需要非常大量的内存用来组织返回数据内容。


作者:年少有为112
链接:https://juejin.cn/post/7020762883654942756


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐