2024-09-05

Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

Redis 中的 String 是一种最基本的数据类型,它能存储任何类型的字符串,包括二进制、JSON 等。

以下是一些基本的操作和代码示例:

  1. 设置 key-value



import redis
 
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('name', 'John')
  1. 获取 key 对应的 value



name = r.get('name')
print(name)  # 输出:b'John'
  1. 在已有的 key 对应的 value 后追加内容



r.append('name', ' Doe')
name = r.get('name')
print(name)  # 输出:b'John Doe'
  1. 获取 key 对应 value 的长度



length = r.strlen('name')
print(length)  # 输出:8
  1. 设置 key 对应的 value,如果 key 已经存在,则覆盖



r.set('name', 'Jane')
name = r.get('name')
print(name)  # 输出:b'Jane'
  1. 批量设置或获取 key-value



r.mset({'name': 'John', 'age': '25'})
result = r.mget(['name', 'age'])
print(result)  # 输出:[b'John', b'25']
  1. 获取 key 对应 value 的子串



sub_str = r.getrange('name', 0, 2)
print(sub_str)  # 输出:b'Joh'
  1. 设置 key 对应 value 的子串,若 key 不存在则创建



r.setrange('name', 1, 'm')
name = r.get('name')
print(name)  # 输出:b'Jmohn'
  1. 为 key 对应的数字值加上增量



r.set('age', '20')
r.incr('age', 1)
age = r.get('age')
print(age)  # 输出:b'21'
  1. 为 key 对应的数字值减去减量



r.decr('age', 1)
age = r.get('age')
print(age)  # 输出:b'20'
  1. 删除 key



r.delete('name')
name = r.get('name')
print(name)  # 输出:None

以上就是 Redis 中 String 类型的一些基本操作和代码示例。

2024-09-05

Redis集群是一种Redis服务器之间的网络连接,其中数据自动在多个节点之间分区。以下是Redis集群的详细操作和理论概述:

集群操作

  1. 创建集群

    使用 redis-cli 工具,可以通过 --cluster 选项创建新的Redis集群。

    
    
    
    redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 ...
  2. 检查集群

    使用 cluster infocluster nodes 命令来检查集群信息和节点状态。

    
    
    
    redis-cli cluster info
    redis-cli cluster nodes
  3. 向集群添加节点

    使用 redis-cli --cluster add-node 命令向集群添加新节点。

    
    
    
    redis-cli --cluster add-node 127.0.0.1:7003 127.0.0.1:7000
  4. 从集群中移除节点

    使用 redis-cli --cluster del-node 命令从集群中移除节点。

    
    
    
    redis-cli --cluster del-node 127.0.0.1:7003 <node-id>
  5. 重新分配集群节点槽

    使用 redis-cli --cluster reshard 命令重新分配节点槽。

    
    
    
    redis-cli --cluster reshard 127.0.0.1:7000 <node-id>

集群理论

Redis集群采用一致性哈希算法来确定数据应该存储在哪个节点上。每个节点都维护着整个集群的节点信息和数据分布。

  • 数据分区:Redis集群将所有数据分散在16384个哈希槽中,每个节点可以处理其中的一部分哈希槽。
  • 节点通信:集群中的节点通过PING-PONG机制进行通信,用以更新节点状态和确认集群的全局状态。
  • 键分配:当新的节点加入集群或者现有节点移除时,集群会重新分配哈希槽中的部分数据。
  • 故障转移:当一个主节点不能正常工作时,其从节点会自动升级为主节点继续服务。
  • 读写操作:客户端可以连接任何节点进行读操作,但写操作必须在同一个节点中进行,该节点负责同步数据到其他节点。

注意:以上操作和理论概述需要在满足Redis集群所需的环境配置和前置条件下进行。

2024-09-05

Redis 不会立即删除已过期的数据是出于性能考虑。Redis 采用惰性删除和定时删除策略来管理过期数据。

  1. 惰性删除:当客户端请求数据时,Redis 会检查键是否过期,如果已经过期,Redis 会执行删除操作。
  2. 定时删除:Redis 默认每 100 毫秒会随机抽查一些设置了过期时间的键,检查并删除其中已经过期的键。

