Redis 相关技术点

1、redis 事物是怎么实现的?

multi、exec、discard、watch 是 redis 事物的相关命令。事物可以一次执行多个命令,并可以有以下两个特性:

1、事物是一个单独的隔离操作,事物中的所有命令都会被序列化,按顺序执行。事物在执行的过程中不会被其他客户端命令操作打断。

2、事物是一个原子的操作,要么全部执行成功,要么全部不执行。

exec 命令负责触发并执行事物中所有操作,是和 multi 命令配合使用的,如果只是开启事物(multi)而没有触发(exec),那么事物中的操作是不会执行的。

对于事物中错误来说,分为2个方面:

       1、对于发生在 exec 执行前的错误(比如语法的错误),在 2.6.5版本之前,会检测返回值,如果入队失败,大部分客户端会放弃事物操作。在2.6.5版本后,redis会记录这一情况,并在使用 exec 命令时拒绝执行并放弃这个任务。

        2、对于发生在 exec 执行后的错误(比如变量类型的错误,incr自动加一等操作),即使事物中有某个/某些命令在事物中发生错误,事物中的其他操作仍会继续执行。

当使用 AOF 做持久化的时候(操作日志来记录每一次操作),如果遇到故障或错误,那么只有部分操作会被写入日志,如果进行数据恢复时遇到这种情况,失败。使用redis-check-aof 程序可以修复这一问题:会移除 AOF 文件中不完整事物的信息,保证程序启动成功。

2、redis 为什么不支持回滚(roll back)?

1、redis只会因为错误的语法导致失败(这些语法不能在入队时发现),或是命令用在了错误类型的key上。也就是说,这些问题应该在开发的层面上被发现,而不是在生产环境中。

2、要保持简单快速

有种观点认为redis处理事物的做法会产生bug,然而要注意的是,回滚操作并不能程序带来的错误问题。举个例子,比如你想通过incr命令使值加1,却不小心加上了2,或者操作key的值类型错误,回滚是没法解决这些问题的。

3、缓存雪崩、缓存穿透、缓存击穿在实际应用中怎么处理?

思路:

        穿透:缓存不存在,数据库不存在,高并发,少量key

        击穿:缓存不存在,数据库存在,高并发,少量key

        雪崩:缓存不存在,数据库存在,高并发,大量key

保证访问数据库的并发量(限流互斥锁,保障数据库)

4、Redis 集群方案有哪些?

1、主从复制集群(需要手动切换)

2、带有哨兵的HA的主从复制集群

3、客户端实现路由索引的分片合集

4、使用中间件代理层的分片集群

5、redis 自身实现的 cluster 分片集群

主从复制的特点

  • 主从资源统一(主机和从机的硬件配置、内存等)
  • 主从异步(难以保障数据一致性)
  • 更多的是解决性能问题
  • 主从数据不一致的取舍(保留主机还是从机)

5、Redis 缓存如何回收?

注意:删除是针对于过期策略的;回收是针对于内存空间不足,放弃一些数据的。

回收策略

  • noeviction:不触发回收策略,当内存限制达到并且客户端尝试执行会让客户端内存被使用的命令会报错(大部分写入命令,del等几个有限的例外)
  • allkeys-lru:尝试回收最少使用的键(lru),使得新添加的数据有空间存放
  • volatile-lru:尝试回收最少使用的键(lru),但仅限于在过期集合的键,使得新添加的数据有空间存放
  • allkeys-random:回收随机的键,使得新添加的数据有空间存放
  • volatile-random:回收随机的键,使得新添加的数据有空间存放,但仅限于在过期集合的键
  • volatile-ttl:回收在过期集合中的键,并且优先回收存活时间(ttl)较短的键,使得新添加的数据有空间存放
  • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最小的键
  • allkeys-lfu:从所有键中驱逐使用频率最小的键

如果没有键满足回收的前提条件的话,那么 volatile-lru、volatile-random、volatile-ttl 就和 noeviction 差不多。

使用策略建议

当你希望你的请求符合一个幂定律分布,也就是说,你希望部分的子集元素将比其他元素访问的多。这个时候可以考虑 allkeys-lru。

如果你是循环访问,所有的键被连续扫描,或者你希望请求分布正常(所有的键被访问几率差不多),这个时候可以考虑 allkeys-random。

如果你想要通过创建缓存对象时设置TTL值,来决定哪些对象应该被过期,这个时候可以考虑 volatile-ttl。

为键设置过期时间也是需要消耗内存的,所以 allkeys-lru 这种策略更加高效。

回收进程如何工作

  • 一个客户端运行了新的命令,添加了新的数据
  • Redis 检查内存使用情况,如果大于 maxmemory 的限制,则根据定好的策略进行回收
  • 命令被执行

6、Redis 持久化机制(RDB、AOF)

Redis 提供了不同级别的存储方式

1、RDB 持久化方式能够在指定的时间间隔对你的数据进行快照存储

2、AOF 方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令恢复原始的数据,AOF 命令保存每次写的操作追加到文件末尾。Redis 还可以对 AOF 文件进行后台重写,使 AOF 文件的体积不至于太大

如果同时开启两种持久化方式,当 Redis 重启后会优先载入 AOF 文件来恢复原始数据(因为 AOF 数据要比 RDB 更全面完整)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值