Redis知识点汇总表格总结

      针对java程序员来说,Redis在项目中使用非常广泛,并且在面试中也几乎是必问的知识点,重要性自然不言而喻了,自然更需要总结了,每次跳槽面试必备,复习更方便,提高复习的效率!

目录

1.Redis的定义及简介

2.Redis数据类型

3.Redis持久化机制

4.Redis事务

5.Redis发布/订阅

 6.Redis主从复制

7.Redis哨兵系统(Sentinel)

8.Redis集群

9.Redis数据淘汰策略(共有8中,其中两种是4.0版本后新增)

10.Redis连接管理

11.Redis性能监控

12.Redis安全特性

13.Redis命令行工具(CLI)

14.Redis Lua脚本

15.Redis内存管理

16.Redis超时与限制

17.Redis管道(Pipelining)

18.Redis排序与排名

19.Redis流(Streams)

20.Redis模块

21.Redis哈希槽(Hash Slot)

22.Redis虚拟内存

23.Redis连接池

24.Redis分布式锁

25.Redis事务的高级用法

26.缓存常见问题


1.Redis的定义及简介

   Redis是一个开源的内存数据库,也被称为数据结构服务器。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。Redis以其高性能、灵活性和丰富的功能而受到广泛欢迎,常用于缓存、会话存储、实时分析、消息队列等场景。

特性描述
数据类型支持字符串、列表、集合、有序集合、散列等数据类型
性能高性能,单线程模型,通过优化算法实现高吞吐量
数据存储内存存储,可选数据持久化
应用场景缓存、消息队列、排行榜、实时分析等
架构支持主从复制、哨兵系统、集群等
语言支持支持多种语言的客户端,如C、Java、Python、Go等
数据安全支持密码保护、ACL等安全机制
社区和文档活跃的社区支持,丰富的文档和教程
  2.Redis数据类型
数据类型描述示例
字符串简单的键值对存储,常用于缓存功能SET key value - 设置键为"key"的值为"value"
列表字符串序列,支持原子推入和弹出操作LPUSH list_key value1 value2 - 将值"value1"和"value2"推入名为"list_key"的列表
集合无序集合,自动去重SADD set_key value1 value2 - 将"value1"和"value2"添加到名为"set_key"的集合
有序集合有序集合,元素有唯一的分数ZADD sorted_set_key 1 value1 2 value2 - 将"value1"和"value2"添加到有序集合"sorted_set_key",分别赋予分数1和2
哈希键值对集合,适合存储对象HSET hash_key field1 value1 field2 value2 - 设置哈希"hash_key"中"field1"的值为"value1","field2"的值为"value2"
位图字符串类型的特殊用途,常用于状态存储SETBIT bitmap_key offset value - 在位图"bitmap_key"的"offset"位置设置位的值
地理空间存储地理位置信息,支持地理查询GEADD geoset_key longitude latitude member - 在地理空间集合"geoset_key"中添加成员"member"的经纬度

使用Redis的列表数据类型可以有效地存储和管理用户会话。方便原子操作;列表的两端都可以进行原子的推入(LPUSH)和弹出(RPUSH)操作,这使得它们非常适合用来存储用户会话,其中会话可以按照时间顺序排列。

示例:

假设我们有一个用户会话系统,每当用户登录时,我们将其会话标识符(session ID)存储在一个列表中。我们可以使用LPUSH将新的会话ID推入到列表的头部。

LPUSH user_sessions_session_list session_id_1234

当用户退出时,我们可以从列表中移除对应的会话ID。如果需要从列表头部移除,可以使用LPOP命令:

LPOP user_sessions_session_list

如果需要从列表尾部移除,可以使用RPOP命令:

RPOP user_sessions_session_list

此外,可以使用LRANGE命令获取一定范围内的会话ID列表,例如获取最近登录的10个会话:

LRANGE user_sessions_session_list 0 9

这个命令将返回列表user_sessions_session_list中的前10个会话ID。

使用列表存储会话的好处是可以轻松地实现会话的过期和清理。例如,可以使用LTRIM命令来限制列表的大小,从而实现旧会话的自动清理:

LTRIM user_sessions_session_list 0 999

这个命令将保留列表中的最后1000个会话ID,自动删除更早的会话。

3.Redis持久化机制
持久化方式描述特点
RDB将当前Redis实例的状态生成快照并保存到磁盘适合做备份和灾难恢复
AOF记录服务器接收到的每一个写操作命令,并将这些命令追加到文件的末尾适合做数据恢复,提供了不同的同步选项
混合持久化RDB和AOF的组合使用结合了两者的优点,提供了更灵活的数据恢复方式

