Redis简单操作记录

Redis事务

1.Redis事务本质:一组命令的集合,加入队列,然后执行,执行完事务结束。

redis事务:

①开启事务:multi

②命令入队:set key1 v1 set key2 v2 .。。get...

③执行事务:exec

取消事务:discard,所有事务中入队的命令都不会执行

注意:如果在②时候命令错误,exec所有的命令都不会被执行,如果是命令没错运行出错的话,其他命令可以执行。

watch用来监控事务:

image-20210310150237039.png

可以用来做乐观锁操作,如果exec执行之前,另外一个事务对money进行操作并且执行完了,此时这里再exec的话就会执行失败。

如何解决?

首先放弃watch监视 unwatch,即解锁,再重新watch,如果再失败就再解锁再加锁,有种自旋锁的味道。


jedis 操作事务:

image-20210310152412821.png

SpringBoot整合Redis

SpringBoot 2.x之后默认不用jedis,替换为lettuce?

jedis:采用直连,多线程操作不安全,如何避免?使用jedis pool

lettuce:采用netty,实例可以多线程共享,不存在线程安全问题,可以减少线程数据。

源码分析:

image-20210310153226478.png

在导入starter包后会发现底层还是用的lettuce进行操作的,虽然也有jedis的实现,但是并没用

可以用spring自带的RedisTemplate也可以自己定义,自己定义则自带的就会失效:

,这里定义了一个jackson序列化的方法。

image-20210310154727484.png
image-20210310155107975.png

redis.conf了解:

bind 127.0.0.1  绑定的ip

protected-mode no 保护模式

port 端口

通用:GENERAL

daemonize yes

pidfile /var/run/redis_6379.pid
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably) 生产环境
# warning (only very important / critical messages are logged)
loglevel notice

logfile "" 日志文件位置名

databases 16 默认16个数据库

快照:SNAPSHOTTING
save 900 1  900s内 如果至少有一个key进行修改,则持久化
save 300 10 300s内 至少10个key就行操作,则进行持久化
save 60 10000 。。。同理

stop-writes-on-bgsave-error yes 持久化出错继续工作
rdbcompression yes 是否压缩RDB文件,需要消耗一些cpu资源
rdbchecksum yes 保存RDB文件时,自动检查校验
dir ./ rdb文件保存路径

REPLICATION 主从复制

安全:SECURITY
设置redis密码

MEMORY MANAGEMENT
maxmemory  redis配置最大的内存容量
maxmemory-policy noeviction 内存达到上限时的处理策略
    1、volatile-lru:只对设置了过期时间的key进行LRU(默认值) 
    2、allkeys-lru : 删除lru算法的key   
    3、volatile-random:随机删除即将过期key   
    4、allkeys-random:随机删除   
    5、volatile-ttl : 删除即将过期的   
    6、noeviction : 永不过期,返回错误

AOF:APPEND ONLY MODE
appendonly no 默认不开启,默认rdb模式,一般情况下rdb就够用了
appendfilename "appendonly.aof"
# appendfsync always  每次修改都会同步
appendfsync everysec 默认每秒执行一次
# appendfsync no  不同步

RDB持久化

在指定时间间隔内将内存中的数据集体写入磁盘,父进程会fork一个子进程讲内存内同写入rdb文件,主进程是不进行ID操作的。

最后一次持久化的话:如果宕机就会缺失一些数据。

rdb的dump.rdb文件什么时候产生?

save时,redis关闭时,flushall时

AOF 追加

将我们所有命令记录下来,除了读操作,redis重新执行命令,会很慢,默认不开启。

如果开启了aof,aof文件有错误则是启动不了redis的,此时可以用redis目录下的redis-check-aof可以进行修复,命令:redis-check-aof --fix appendonly.aof


Redis发布订阅

Redis发布订阅(pub/sub)是一种消息通信模式。

发布者+频道


image-20210310181937543.png

测试:


image-20210310182408518.png

原理:通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典就是一个个频道,字典的值是一个链表,链表中保存了所有订阅这个channel的客户端,SUBSCRIBE命令的关键就是将客户端添加到给定的channel中的订阅链表中。

通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel中查找记录了订阅这个频道的所有客户端链表,遍历这个链表,将消息发送给所有订阅者。

Redis集群

正常最少需要一主二从。

环境配置:只配从库,不用配置主库。

通过info replication查看主从信息,

复制3个redis.conf,并修改

①端口

②pid名字

③log文件名

④dump.rdb名字

修改完毕之后 通过 redis-server set/redis6379.conf 启动各个redis。

如何配置从机?

比如有6379/6380/6381三个服务

在6380中执行slaveof 127.0.0.1 6379 意思就是找6379这个作为自己的老大,这个是通过命令配置的,是暂时的,其实应该在redis.conf文件中配置(replicaof )。

主机写从机读取。

如果主机断了,可以通过slaveof no one 让自己变成主机,如果此时与哪来的老大又回来了,那也没用了。

哨兵模式

与上述手动切换主从的繁琐流程,redis使用sentinel哨兵模式来智能化选举老大。

如何开启?

在bin目录下有一个redis-sentinel,如我们上面说的最少三个进程来完成主从,那么哨兵也需要最少三个。

①.在redis.conf同级目录下新建哨兵的配置sentinel.conf,多个就配置多个

sentinel monitor myredis 127.0.0.1 6379 1 myredis是被监控的名称,1代表主机挂了,slave投票让谁接替主机

②.启动哨兵

redis-sentinel


微信图片_20210311085059.png

Redis缓存穿透和雪崩

①.穿透(查不到)如何解决:BloomFilter或者在缓存中加一个空对象,不让查询进入数据库查询

缓存击穿(量太大):指的是一个key非常热点,不停的高并发集中一个点访问;

如何解决?设置永不过期/加互斥锁

②.缓存雪崩:某个时间段缓存集中过期失效;

如何解决?多搭建几台redis异地多活/限流降级/数据预热(先访问一边加载到缓存中)

你可能感兴趣的:(Redis简单操作记录)