这样做的好处是减少了删除操作带来的性能开销,确保 Redis 可以更高效地处理正常的读写请求。如果立即删除每一个过期键,可能会消耗大量的 CPU 资源,影响 Redis 的性能。因此,Redis 选择了惰性删除和定时删除这种折中的策略来管理过期数据。

2024-09-05

在部署Redis集群时,首先确保你有多个Redis节点可用,并且每个节点的配置文件中指定了不同的端口和集群配置。以下是一个基本的Redis集群部署步骤:

  1. 安装Redis并确保每个节点上的Redis版本相同。
  2. 配置每个Redis节点的redis.conf文件,设置不同的端口和集群配置。
  3. 启动每个Redis节点。
  4. 使用redis-cli创建集群。

以下是一个简单的Redis集群部署示例:




# 假设你有三个Redis节点运行在7000, 7001, 7002端口
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1

在执行上述命令时,redis-cli会提示你确认集群配置。确认后,集群将会自动分配槽和复制数据。

注意:在生产环境中,你可能需要更复杂的部署策略,例如使用负载均衡器和安全性措施。此外,集群节点应该分布在不同的物理服务器或虚拟机上以保证高可用性。

2024-09-05

要配置和启动Redis服务,你需要遵循以下步骤:

  1. 下载并安装Redis:

    • Linux: 使用包管理器,如apt-get install redis-server
    • macOS: 使用Homebrew,brew install redis
    • Windows: 下载Windows兼容版本或使用WSL。
  2. 配置Redis:

    • 默认配置文件位于/etc/redis/redis.conf(Linux)或通过brew info redis找到配置文件路径(macOS)。
    • 你可以编辑配置文件来修改默认行为,比如设置密码、改变监听端口等。
  3. 启动Redis服务:

    • 直接使用redis-server命令加上配置文件路径启动。
    • 例如:redis-server /etc/redis/redis.conf
  4. 验证Redis服务器运行:

    • 使用redis-cli ping,如果返回PONG,则表示Redis服务运行正常。

以下是一个基本的Redis配置文件示例(redis.conf):




# 绑定IP,0.0.0.0表示监听所有接口
bind 0.0.0.0
 
# 设置Redis监听的端口,默认为6379
port 6379
 
# 设置Redis以守护进程方式运行
daemonize yes
 
# 设置Redis日志文件路径
logfile "/var/log/redis/redis-server.log"
 
# 设置Redis密码
requirepass yourpassword
 
# 设置数据库数量,默认16个
databases 16

启动Redis服务时指定这个配置文件:




redis-server /path/to/your/redis.conf

验证Redis服务运行状态:




redis-cli ping

如果返回PONG,则表示Redis服务正常运行。

2024-09-05

报错解释:

MISCONF 错误是 Redis 在尝试执行自动快照保存(RDB持久化)时遇到问题时返回的错误。具体来说,这个错误表明 Redis 配置了自动快照保存功能,但由于某些原因,当前 Redis 实例不能进行保存。

可能的原因包括:

  1. 磁盘空间不足,无法创建快照文件。
  2. 没有足够的权限写入快照到指定的目录。
  3. 快照文件超过了配置的 stop-writes-on-bgsave-error 的时间阈值。
  4. Redis 配置问题,比如 dir 配置错误,或 rdb 文件名配置有误。

解决方法:

  1. 检查磁盘空间,确保有足够的空间用于快照文件。
  2. 检查 Redis 快照目录的权限,确保 Redis 进程有权限写入该目录。
  3. 检查 Redis 的日志文件,了解为何 Redis 不能进行快照保存,根据具体错误信息进行调整。
  4. 检查 Redis 配置文件,确保 dirdbfilename 配置正确无误。
  5. 如果问题由于快照文件保存失败导致,可以尝试手动执行 SAVEBGSAVE 命令来尝试创建快照。
  6. 如果问题持续存在,可能需要考虑暂时关闭快照保存功能,或者调整快照保存策略。
2024-09-05

在Redis中,有序集合(zset)是一种数据类型,它不仅存储元素,而且还将每个元素关联到一个分数(score)。zset中的元素是唯一的,但分数可以重复。

如果你想要实现一个排行榜,其中分数相同的情况下按照时间顺序排序,你可以使用两个分数:一个是用户的分数,另一个是时间戳。时间戳可以作为第二个分数,这样就可以在分数相同时根据时间戳的先后进行排序。