示例:配置RDB持久化策略。

# 配置RDB持久化,900秒内至少1个键被修改,则发起快照保存
SAVE 900 1
# 配置RDB持久化,300秒内至少10个键被修改,则发起快照保存
SAVE 300 10
# 配置RDB持久化,60秒内至少10000个键被修改,则发起快照保存
SAVE 60 10000

4.Redis事务
命令描述示例
MULTI开始一个事务,后续命令将入队但不执行MULTI - 开始事务
EXEC执行所有事务中的命令EXEC - 提交事务
DISCARD取消事务,清空事务队列DISCARD - 取消事务
WATCH监视一个或多个键,如果在执行事务期间这些键被其他命令改动,则事务不执行WATCH key1 key2 - 监视"key1"和"key2"
MULTI ... COMMANDS ... EXEC批量执行命令,如果在这个过程中发生错误,则不会执行任何命令MULTI <br> SET key1 value1 <br> SET key2 value2 <br> EXEC - 原子地设置两个键的值

示例:使用事务确保两个键同时更新。

MULTI
SET key1 "value1"
SET key2 "value2"
EXEC
5.Redis发布/订阅
命令描述示例
PUBLISH将消息发送到指定的频道PUBLISH channel message - 向频道"channel"发送消息"message"
SUBSCRIBE订阅一个或多个频道,接收这些频道的消息SUBSCRIBE channel1 channel2 - 订阅"channel1"和"channel2"
PSUBSCRIBE订阅一个或多个符合模式的频道PSUBSCRIBE pattern1 pattern2 - 订阅符合"pattern1"和"pattern2"模式的频道
UNSUBSCRIBE取消订阅一个或多个频道UNSUBSCRIBE channel1 channel2 - 取消订阅"channel1"和"channel2"
PUNSUBSCRIBE取消订阅一个或多个符合模式的频道PUNSUBSCRIBE pattern1 pattern2 - 取消订阅符合"pattern1"和"pattern2"模式的频道

示例:使用发布/订阅机制实现消息广播。

# 客户端1
SUBSCRIBE news

# 客户端2
PUBLISH news "Hello!"

# 客户端1将接收到"Hello!"消息
 6.Redis主从复制
特性描述示例
主服务器存储数据,处理写操作redis-server - 启动主服务器
从服务器读取数据,可以有多个,用于负载均衡和故障转移redis-server --slaveof master_host master_port - 启动从服务器并指定主服务器的地址和端口
数据同步从服务器通过复制主服务器的数据来同步使用SLAVEOF命令或在配置文件中设置主服务器信息
只读模式从服务器默认为只读模式,可以接受配置修改为读写CONFIG SET slave-read-only yes/no - 设置从服务器的只读模式
自动故障转移哨兵系统可以监控主服务器状态,自动将一个从服务器提升为主服务器使用哨兵系统(Sentinel)实现自动故障转移

示例:配置主从复制。

# 在从服务器上设置主服务器信息
SLAVEOF master_host 6379

7.Redis哨兵系统(Sentinel)
特性描述示例
监控持续监控主服务器和从服务器的状态Sentinel 通过定期发送 PING 命令来检测服务器状态
自动故障转移检测到主服务器故障时自动进行故障转移Sentinel 会根据投票数决定是否进行故障转移
通知故障转移发生时,通知系统其他部分通过脚本或命令行通知系统其他部分主服务器已经变更
数据迁移将旧的主服务器数据迁移到新的主服务器上Sentinel 会将旧主服务器的数据同步到新的主服务器
高可用提供高可用性解决方案,减少系统因单点故障导致的不可用时间使用 Sentinel 可以避免主服务器故障导致的服务中断

示例:启动 Sentinel 监控主服务器。

redis-sentinel /path/to/sentinel.conf

 配置文件 sentinel.conf 中会包含如下配置:

# 配置监控的主服务器信息
sentinel monitor mymaster 127.0.0.1 6379 2

# 配置故障转移所需的最小同意数
sentinel down-after-milliseconds mymaster 30000

# 配置故障转移时执行的命令
sentinel failover-timeout mymaster 900000
8.Redis集群
特性描述示例
数据分片数据被分割成多个部分,每个部分存储在不同的节点上使用 CLUSTER MEET 创建集群节点
高可用集群中的每个主节点都可以处理写操作,且具有从节点用于故障转移使用 SLAVEOF 配置从节点
数据迁移可以在不停止服务的情况下,将数据从一个节点迁移到另一个节点使用 CLUSTER SET-SLOT 进行数据迁移
数据一致性集群使用复制和分布式算法来保持数据一致性使用 CLUSTER NODES 查看集群状态
数据持久性支持多种数据持久化选项,如RDB和AOF配置持久化选项以满足数据持久性需求
读写分离可以根据负载将读操作分配给从节点使用 MOVED 错误处理客户端的读写请求

