湖北省建设厅官方网站毕德立,广告营销策略分析,wordpress iis建站,松江网站建设这里写自定义目录标题 #x1f4dd; redis的知识点数据结构及其特性#xff0c;用途和操作方法持久化高可用分布式锁发布订阅性能优化安全性数据分片缓存策略键过期删除策略内存淘汰策略 #x1f917; 总结归纳#x1f4ce; 参考文章 #x1f600; 这里写文章的前言#… 这里写自定义目录标题 redis的知识点数据结构及其特性用途和操作方法持久化高可用分布式锁发布订阅性能优化安全性数据分片缓存策略键过期删除策略内存淘汰策略 总结归纳 参考文章 这里写文章的前言 我询问了chatGPT如果是针对面试redis相关的我应该掌握哪些内容它给出了回复接下来我要针对他给出的几个方面进行一下整理。 redis的知识点
数据结构及其特性用途和操作方法
数据结构底层特性用途操作方法StringSDS简单的kv缓存计数器分布式锁set key valueList双端链表/压缩链表key v1v2 有序可重复消息队列评论列表时间线等有序数据lpush/rpush key value valueHash压缩链表/字典key keyvalue[key,value…]用户商品信息等对象更接近java里的对象hset key key1 value1Set字典key v1,v2… 无序唯一标签用户id集合等方便去重sadd key v1 v2ZSet压缩列表/跳表排序权重排行榜带权重的消息队列等需要排序的场合zadd key score v1 score v2
持久化
特性rdbaof存储类型二进制文件操作命令日志文件命令SAVE # 阻塞服务器进程保存快照 BGSAVE # 在后台异步保存快照bgrewriteaof 重写配置save 900 1 # 900秒内至少有1个键被修改时自动保存RDB快照 save 300 10 # 300秒内至少有10个键被修改时自动保存RDB快照 save 60 10000 # 60秒内至少有10000个键被修改时自动保存RDB快照 dbfilename dump.rdb # RDB文件名 dir /path/to/your/backup/directory # RDB文件保存目录appendonly yes # 启用AOF持久化 appendfsync always # 每个写操作都同步到磁盘 appendfilename “appendonly.aof” # AOF文件名 dir /path/to/your/appendonly/directory # AOF文件保存目录是否主线程save主线程 bgsave子线程子线程优点数据快照恢复速度块文件大恢复速度慢缺点会丢失最后一次快照后的数据安全性高高可用
高可用
特性主从哨兵集群说明一主多从一主多从哨兵监控主节点多主多从hash槽 数据分片设置slaveof通过sentinel.conf配置CLUSTER MEET故障转移不支持支持支持
分布式锁
特性描述获取锁使用SETNX命令Set if Not eXists来在Redis中设置一个键值对作为锁如果该键不存在则设置成功表示获取到锁。锁的持有时间可以为锁设置一个超时时间以防止锁被持有太久而导致死锁。可以使用EXPIRE命令来为锁设置过期时间。释放锁使用DEL命令来删除锁键来释放锁。避免竞态条件在设置锁时可以为锁键设置一个唯一的标识例如使用UUID以确保只有持有锁的一方才能释放它。处理死锁可以使用Lua脚本来原子性地释放锁避免在解锁过程中由于某些原因导致死锁。自动续期使用SET命令和EX选项来为锁键设置超时时间并在持有锁期间定期更新超时时间以避免锁过期。并发控制可以使用WATCH和MULTI/EXEC命令组合来实现乐观锁以确保在锁被释放之前其他客户端无法获取锁。锁粒度可以实现多种锁粒度例如全局锁和分布式资源锁以满足不同的应用场景需求。
附上什么情况下会发生死锁
在使用Redis来实现分布式锁时死锁通常是由于不正确的锁的使用和释放方式引起的。以下是一些可能导致死锁的情况
未释放锁如果一个客户端成功获取锁但在后续操作中没有正确释放锁那么其他客户端将永远无法获取这个锁从而导致死锁。锁的超时时间不合理如果设置锁的超时时间太短那么在锁还有效的情况下其他客户端可能会尝试获取锁导致死锁。另一方面如果锁的超时时间太长那么即使一个客户端意外宕机或崩溃其他客户端也无法获得锁同样可能导致死锁。并发更新如果多个客户端同时尝试获取和更新锁的状态可能会导致竞争条件从而破坏了锁的正确性进而导致死锁。网络问题如果由于网络问题或Redis集群分区某个客户端无法及时获得锁释放的消息它可能会陷入等待锁释放的状态导致死锁。复杂的锁协议一些复杂的锁协议如读写锁或带有多个状态的锁可能更容易出现问题需要更谨慎的实现和测试以防止死锁。
发布订阅
PUBLISH channel “消息内容”
SUBSCRIBE channel
性能优化
安全性
数据分片
缓存策略
键过期删除策略
Redis的过期删除策略就是惰性删除和定期删除两种策略配合使用。
惰性删除Redis的惰性删除策略由 db.c/expireIfNeeded 函数实现所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查如果过期则删除该键然后执行键不存在的操作未过期则不作操作继续执行原有的命令。
定期删除由redis.c/activeExpireCycle 函数实现函数以一定的频率运行每次运行时都从一定数量的数据库中取出一定数量的随机键进行检查并删除其中的过期键。
注意并不是一次运行就检查所有的库所有的键而是随机检查一定数量的键。
定期删除函数的运行频率在Redis2.6版本中规定每秒运行10次大概100ms运行一次。在Redis2.8版本后可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数。
内存淘汰策略
在配置文件redis.conf 中可以通过参数 maxmemory 来设定最大内存
当现有内存大于 maxmemory 时便会触发redis主动淘汰内存方式通过设置 maxmemory-policy 有如下几种淘汰方式
1volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) 。
2allkeys-lru 利用LRU算法移除任何key 和上一个相比删除的key包括设置过期时间和不设置过期时间的。通常使用该方式。
3volatile-random 移除设置过过期时间的随机key 。
4allkeys-random 无差别的随机移除。
5volatile-ttl 移除即将过期的key(minor TTL)
6noeviction 不移除任何key只是返回一个写错误 默认选项一般不会选用。 总结归纳
掌握这些高级Redis知识点将使你在面试中展现出对Redis的深刻理解和实际应用经验。同时还应准备答案以解释你在实际项目中如何使用Redis来解决特定的问题和挑战。 参考文章
chatGPT和claude2