Redis基本理解:事务

一、事务

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

特点:Redis事务没有隔离级别;在Redis事务中的所有命令并不是直接执行的,而是发起执行命令(exec)的时候才会执行。

二、常用命令

1、mulit:事务的开始。

2、exec:执行事务。

3、discard:取消事务。

4、watch:监视一个或多个key。

5、unwatch:取消watch命令对所有key的监视。

三、Redis中两个常见的异常

1、编译型异常

代码书写错误,导致事务中的所有命令都不会被执行。

开启事务
multi

向事务中添加元素
set k1 v1 
set k2 v2

错误的命令
getset k2  ((error) ERR wrong number of arguments for 'getset' command)

执行事务
exec       (EXECABORT Transaction discarded because of previous errors.)

获取k1的值
get k1     (nil)


2、运行时异常

如果事务中存在命令的语法错误,在执行事务时,错误命令抛出异常,其余命令正常执行。

给k1赋值abc
set k1 "abc"

开启事务
multi

给k1加1
incr k1

给k2赋值
set k2 123

给k3赋值
set k3 456

执行事务(错误命令执行会抛出异常,其余命令正常执行)
exec     (ERR value is not an integer or out of range
          OK
          OK)

四、Redis持久化

1、Redis是内存数据库,如果不将内存中的所有数据保存到磁盘中,一旦服务器进程退出,那么服务器中的数据也会消失,所以Redis提供了持久化功能。

2、两种持久化方式:

RDB方式:在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复是将快照文件直接读到内存里。

AOF方式:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。

3、两种持久化方式的对比(RDB和AOF):

RDB占用存储空间小,而AOF占用存储空间大;RDB存储速度慢,而AOF存储速度快;RDB恢复数据速度快,而AOF恢复数据速度慢;RDB在数据安全性方面会丢失数据;而AOF是依据策略决定。

五、Redis数据删除策略

1、定时删除(拿时间换空间)

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

2、惰性删除(拿空间换时间)

数据达到过期时间,不做处理,等下次访问该数据时,如果未过期,返回数据;如果已过期,删除该数据并返回不存在。

3、定期删除

Redis启动服务器初始化时,读取配置server.hz的值,默认为10;

每秒钟执行server.hz次serverCron()中的方法,在此方法中依次调用方法,直到调用到activeExpireCycle();

Redis中有16个库,每个库都有个expires空间,存储了当前库所有key的有效期;

activeExpireCycle()会对每个expires空间进行检查,随机挑出W个key进行检测,如果key超时,删除key,在这次检查中,如果删除key的数量>W*25%,就会对当前expires空间进行再次检查,直到删除过期key的数量≤W*25%,才会检查下一个库的expires空间。 

六、逐出算法

Redis使用内存存储数据,在执行每条命令之前,Redis会检查内存是否充足,如果内存已满,Redis会删除一些数据为当前命令清理存储空间。清理数据的策略称为逐出算法。当逐出算法没有清理出空间时,将会抛出异常:(error) OOM command not allowed when used memory >'maxmemory'。

影响数据逐出的相关配置

1、maxmemory:最大可使用内存

2、maxmemory-samples:待删除数据的个数

3、maxmemory-policy:删除策略

检查易失数据(快过期的数据)

  • volatile-lru:挑选距离时间最远的数据淘汰。
  • volatile-lfu:挑选操作次数最少的数据淘汰。
  •  volatile-ttl:挑选快过期的数据淘汰。
  • volatile-random:任意选择数据淘汰。

检查全库数据(所有键值对)

  • volatile-lru:挑选距离时间最远的数据淘汰。
  • volatile-lfu:挑选操作次数最少的数据淘汰。
  • volatile-random:任意选择数据淘汰。

放弃数据驱逐

七、企业级解决方案

1、缓存预热

"宕机"服务器启动后迅速宕机。

解决方案:日常例行统计数据访问记录,统计访问频度较高的热点数据,将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据。

2、缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存
3、缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案:

  • 互斥锁:假设线程1要访问数据了,对线程1进行加锁,此时如果有线程2过来,这个线程并不能获得锁,所以进入休眠,直到线程1释放了锁,线程2才会获取锁,然后执行逻辑。
  • 逻辑过期:对redis中的value设置过期时间,假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程会开启一个线程2去进行缓存中过期数据的重构,直到新开的线程2完成这个逻辑后,才释放锁,而线程1直接返回数据,假设现在线程3过来访问,由于线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建数据构建完后,其他线程才能返回正确的数据。
4、缓存穿透

缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

解决方案:

  • 缓存空对象:当客户端请求数据时,会先在redis缓存中查找数据,如果缓存中没有,就会进入数据库进行查找,如果数据库中也没有,此时这个数据就穿透了缓存,到达数据库。缓存空对象就是哪怕缓存和数据库中没有这个数据,也会先将这个数据存入缓存中,下次再有请求这个数据的用户,直接将缓存中的数据返回给用户,就不用查数据库了。
  • 布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问 redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中, 如果布隆过滤器判断这个数据不存在,则直接拒绝这个请求。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值