示例:使用Redis集群进行数据分片。

# 初始化集群
redis-cli --cluster create host1:port1 host2:port2 host3:port3 --cluster-replicas 1

# 查看集群信息
redis-cli --cluster nodes
9.Redis数据淘汰策略(共有8中,其中两种是4.0版本后新增)
策略名称描述适用场景
noeviction不删除任何数据,如果内存满了,写操作会被阻塞当数据集大小相对稳定,且内存足够大时
allkeys-lru(Least Recently Used)根据最近最少使用算法删除键,无论数据类型如何当需要从所有数据类型中淘汰数据时
allkeys-lfu(Least Frequently Used) 4.0版本后新增根据键的使用频率和最近一次使用该键的时间进行淘汰。适用于读多写少,且希望淘汰访问频率较低的键的场景
allkeys-random从所有键中随机删除一个键当需要随机删除数据以回收内存时
volatile-lru从设置了过期时间的键中,根据最近最少使用算法删除键当需要从设置了过期时间的键中回收内存时
volatile-lfu (4.0版本后新增)根据键的使用频率和最近一次使用该键的时间进行淘汰。适用于读多写少,且希望淘汰访问频率较低的键的场景
volatile-random从设置了过期时间的键中随机删除一个键当需要随机删除设置了过期时间的键以回收内存时
volatile-ttl删除即将过期的键当需要根据键的剩余生存时间来淘汰数据时

示例:配置Redis使用LRU数据淘汰策略。

CONFIG SET maxmemory-policy allkeys-lru

10.Redis连接管理
命令描述示例
CLIENT LIST列出所有客户端的连接信息CLIENT LIST - 显示所有客户端的连接信息
CLIENT KILL断开一个或多个客户端的连接CLIENT KILL ip:port - 断开指定IP和端口的客户端连接
CLIENT GETNAME获取客户端的名称CLIENT GETNAME - 获取当前客户端的名称
CLIENT SETNAME设置客户端的名称CLIENT SETNAME myname - 将当前客户端名称设置为"myname"
CONFIG GET maxclients获取当前允许的最大客户端连接数CONFIG GET maxclients - 获取最大客户端连接数配置
CONFIG SET maxclients设置允许的最大客户端连接数CONFIG SET maxclients 5000 - 设置最大客户端连接数为5000

示例:查看当前Redis服务器的所有客户端连接。

CLIENT LIST

11.Redis性能监控
命令描述示例
INFO提供关于Redis服务器的各种统计信息和指标INFO - 获取Redis服务器的详细信息
MONITOR监视服务器接收到的命令以及服务器发出的命令MONITOR - 实时显示所有传输给服务器的命令
SLOWLOG记录慢查询,可以设置慢查询的时间阈值SLOWLOG GET 10 - 获取最后10条慢查询记录
CLIENT PAUSE挂起所有客户端的命令处理,用于服务器维护CLIENT PAUSE 1000 - 挂起客户端1秒
LASTSAVE获取最近一次RDB持久化的时间LASTSAVE - 获取最后一次成功创建快照的时间
ROLE显示当前Redis实例的角色(主机或从机)ROLE - 显示当前Redis实例的角色
COMMAND STATS获取Redis命令的统计信息,如执行次数等(5.0.0以上版本)COMMAND STATS - 获取Redis命令的统计信息

示例:获取Redis服务器的统计信息。

INFO

12.Redis安全特性
命令描述示例
CONFIG SET requirepass设置密码保护,要求客户端在连接时提供密码CONFIG SET requirepass mypassword - 设置密码为"mypassword"
AUTH使用密码认证连接AUTH mypassword - 使用密码"mypassword"进行认证
COMMAND列出所有可用的Redis命令COMMAND - 列出所有Redis命令
COMMAND INFO获取关于特定Redis命令的信息COMMAND INFO GET SET - 获取"GET"和"SET"命令的信息
ACL SET在Redis 6.0及以上版本中,设置更细粒度的访问控制列表ACL SET myuser +@all >mykey - 创建用户并设置权限
ACL LIST列出所有用户的ACL规则ACL LIST - 列出所有用户的ACL规则
ACL WHOAMI显示当前客户端使用的用户名ACL WHOAMI - 显示当前连接的用户名称
ACL LOG查看ACL相关操作的日志ACL LOG - 查看ACL日志

