Redis面试题(三)

文章目录

  • 前言
  • [一、怎么理解 Redis 事务?](#一、怎么理解 Redis 事务?)
  • [二、Redis 事务相关的命令有哪几个?](#二、Redis 事务相关的命令有哪几个?)
  • [三、Redis key 的过期时间和永久有效分别怎么设置?](#三、Redis key 的过期时间和永久有效分别怎么设置?)
  • [四、Redis 如何做内存优化?](#四、Redis 如何做内存优化?)
  • [五、Redis 回收进程如何工作的?](#五、Redis 回收进程如何工作的?)
  • [六、 加锁机制](#六、 加锁机制)
  • 总结

前言

  1. 怎么理解 Redis 事务?
  2. Redis 事务相关的命令有哪几个?
  3. Redis key 的过期时间和永久有效分别怎么设置?
  4. Redis 如何做内存优化?
  5. Redis 回收进程如何工作的?
  6. 加锁机制

一、怎么理解 Redis 事务?

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会

被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。


二、Redis 事务相关的命令有哪几个?

MULTI、EXEC、DISCARD、WATCH


三、Redis key 的过期时间和永久有效分别怎么设置?

EXPIRE 和 PERSIST 命令


四、Redis 如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。

比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面。


五、Redis 回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。

Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。

一个新的命令被执行,等等。

所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。

如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。


六、 加锁机制

咱们来看上面那张图,现在某个客户端要加锁。如果该客户端面对的是一个 redis cluster 集群,他首先会根据 hash 节点选择一台机器。 这里注意,仅仅只是选择一台机器!这点很关键!紧接着,就会发送一段 lua 脚本到 redis 上,那段 lua 脚本如下所示:

为啥要用 lua 脚本呢?因为一大坨复杂的业务逻辑,可以通过封装在 lua 脚本中发送给 redis,保证这段复杂业务逻辑执行的 原子性。

那么,这段 lua 脚本是什么意思呢?这里 KEYS[1]代表的是你加锁的那个 key,比如说:RLoc

k lock = redisson.getLock("myLock");这里你自己设置了加锁的那个锁 key 就是"myLock"。

ARGV[1]代表的就是锁 key 的默认生存时间,默认 30 秒。ARGV[2]代表的是加锁的客户端的 ID,类似于下面这样:8743c9c0-0795-4907-87fd-6c719a6b4586:1

给大家解释一下,第一段 if 判断语句,就是用"exists myLock"命令判断一下,如果你要加锁的那个锁 key 不存在的话,你就进行加锁。如何加锁呢?很简单, 用下面的命令:hset myLock8743c9c0-0795-4907-87fd-6c719a6b4586:1 1,通过这个命令设置一个 hash 数据结构,这行命令执行后,会出现一个类似下面的数据结构:

上述就代表"8743c9c0-0795-4907-87fd-6c719a6b4586:1"这个客户端对"myLock"这个锁 key 完成了加锁。接着会执行"pexpire myLock 30000"命令,设置 myLock 这个锁 key 的 生存时间 是 30 秒。好了,到此为止,ok,加锁完成了。


总结

  1. 怎么理解 Redis 事务?
  2. Redis 事务相关的命令有哪几个?
  3. Redis key 的过期时间和永久有效分别怎么设置?
  4. Redis 如何做内存优化?
  5. Redis 回收进程如何工作的?
  6. 加锁机制
相关推荐
Cosmoshhhyyy9 分钟前
LeetCode:3083. 字符串及其反转中是否存在同一子字符串(哈希 Java)
java·leetcode·哈希算法
AI人H哥会Java22 分钟前
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
java·开发语言·spring boot·后端·架构
开心工作室_kaic32 分钟前
springboot493基于java的美食信息推荐系统的设计与实现(论文+源码)_kaic
java·开发语言·美食
缺少动力的火车34 分钟前
Java前端基础—HTML
java·前端·html
loop lee42 分钟前
Redis - Token & JWT 概念解析及双token实现分布式session存储实战
java·redis
ThetaarSofVenice43 分钟前
能省一点是一点 - 享元模式(Flyweight Pattern)
java·设计模式·享元模式
InSighT__44 分钟前
设计模式与游戏完美开发(2)
java·游戏·设计模式
神仙别闹1 小时前
基于Java2D和Java3D实现的(GUI)图形编辑系统
java·开发语言·3d
dbcat官方1 小时前
1.微服务灰度发布(方案设计)
java·数据库·分布式·微服务·中间件·架构