Redis数据库知识补充

目录

一、Redis的事务

        1、概念

        2、特点

        3、常用命令

        (1)、正常执行事务

        (2)、放弃事务

        (3)、编译型异常

        (4)、运行时异常

         4、为什么要添加事务

二、Redis持久化

1、RDB方式

(1)概念:

(2)、开启方式

(3)RDB的优缺点

2、AOF方式

(1)、概念:

(2)、AOF写数据三种策略(appendfsync)

3、总结

三、Redis 删除策略

1、定时删除

2、惰性删除

3、定期删除


一、Redis的事务

        1、概念

        Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程 中, 不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。

        2、特点

  1. Redis事务没有没有隔离级别的概念
  2. 所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行!Exec
  3. Redis单条命令式保存原子性的,但是事务不保证原子性!

        3、常用命令

        (1)、正常执行事务

127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1 # 命令入队
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec # 执行事务
1) OK
2) OK
3) "v2"
4) OK

        (2)、放弃事务

127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> DISCARD # 取消事务
OK
127.0.0.1:6379> get k4 # 事务队列中命令都不会被执行!
(nil)

        (3)、编译型异常

                  ( 代码有问题! 命令有错!)事务中所有的命令都不会被执行!

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> getset k3
# 错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec # 执行事务报错!
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5 # 所有的命令都不会被执行!
(nil)

        (4)、运行时异常

                     如果事务队列中存在语法性,其他命令是 可以正常执行的,错误命令抛出异常!

127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1 # 会执行的时候失败!
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
# 虽然第一条命令报错了,但是依旧正常执行成功了!
2) OK
3) OK
4) "v3"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3"

         4、为什么要添加事务

想想一个场景:有很多人有你的账户,同时去参加双十一抢购

银行存款10000元,三个人同时使用一个账户购买商品,发现存款变负数

一个请求想给金额减8000

一个请求想给金额减5000

一个请求想给金额减1000

解决方案:       悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每 次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里 边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

                        乐观锁(Optimistic Lock) 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不 会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。 乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的.

注:在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这 个 key 被其他命令所改动,那么事务将被打断

二、Redis持久化

1、RDB方式

(1)概念:

         在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将 快照文件直接读到内存里。

(2)、开启方式

手动save指令,执行一次保存操作。

自动配置 :save second changes,second:监控时间范围 changes:监控key的变化量

(3)RDB的优缺点

RDB优点

  • RDB是一个紧凑压缩的二进制文件,存储效率较高
  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
  • RDB恢复数据的速度要比AOF快很多
  • RDB节省磁盘空间

RDB缺点

  • Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
  • 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能
  • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
  • Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

2、AOF方式

(1)、概念:

        AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的;与RDB相比可以简单描述为改记录数据为记录数据产生的过程AOF的主要作用是 解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

(2)、AOF写数据三种策略(appendfsync)

always(每次) 每次写入操作均同步到AOF文件中,数据零误差,性能较低

everysec(每秒) 每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高 在系统突然宕机的情况下丢失1秒内的数据

no(系统控制) 由操作系统控制每次同步到AOF文件的周期,整体过程不可控

3、总结

 总结: 官方推荐两个都启用,如果对数据不敏感,可以选单独用RDB,不建议单独用 AOF,因为可能会出现 Bug。如果只是做纯内存缓存,可以都不用。

 

三、Redis 删除策略

        Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态

  • XX :具有时效性的数据
  • -1 :永久有效的数据
  • -2 :已经过期的数据或被删除的数据或未定义的数据

所以过期的数据并不一定是真的被删除了,在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕 机或内存泄露,这是就需要执行删除cel。

1、定时删除

        创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。

  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用
  • 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指 令吞吐量
  • 总结:用处理器性能换取存储空间(拿时间换空间)

2、惰性删除

  • 数据到达过期时间,不做处理。等下次访问该数据时:
  1. 如果未过期,返回数据
  2. 发现已过期,删除,返回不存在
  • 优点:节约CPU性能,发现必须删除的时候才删除
  • 缺点:内存压力很大,出现长期占用内存的数据
  • 总结:用存储空间换取处理器性能(拿空间换时间)

3、定期删除

            周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删 除频度

  • Redis启动服务器初始化时,读取配置server.hz的值,默认为10
  • 每秒钟执行server.hz次serverCron()中的方法---databasesCron()
  • activeExpireCycle() activeExpireCycle()对每个expires[*]逐一进行检测,每次执行
  • 250ms/server.hz 对某个expires[*]检测时,随机挑选W个key检测
  • 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行
  • 如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行

  • 优点1:CPU性能占用设置有峰值,检测频度可自定义设置
  • 优点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
  • 总结:周期性抽查存储空间 (随机抽查,重点抽查)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值