示例:设置Redis服务器的密码。

CONFIG SET requirepass mypassword

13.Redis命令行工具(CLI)
命令描述示例
redis-cli启动Redis命令行客户端redis-cli - 启动Redis命令行客户端
-h指定Redis服务器的主机名redis-cli -h myhost - 连接到名为"myhost"的Redis服务器
-p指定Redis服务器的端口redis-cli -p 6379 - 使用默认端口6379连接Redis服务器
-a提供连接密码redis-cli -a mypassword - 使用密码连接Redis服务器
--scan迭代数据库中的键,用于代替KEYS命令redis-cli --scan --pattern '*' - 扫描所有键
INCR增加键的值,如果键不存在则开始于1INCR mykey - 如果"mykey"不存在,将其值设为1
DECR减少键的值,如果键不存在则开始于-1DECR mykey - 如果"mykey"不存在,将其值设为-1
APPEND向键的值追加字符串APPEND mykey "message" - 向"mykey"的值追加"message"
BITCOUNT计算字符串中,二进制位为1的个数BITCOUNT mykey - 计算"mykey"中二进制位为1的个数

示例:使用密码连接到Redis服务器。

redis-cli -h localhost -p 6379 -a mypassword

14.Redis Lua脚本
命令描述示例
EVAL执行Lua脚本EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 key1 value1 - 使用Lua脚本设置键值对
EVALSHA执行保存在Redis中的Lua脚本的SHA1摘要EVALSHA sha1_hash - 执行已保存的Lua脚本
SCRIPT EXISTS检查指定的Lua脚本是否存在SCRIPT EXISTS sha1_hash1 sha1_hash2 - 检查两个Lua脚本是否已存在
SCRIPT FLUSH移除所有已保存的Lua脚本SCRIPT FLUSH - 清除所有已保存的Lua脚本
SCRIPT KILL杀死当前正在运行的Lua脚本SCRIPT KILL - 强制停止当前运行的Lua脚本
SCRIPT LOAD将Lua脚本加载到Redis服务器但不执行它SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])" - 加载Lua脚本但不执行
redis-cli --eval从命令行执行Lua脚本redis-cli --eval myscript.lua 1 key1 value1 - 执行名为myscript.lua的Lua脚本

示例:使用Lua脚本原子地设置两个键的值。

EVAL "redis.call('SET', KEYS[1], ARGV[1]); redis.call('SET', KEYS[2], ARGV[2]); return 'OK'" 2 key1 value1 key2 value2
15.Redis内存管理
命令描述示例
MEMORY USAGE显示分配给键的内存使用量MEMORY USAGE mykey - 显示键"mykey"的内存使用量
MEMORY STATS提供关于内存使用情况的统计信息MEMORY STATS - 显示内存使用情况的统计信息
MEMORY PURGE减少内存占用,但不释放内存MEMORY PURGE - 尝试通过回收缓存来减少内存占用
MEMORY ALLOC显示Redis分配器的当前内存分配量MEMORY ALLOC - 显示当前内存分配量
MEMORY FREE显示Redis分配器的当前内存剩余量MEMORY FREE - 显示当前内存剩余量
CONFIG SET maxmemory设置最大内存使用量CONFIG SET maxmemory 100mb - 设置最大内存使用量为100MB
CONFIG SET maxmemory-policy设置内存使用达到上限时的淘汰策略CONFIG SET maxmemory-policy allkeys-lru - 设置淘汰策略为LRU

示例:查看键"mykey"的内存使用量。

MEMORY USAGE mykey

16.Redis超时与限制
命令描述示例
CONFIG GET timeout获取当前的超时设置CONFIG GET timeout - 获取超时设置
CONFIG SET timeout设置超时时间,单位为秒CONFIG SET timeout 30 - 设置超时时间为30秒
CONFIG GET maxclients获取当前允许的最大客户端连接数CONFIG GET maxclients - 获取最大客户端连接数
CONFIG SET maxclients设置允许的最大客户端连接数CONFIG SET maxclients 1000 - 设置最大客户端连接数为1000
CONFIG GET maxmemory-samples获取用于检查键删除的样本数量CONFIG GET maxmemory-samples - 获取键删除样本数量
CONFIG SET maxmemory-samples设置用于检查键删除的样本数量CONFIG SET maxmemory-samples 5 - 设置键删除样本数量为5
COMMAND查看所有命令的详细信息,包括时间复杂度COMMAND - 查看所有命令的详细信息
COMMAND INFO查看指定命令的详细信息COMMAND INFO GET SET - 查看"GET"和"SET"命令的详细信息

