前端开发工程师、技术日更博主、已过CET6
阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
Redis的分布式锁实现方式有以下几种:
客户端锁:客户端锁是指在客户端使用Redis的SET命令设置锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。客户端锁适用于简单的场景,如单客户端并发操作。
服务端锁:服务端锁是指在Redis服务器上使用SET命令设置锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。服务端锁适用于复杂的场景,如多客户端并发操作,可以保证锁的公平性和一致性。
分布式锁:分布式锁是指在Redis集群中使用SET命令设置锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。分布式锁可以保证锁的公平性和一致性,适用于高并发场景。
布隆过滤器:布隆过滤器是指使用Redis的布隆过滤器数据结构实现分布式锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。布隆过滤器可以保证锁的公平性和一致性,适用于高并发场景。
乐观锁:乐观锁是指在客户端使用Redis的WATCH、MULTI、EXEC等命令实现分布式锁,当客户端尝试获取锁时,如果锁已经被其他客户端更新,则返回失败。乐观锁可以保证锁的公平性和一致性,适用于高并发场景。
分布式锁服务:分布式锁服务是指使用第三方开源服务,如Redisson、REDIS-CLUSTER
等,实现分布式锁。分布式锁服务可以提供高性能、高可用性和可扩展性的分布式锁服务。
Redis的过期键处理机制如下:
设置过期时间:在设置键值对时,可以通过EXPIRE命令设置键的过期时间,单位为秒。例如,SET mykey “Hello, World!” EXPIRE 10。
自动过期:当键的过期时间到达时,Redis会自动删除该键。
定期检查过期键:Redis会定期执行TTL命令,检查键的过期时间,如果过期时间到达,则自动删除该键。
手动删除过期键:可以使用PERSIST命令,将键的过期时间设置为永久,从而避免该键被自动删除。例如,PERSIST mykey。
过期键的内存占用:Redis会优先删除内存占用较大的过期键,以保证Redis的内存使用效率。
过期键的过期处理优先级:Redis会优先处理设置的过期时间,其次处理自动过期和定期检查过期的时间。
过期键的处理方式:Redis会根据键的过期时间、内存占用和处理优先级等条件,决定是否删除过期键。
过期键的处理策略:Redis提供了多种过期键的处理策略,如定期清理、LRU算法、LFU算法等,可以根据实际需求进行选择。
Redis的LRU(Least Recently Used,最近最少使用)
算法是一种缓存淘汰策略,用于根据键的使用情况决定是否删除缓存。
LRU算法的实现过程如下:
初始化:当Redis启动时,将所有键的访问时间设置为0,表示未访问。
访问键:当客户端访问键时,将该键的访问时间设置为当前时间,表示该键被访问。
淘汰键:当Redis的内存使用达到限制时,会执行LRU算法,选择最近最少使用的键进行淘汰。具体步骤如下:
a. 计算每个键的访问时间,并将访问时间按照从小到大的顺序进行排序。
b. 删除访问时间最早的键,即最近最少使用的键。
访问键:当客户端再次访问该键时,将该键的访问时间设置为当前时间,表示该键被访问。
更新访问时间:当Redis执行其他操作时,如设置键值对、执行过期处理等,也会更新键的访问时间,从而保证LRU算法的正确性。
定期检查:Redis会定期执行LRU命令,检查键的访问时间,以确保LRU算法的正确性。
LRU算法的优点是能够根据键的访问情况自动淘汰缓存,从而保证Redis的内存使用效率。但缺点是可能会导致客户端访问某个键时需要等待较长时间,因为该键的访问时间可能会被更新。
Redis
的事务(Transaction)是指一组原子操作,保证整个操作要么全部成功,要么全部失败。Redis的事务实现是基于Redis的WATCH、MULTI、EXEC三个命令。
以下是Redis事务的实现过程:
客户端发送WATCH命令,指定要监视的键。例如,WATCH mykey1 mykey2。
客户端执行事务内的操作,例如设置键值对、修改键值等。
客户端发送MULTI命令,表示事务开始。例如,MULTI。
客户端执行事务内的操作,例如设置键值对、修改键值等。
客户端发送EXEC命令,表示事务提交。例如,EXEC。
Redis服务器根据客户端发送的命令执行事务,如果事务执行成功,则返回客户端执行的所有操作的结果;如果事务执行失败,则返回错误信息。
Redis事务的优点是能够保证整个操作的原子性,即要么全部成功,要么全部失败。但缺点是需要客户端与服务器之间同步通信,可能会导致性能下降。
以下是Redis事务的示例:
WATCH mykey
SET mykey "Hello, World!"
MULTI
EXEC
在这个示例中,客户端首先使用WATCH命令监视mykey键,然后使用SET命令设置键的值为"Hello, World!"。接着,客户端使用MULTI命令开始事务,然后使用EXEC命令提交事务。如果mykey键已经被其他客户端修改,则事务执行失败,返回错误信息。如果mykey键未被修改,则事务执行成功,返回设置的键值对。