以下是一个使用Redis的zset实现排行榜,其中分数相同时按照时间顺序排序的例子:




import redis
import time
 
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 添加排行榜分数,其中分数是用户的分数,时间戳作为第二分数
user_score = 100
timestamp = int(time.time())
 
# 添加到zset,分数是用户分数,第二分数是时间戳
r.zadd('leaderboard', {f'user_{user_score}_{timestamp}': (user_score, timestamp)})
 
# 获取排行榜前10名
leaderboard_top10 = r.zrevrange('leaderboard', 0, 9, withscores=True)
 
print(leaderboard_top10)

在这个例子中,我们使用了一个叫做leaderboard的有序集合。每个成员的名字是用户ID加上时间戳来保证唯一性,分数是用户的分数。当你想要获取排行榜时,你可以使用ZREVRANGE命令来获取分数最高的前10名用户,因为这个命令会按照分数从高到低的顺序返回结果。

请注意,这只是一个简单的例子,实际应用中你可能需要更复杂的逻辑来处理时间戳,例如确保在分数相同的情况下时间戳是第二关键字,而不是第一关键字,因为zset会同时按照分数和第二分数排序。

2024-09-05

缓存雪崩:

指在同一时段大量的缓存失效,导致数据查询直接打到数据库,可能会使数据库崩溃。

解决方法:

  1. 使用互斥锁控制缓存失效时间分散。
  2. 设置缓存数据的过期时间时,加上一个随机因子,避免集体过期。
  3. 如果缓存数据需要更新,可以使用异步更新策略,避免大量并发直接打到数据库。

缓存穿透:

指查询不存在的数据,缓存中没有数据,每次都会打到数据库。

解决方法:

  1. 使用布隆过滤器,先检查数据是否存在。
  2. 如果查询参数非法或者不合法,直接返回错误信息。
  3. 缓存空对象,防止未来相同的查询再次打到数据库。

缓存预热:

系统启动前,将相关缓存数据预先加载到缓存系统。

解决方法:

  1. 手动预加载。
  2. 在系统启动时自动执行预热操作。

缓存更新:

解决方法:

  1. 主动更新:数据变更时,直接更新缓存。
  2. 定时更新:使用定时任务更新缓存数据。

缓存降级:

系统负载过高时,为了保证系统稳定性,可以选择降级部分服务。

解决方法:

  1. 根据负载情况,动态降级缓存服务。
  2. 提供备用缓存策略,如使用本地缓存或文件缓存。

注意:具体解决方案可能需要根据实际业务场景进行调整。

2024-09-05

Redis提供了两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。

RDB 配置

在redis.conf文件中找到以下配置项并进行相应设置:




# 是否开启RDB
save "时间间隔" "写操作次数"
# 例如:900秒后如果有1次写操作,则触发BGSAVE命令
save 900 1
# BGSAVE出错时是否继续提供写服务
stop-writes-on-bgsave-error yes
# RDB文件名
dbfilename dump.rdb
# RDB文件和AOF文件存放路径
dir /path/to/your/redis/directory

AOF 配置

在redis.conf文件中找到以下配置项并进行相应设置:




# 是否开启AOF
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# AOF文件的更新频率
appendfsync everysec
# 是否在AOF重写期间同步
no-appendfsync-on-rewrite no
# AOF文件大小超过此值时触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小达到此大小才可重写
auto-aof-rewrite-min-size 64mb

注意:在实际生产环境中,通常会同时使用RDB和AOF两种持久化方式,以此来保证数据的持久性和可恢复性。

2024-09-05



import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
 
@SpringBootApplication
public class RedisLettuceApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(RedisLettuceApplication.class, args);
    }
 
    // 使用LettuceConnectionFactory配置RedisConnectionFactory
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
 
    // 使用RedisTemplate<String, Object>配置RedisTemplate
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
 
    // 使用StringRedisTemplate配置StringRedisTemplate
    @Bean
    public StringRedisTemplate stringRedisTemplate() {
        final StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

这段代码演示了如何在Spring Boot应用程序中配置Lettuce作为Redis连接库。它定义了一个LettuceConnectionFactory Bean,并且还提供了RedisTemplate和StringRedisTemplate的配置,这些模板可以用于操作Redis数据库。