示例:设置客户端超时时间。

CONFIG SET timeout 60

17.Redis管道(Pipelining)
命令描述示例
PIPELINE表示命令将被送入管道,而不是立即执行redis-cli --pipeline - 使用管道执行多个命令
MULTI开始事务,后续命令将入队但不执行MULTI - 开始事务
EXEC执行所有事务中的命令EXEC - 提交事务
命令队列将多个命令一次性发送到服务器,减少往返次数SET key1 value1 <br> SET key2 value2 <br> ... - 队列中的命令
DISCARD取消事务,清空事务队列DISCARD - 取消事务
TELNET用于测试管道功能,发送一系列命令到服务器redis-cli --pipe 10000 - 发送10000个命令到服务器

示例:使用管道执行多个命令。

redis-cli --pipe
SET key1 value1
SET key2 value2
END

18.Redis排序与排名
命令描述示例
SORT对列表、集合或有序集合进行排序SORT mylist BY mylist LIMIT 0 10 ASC - 对列表"mylist"进行升序排序并获取前10个元素
BY指定排序的键或模式BY pattern - 根据模式排序
GET排序后获取其他键的值GET another_key* - 排序后获取"another_key"的值
ASC / DESC指定排序的方向,升序或降序ASC - 升序,DESC - 降序
LIMIT限制返回的元素数量LIMIT offset count - 从偏移量开始获取特定数量的元素
STORE将排序后的结果存储到另一个键STORE sorted_list - 将排序结果存储到"sorted_list"
ZREVRANGE获取有序集合中分数从高到低的元素ZREVRANGE myzset 0 -1 WITHSCORES - 获取有序集合"myzset"中所有元素及其分数
ZRANGE获取有序集合中分数从低到高的元素ZRANGE myzset 0 -1 WITHSCORES - 获取有序集合"myzset"中所有元素及其分数

 示例:对列表进行升序排序并获取结果。

SORT mylist ASC

19.Redis流(Streams)
命令描述示例
XADD向流中添加一个新条目XADD mystream * field1 value1 field2 value2 - 向"mystream"添加新条目
XREAD从流中读取数据XREAD COUNT 1 STREAMS mystream 0-0 - 从"mystream"读取一个条目
XRANGE获取流中指定范围内的条目XRANGE mystream - + - 获取"mystream"中所有条目
XREVRANGE获取流中指定范围内的条目,按相反顺序XREVRANGE mystream + - COUNT 1 - 获取"mystream"中的最后一个条目
XLEN获取流中的条目数量XLEN mystream - 获取"mystream"中的条目数量
XDEL删除流中的一个或多个条目XDEL mystream ID - 删除"mystream"中的ID条目
XGROUP创建、获取、破坏消费者组XGROUP CREATE mystream mygroup 0 MKSTREAM - 创建消费者组
XREADGROUP从消费者组读取数据XREADGROUP GROUP mygroup myconsumer COUNT 1 STREAMS mystream > - 从消费者组读取数据
XACK确认消息已经被处理过XACK mystream mygroup ID - 确认"mystream"的"mygroup"消费者组中的ID条目

示例:向流"mystream"中添加一个新条目。

XADD mystream * field1 "value1" field2 "value2"

20.Redis模块
命令描述示例
MODULE LIST列出已加载的模块MODULE LIST - 列出所有已加载的模块
MODULE LOAD加载一个新的模块MODULE LOAD /path/to/module.so - 加载指定路径的模块
MODULE UNLOAD卸载一个已加载的模块MODULE UNLOAD modulename - 卸载名为"modulename"的模块
MODULE EXISTS检查模块是否已加载MODULE EXISTS modulename - 检查"modulename"模块是否已加载
MODULE用于执行模块命令,如MODULE CREATEMODULE CREATE mymodule - 创建一个名为"mymodule"的模块
自定义命令模块可以提供自定义命令mymodule:mycommand arg1 arg2 - 使用模块提供的自定义命令
模块化架构允许第三方开发者扩展Redis的功能通过模块化架构,开发者可以添加新的数据类型、命令等

示例:加载一个名为"mymodule"的Redis模块。

MODULE LOAD /path/to/mymodule.so

