Redis 数据类型在我的项目中的使用:
1.缓存字符串(String):存储经常查询的数据,如用户信息、页面缓存、API 响应缓存等。
- 存储用户的认证 token、session 信息。
- 实现分布式锁:结合
SETNX
命令,可以用字符串来实现简单的分布式锁。
2.ZSet有序集合
- 排行榜:使用有序集合实现排名系统,根据用户的分数(如积分、等级等)进行排序。
3.哈希Hash
- 存储对象:如用户 ID 作为键,用户的属性(姓名、年龄、性别等)作为字段,避免将整个用户对象序列化成字符串。
- 存储配置项,方便根据字段名快速访问和更新某个配置。
4.列表(List)
- 消息列表:列表可以作为简单的消息队列,用
LPUSH
将消息放入队列,用RPOP
或BRPOP
弹出消息。
5.集合(Set)
- 标签系统:如将用户标签存储为集合,每个集合代表一个用户群体,方便进行集合运算。如找出同时拥有某两个标签的用户。
- 去重功能:在某些场景下(如热门搜索词、访问日志的去重),可以通过集合的唯一性特性来避免重复数据
redis有哪些常用操作(命令)
- 字符串(String)操作
// 设置一个键值对。
SET key value
// 获取指定键的值。
GET mykey
// 将键的整数值增加
INCR mykey
// 将键的整数值减少
DECR mykey
// 将值追加到指定键的末尾。
APPEND mykey " world"
- 哈希(Hash)操作
// 设置哈希表中的字段值
HSET key field value eg:HSET user:1000 name "Alice"
//获取哈希表中指定字段的值。
HGET key field eg:HGET user:1000 name
//获取哈希表中的所有字段和值
HGETALL key eg:HGETALL user:1000
// 删除哈希表中的指定字段
HDEL key field。 eg:HDEL user:1000 name
//获取哈希表中所有字段的名称。
HKEYS key eg:HKEYS user:1000
- 列表(List)操作
//将一个值插入到列表的头部。
LPUSH key value eg:LPUSH mylist "first"
//将一个值插入到列表的尾部。
RPUSH key value eg:RPUSH mylist "last"
//获取列表的长度
LLEN key eg:LLEN mylist
//获取列表中指定范围的元素
LRANGE key start stop eg:LRANGE mylist 0 -1 # 获取整个列表
//在指定元素之前或之后插入新元素。
LINSERT key BEFORE|AFTER pivot value eg:LINSERT mylist BEFORE "first" "new_first"
- 集合(Set)操作
//向集合中添加成员。
SADD key member eg:SADD myset "apple" "banana"
//从集合中移除成员
SREM key member: eg:SREM myset "banana"
//获取集合中的所有成员。
SMEMBERS key eg:SMEMBERS myset
- 有序集合(Sorted Set)操作
//向有序集合添加成员和分数。
ZADD key score member eg:ZADD myzset 1 "apple" 2 "banana"
//获取有序集合中指定范围的元素(按分数升序)。
ZRANGE key start stop eg:ZRANGE myzset 0 -1 # 获取所有成员
//获取有序集合中指定范围的元素(按分数降序)。
ZREVRANGE key start stop eg:ZREVRANGE myzset 0 -1 # 获取所有成员
//获取指定成员的分数。
ZSCORE key member eg:ZSCORE myzset "apple"
//获取有序集合的成员数量。
ZCARD key eg:ZCARD myzset
15.Redis缓存和数据库如何保持一致(研究一下)
延迟双删
延迟双删策略是在更新数据库后,删除缓存,再延迟一段时间后再次删除缓存。 因为有可能在第一步删除缓存后,缓存和数据库之间的同步机制(如数据更新或删除操作)还没有完全完成。 能够有效解决缓存与数据库之间的短暂不一致问题。
异步更新(异步通知)
在更新数据库数据时,同时发送一个异步通知给Redis,让Redis知道数据库数据已经更新,需要更新缓存中的数据。这个过程是异步的,不会阻塞数据库的更新操作。当Redis收到异步通知后,会立即删除缓存中对应的数据,确保缓存中没有旧数据。这样,即使在这个过程中有新的读请求发生,也不会读取到旧数据。等到数据库更新完成后,Redis再次从数据库中读取最新的数据并缓存起来
使用Redis的事务支持
Redis提供了事务(Transaction)支持,可以将一系列的操作作为一个原子操作执行。我们可以利用Redis的事务来实现MySQL和Redis的原子更新。
使用Redis事务可以确保MySQL和Redis的更新在同一事务中执行,避免了中间出现不一致的情况。但需要注意的是,Redis的事务并非严格的ACID事务,可能存在部分成功的情况。
Canal 订阅日志实现
当我们业务修改数据时,我们只需要更新数据库,
在数据库一条记录发生变更时就会生成一条binlog日志,我们可以订阅这种消息,拿到具体的数据,然后根据日志消息更新缓存,订阅日志目前比较流行的就是阿里开源的canal
删除:
订阅数据库变更日志,当数据库发生变更时,我们可以拿到具体操作的数据,然后再去根据具体的数据,去删除对应的缓存。
当然Canal 也是要配合消息队列一起来使用的,因为其Canal本身是没有数据处理能力的。
redis可以持久化吗?如何持久化?
RDB(快照方式): RDB方式是一种快照式的持久化方法,定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。默认的文件名为dump.rdb。
AOF(日志追加): AOF方式是将执行过的写指令记录下来,redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认appendonly.aof)。在数据恢复时按照从前到后的顺序再将指令执行一遍。
RDB和AOF混合方式:
内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。
这样一来,快照不用很频繁地执行,AOF 日志也只用记录两次快照间的操作,因此,就不会出现文件过大的情况了,也可以避免重写开销。
- aof文件比rdb更新频率高,优先使用aof还原数据。
- aof比rdb更安全也更大
- rdb性能比aof好
- 如果两个都配了优先加载AOF
redis缓存数据丢失怎么办?
1.检查Redis服务器是否正常运行:首先需要检查Redis服务器是否正常运行。可以使用redis-cli命令连接到Redis服务器,执行PING命令来验证服务器是否正常响应。如果服务器无法响应,可能是由于Redis服务器崩溃或配置错误引起的,需要根据具体情况进行修复。
2.检查是否存在网络问题:如果Redis服务器正常运行,但是在缓存数据期间发生丢失,可能是由于网络问题引起的。可以检查网络连接是否稳定,是否存在网络延迟或丢包等问题。可以使用ping命令来测试与Redis服务器之间的网络连接。如果存在网络问题,可以尝试修复网络连接或使用更稳定的网络环境。
3.检查Redis配置:如果Redis服务器正常运行且网络连接稳定,但仍然存在缓存丢失问题,可能是由于Redis配置错误引起的。可以检查Redis的配置文件(通常是redis.conf)是否存在问题。特别注意maxmemory(限制内存使用量)配置项,如果该值设置为0,则表示不限制内存使用,可能会导致内存溢出而丢失缓存数据。可以根据实际需求适当调整maxmemory配置项的值。
4.使用持久化功能:Redis提供了持久化功能,可以通过配置Redis的持久化方式(如RDB快照或AOF日志)来实现数据的持久化。RDB快照方式会周期性地将整个数据集保存到磁盘上,而AOF日志方式会将所有对Redis的写操作以日志的形式追加到文件中。通过持久化功能,即使发生缓存丢失,也可以从磁盘上恢复数据。
5.添加数据备份机制:可以定期使用Redis的bgsave命令来创建RDB快照,并将快照文件备份到其他服务器或存储介质上,以实现数据的冗余备份。同时,还可以使用Redis的主从复制功能,将数据复制到其他Redis实例上,以增加数据的可用性和容错性。
redis如果崩溃了如何快速恢复?
Redis 的数据恢复主要依赖于 RDB 和 AOF 两种机制。
- RDB:定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。如果 Redis 崩溃,重新启动时会读取这个 RDB 文件恢复数据。
- AOF:每个写命令都通过 append-only 模式保存到文件。如果 Redis 崩溃,重新启动时会重新执行这些命令恢复数据。
为了快速恢复,你应该:
- 确保已经配置了合适的快照策略(如 900秒内至少1个键改变则保存快照)。
- 确保已经开启了 AOF 持久化(如果对数据安全性有高要求)。
如果同时使用 RDB 和 AOF,Redis 将优先使用 AOF 来恢复数据。
redis是如何部署的?是单个部署还是集群部署?为什么这么做?
Redis可以通过单个部署和集群部署两种方式进行部署,每种方式都有其适用场景和优缺点。
单个部署(单机模式)是最简单的部署方式,Redis运行在单个节点上。这种部署方式适合小型应用程序、开发和测试环境。它的优点包括低延迟和高性能,因为所有操作都在一个节点上完成,减少了网络延迟和数据同步的开销。然而,单个部署的缺点是单点故障,如果该节点发生故障,整个服务将不可用。
集群部署包括主从模式、哨兵模式和集群模式。
- 主从模式:在这种模式下,有一个主节点(master)和多个从节点(slave)。主节点负责处理写操作,并将数据同步到从节点,从节点负责读操作。主从模式提高了系统的可靠性和可扩展性,但仍然存在单点故障的风险,因为主节点的故障会导致服务中断。
- 哨兵模式: 哨兵模式(Sentinel)是为了解决主从模式中的单点故障问题而设计的。哨兵模式通过多个哨兵实例来监控主节点和从节点的健康状态。当主节点宕机时,哨兵会自动将一个从节点提升为主节点,并更新其他从节点的配置,确保服务的连续性。哨兵模式的优点是能够实现自动故障转移,提高系统的可用性;缺点是配置和管理相对复杂。
- 集群模式:集群模式将数据分散到多个节点上,每个节点处理一部分数据。当一个节点失效时,集群会自动将数据迁移到其他节点上,提供高可用性和扩展性。集群模式适用于大规模部署,但需要更多的服务器资源和复杂的维护12。
选择依据
选择Redis的部署方式应根据具体的应用需求和资源条件来决定:
- 小型应用或开发测试环境:单个部署简单高效,适合低延迟和高性能的需求。
- 需要高可用性和容错能力:主从模式和哨兵模式提供了较高的可用性和自动故障转移,适合对服务连续性要求较高的场景。
- 大规模部署和扩展性需求:集群模式提供了最高的可用性和扩展性,适合大规模数据处理和分布式系统。