21.Redis哈希槽(Hash Slot)
命令描述示例
CLUSTER KEYSLOT获取与一个键名关联的哈希槽CLUSTER KEYSLOT mykey - 获取键"mykey"的哈希槽编号
CLUSTER COUNTSLOT获取集群中每个槽的键值对数量CLUSTER COUNTSLOT - 获取集群中每个哈希槽的统计信息
CLUSTER GETKEYSINSLOT获取特定哈希槽中的键CLUSTER GETKEYSINSLOT 0 10 - 获取哈希槽0中的前10个键
哈希槽分布Redis集群使用16384个哈希槽来分布键哈希槽确保键在集群中的分布均匀

示例:获取键"mykey"所在的哈希槽。

CLUSTER KEYSLOT mykey

22.Redis虚拟内存
命令描述示例
CONFIG SET设置虚拟内存相关的配置CONFIG SET vm-enabled yes - 启用虚拟内存
VMSTATS显示虚拟内存的统计信息VMSTATS - 查看虚拟内存的统计信息
Swap文件Redis使用Swap文件作为虚拟内存Swap文件允许Redis使用磁盘空间作为内存的扩展
内存回收Redis可以配置内存回收策略,以决定何时将数据交换到Swap文件内存回收策略可以与数据淘汰策略结合使用

示例:启用Redis虚拟内存。

CONFIG SET vm-enabled yes
CONFIG SET vm-swap-file /var/redis/swapfile
CONFIG SET vm-max-memory 100mb

23.Redis连接池
概念描述示例
连接池管理数据库连接的集合,减少频繁创建和销毁连接的开销使用连接池可以重用已有的数据库连接
池化参数可以通过参数设置连接池的大小和行为连接池的参数通常由客户端库提供
客户端库许多语言提供了支持连接池的Redis客户端库如Jedis(Java)、redis-py(Python)等
连接超时连接池中的连接如果空闲超时,可能会被自动关闭需要配置合适的超时时间以避免不必要的连接关闭

示例:在Java中使用Jedis连接池。

JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(100);
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
Jedis jedis = jedisPool.getResource();
jedis.set("key", "value");
jedis.close();
24.Redis分布式锁
命令描述示例
SETNX设置键如果它不存在,常用于实现分布式锁SETNX lock_key unique_value - 尝试获取锁
EXPIRE设置键的过期时间,确保锁最终能够释放EXPIRE lock_key 10 - 为"lock_key"设置10秒的过期时间
DEL删除键,释放锁DEL lock_key - 删除"lock_key",释放锁
锁续期锁的持有者需要定期续期以避免意外释放使用定时任务或后台进程来续期锁

示例:使用Redis实现分布式锁。

# 尝试获取锁
IF (SETNX lock_key unique_value) == 1 THEN
    # 锁已被获取
    # ... 执行操作 ...
    # 锁操作完成后删除锁
    DEL lock_key
ELSE
    # 锁已被其他进程持有
END

 在java应用中,尤其是SpringBoot项目中,可以使用Redisson来使用分布式锁

首先,确保你已经添加了Redisson的依赖到你的项目中。如果你使用Maven,可以在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.15.3</version>
</dependency>

然后,配置Redisson与你的Redis服务器连接:

# application.yml
spring:
  redis:
    host: localhost
    port: 6379
    password: your-redis-password

 或者,如果你不使用Spring Boot,你可以直接在代码中配置:

Config config = new Config();
config.useSingleServer()
        .setAddress("redis://localhost:6379")
        .setPassword("your-redis-password");

RedissonClient redisson = Redisson.create(config);

 接下来,你可以使用Redisson的RLock对象来实现分布式锁:

RLock lock = redisson.getLock("myLock");

try {
    // 尝试获取锁,等待时间是10秒,锁的持有时间是30秒
    lock.tryLock(10, 30, TimeUnit.SECONDS);

    // 业务逻辑处理
    // ...

} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
} finally {
    // 解锁
    lock.unlock();
}

在这个示例中,tryLock()方法尝试获取名为myLock的锁。如果锁在10秒内可用,当前线程将获得锁并执行业务逻辑。如果获取成功,锁将被持有30秒,即使持有锁的线程在这段时间内执行完毕。如果需要更复杂的逻辑,例如锁续期,可以在finally块中实现。

请注意,使用分布式锁时,要特别注意避免死锁和确保锁的释放,即使在发生异常的情况下。上面的代码中,finally块确保了锁在操作完成后总是被释放。

此外,Redisson还提供了其他类型的锁,如公平锁、读写锁、红锁等,你可以根据需要选择使用。

25.Redis事务的高级用法
命令描述示例
WATCH在执行事务前监控一个或多个键,如果在事务执行前这些键被修改,则事务不执行WATCH key1 key2 - 在事务执行前监控"key1"和"key2"
MULTI开始事务,将多个命令放入队列MULTI - 开始事务
EXEC提交事务,执行队列中的所有命令EXEC - 提交事务
事务条件执行只在满足特定条件时执行事务使用WATCH命令配合事务
命令队列事务中的命令被放入队列,一次性发送给服务器执行命令队列减少了服务器和客户端之间的通信次数

示例:使用WATCH和事务来安全地递增一个值。

WATCH mycounter
val = GET mycounter
val = val + 1
MULTI
SET mycounter $val
EXEC

26.缓存常见问题
问题 出现原因解决方案
缓存雪崩1.缓存数据大批量同时过期;2.服务不可用,例如整个Redis服务宕机

1. 设置不同的过期时间,为缓存的过期时间加上随机值,避免大规模同时过期

2. 限流策略,平滑请求峰值。

3. 缓存高可用,如使用哨兵或集群。

缓存穿透

1. 请求不存在的缓存数据。

2.恶意攻击,频繁访问数据库中不存在的数据。

1. 对缓存中不存在的key设置为空值null或使用布隆过滤器拦截那些查询不存在数据的请求。

2.使用日志记录异常访问,进行限流或封禁恶意访问。

3.定期更新缓存数据。

缓存击穿高并发请求同时到达,缓存中的热点数据过期

1. 使用互斥锁(mutex)在缓存过期时同步请求,防止大量线程同时查询数据库。

2.设置热点数据永不过期或延长过期时间。

3.实现缓存预热,提前加载热点数据。

 

 

       

好了,先总结这些,其实Redis的知识点还有不少细节,后期再抽时间继续细化,或者再开一篇博客写一些注意的细节或者面试中的高频问题 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/577928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HPE Aruba Networking推出新一代Wi-Fi 7接入点 助力企业高效应对安全、AI与物联网挑战

HPE ArubaNetworking推出的全新Wi-Fi 7接入点&#xff0c;提供全面的AI就绪边缘IT解决方案&#xff0c;旨在为用户和物联网设备提供安全、高性能的连接服务&#xff0c;以实现数据的捕获和路由&#xff0c;从而满足AI训练和推理需求 休斯顿-2024年4月23日-慧与科技(NYSE: HPE)近…

【golang学习之旅】深入理解字符串string数据类型

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 目录 系列文章使用示例string的底层数据结构关于字符串复制字符串是不可变的如何高效的进行字符串拼接&#xff1f; 使用示例 Go 语言中的字符串只是一个只读的字节…

Spring boot + Redis + Spring Cache 实现缓存

学习 Redis 的 value 有 5 种常用的数据结构 Redis 存储的是 key-value 结构的数据。key 是字符串类型&#xff0c;value 有 5 种常用的数据结构&#xff1a; Redis 的图形化工具 Another Redis Desktop Manager Spring Data Redis Redis 的 Java 客户端。 Spring Cache Spr…

AI工具集:解锁智能新境界,一站式解决你的所有需求!

在这个信息爆炸的时代&#xff0c;我们每天都在与大量的数据和信息打交道。如何高效地处理这些信息&#xff0c;提高工作效率和生活品质&#xff0c;成为了我们亟待解决的问题。而AI工具集(AI-321.com)的出现&#xff0c;无疑为我们提供了一把解锁智能新境界的钥匙。 AI-321 | …

VirtualBox7.0.16的蓝屏大坑与ssh登陆ubuntu虚拟机的办法

背景&#xff1a; 安装了最新版的VirtualBox&#xff0c;装了ubuntu系统&#xff0c;在win10下通过ssh死活无法与ubuntu进行正常登陆控制。 然后开始了踩坑。 问题1&#xff1a;ssh登陆失败&#xff0c;但是主机能ping通ubuntu&#xff0c;反过来也能ping通&#xff0c;网络…

地学研究相关工具推荐0426

地学研究相关工具推荐0426 文章目录 地学研究相关工具推荐0426前言工具PanoplyFileZillaGetData Graph DigitizerZotero**谷谷GIS地图下载器** 总结 前言 以下这些工具是之前在进行一些研究过程中使用过的工具&#xff0c;在之后的研究中可能会用到&#xff0c;推荐给大家&…

Unity类银河恶魔城学习记录14-5 p152 Lost currency save and enemy‘s currency drop

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili LostCurrencyController.cs using System.Collections; using System.Colle…

每天五分钟深度学习:如何理解梯度下降算法可以逼近全局最小值?

本文重点 上节课程中,我们已经知道了逻辑回归的代价函数J。要想最小化代价函数,我们需要使用梯度下降算法。 梯度下降算法地直观理解: 为了可视化,我们假设w和b都是单一实数,实际上,w可以是更高地维度。 代价函数J是在水平轴w和b上的曲面,因此曲面的高度就是J(w,b)在…

井字棋游戏

1. 游戏创建 1.1导包 from tkinter import * import numpy as np import math import tkinter.messagebox 1.2 窗口内容 1.2.1创建一个窗口 root Tk() # 窗口名称 root.title("井字棋 from Sun") 1.2.2 创建一个框架&#xff0c;将其放置在窗口中 Frame1 F…

如何进行域名解析?如何清理DNS缓存?(附源码)

目录 1、什么是域名&#xff1f; 2、为什么使用域名&#xff1f; 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存&#xff1f; 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

图像分类导论:从模型设计到端到端

书籍&#xff1a;An Introduction to Image Classification&#xff1a;From Designed Models to End-to-End Learning 作者&#xff1a;Klaus D. Toennies 出版&#xff1a;Springer Singapore 书籍下载-《图像分类导论》图像分类的传统方法包括在特征空间中进行特征提取和…

怎么提高职场辩论的口才能力的方法

提高职场辩论的口才能力是一个综合而复杂的过程&#xff0c;涉及知识积累、技巧学习、实践锻炼等多个方面。以下是关于如何提高职场辩论口才能力的详细分析和建议。 一、引言 在职场中&#xff0c;良好的口才能力对于个人职业发展具有重要意义。优秀的口才不仅能够提升个人的…

日志分析简单总结

1、分析日志的目的 误报&#xff1a;不是攻击而上报成攻击 漏报&#xff1a;是攻击而没有防御的情况 日志分析可以判断是否误判或者漏判&#xff0c;可以溯源攻击行为 在护网作为防守方必备的技能&#xff08;分析NGAF和态势感知&#xff0c;发现异常&#xff09; 2、攻击出现…

C++进阶--智能指针

智能指针的概念 智能指针是C中的一个重要概念&#xff0c;用于管理动态分配的对象内存。它是一个类模板&#xff0c;通过封装原始指针&#xff0c;并在对象生命周期结束时自动释放内存&#xff0c;从而避免了内存泄漏和资源管理的繁琐工作。 C标准库提供了多种常见的智能指针…

el-date-picker 禁用时分秒选择(包括禁用下拉框展示)

2024.04.26今天我学习了对el-date-picker进行禁用时分秒&#xff0c; 在使用el-date-picker组件的时候&#xff0c;我们有可能遇到需要把时分秒的时间固定&#xff0c;然后并且不能让他修改&#xff1a; 1714120999296 比如右上角的这个时间&#xff0c;我们要给它固定是‘08:…

Open3D(C++) 最小二乘拟合多项式曲线

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 多项式曲线表示为: p ( x ) =

使用Screenshots安装Fedora 40版本详细教程

Fedora 40是Fedora操作系统的最新版本&#xff0c;于 2024 年 4 月 23 日发布&#xff0c;是一个社区支持的 Linux 发行版&#xff0c;以其创新功能、领先技术和活跃的社区支持而闻名。 在本指南中&#xff0c;我们将引导您完成安装Fedora 40 Server的分步过程&#xff0c;确保…

SystemUI KeyButtonView setDarkIntensity 解析

继承自 ImageView KeyButtonDrawable intensity为0时按键颜色为白色。 intensity为1时黑色为的调用堆栈&#xff1a; java.lang.NullPointerException: Attempt to invoke virtual method int java.lang.String.length() on a null object referenceat com.android.systemui.…

Linux网络编程---多路I/O转接服务器(一)

多路I/O转接服务器 多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是&#xff0c;不再由应用程序自己监视客户端连接&#xff0c;取而代之由内核替应用程序监视文件。 主要使用的方法有三种&#xff1a;select、poll、epoll 一、select多路IO转接 让内核去…

Java 网络编程之TCP(三):基于NIO实现服务端,BIO实现客户端

前面的文章&#xff0c;我们讲述了BIO的概念&#xff0c;以及编程模型&#xff0c;由于BIO中服务器端的一些阻塞的点&#xff0c;导致服务端对于每一个客户端连接&#xff0c;都要开辟一个线程来处理&#xff0c;导致资源浪费&#xff0c;效率低。 为此&#xff0c;Linux 内核…
最新文章