2024-09-04



import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.serializer.StringRedisSerializer;
 
@Configuration
public class RedisConfig {
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(lettuceConnectionFactory);
 
        // 设置键序列化器为StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        // 设置值序列化器为Jackson2JsonRedisSerializer
        template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
 
        // 初始化RedisTemplate
        template.afterPropertiesSet();
 
        return template;
    }
}

这段代码定义了一个配置类RedisConfig,其中创建了一个自定义的RedisTemplate bean,键和值都采用了StringRedisSerializerJackson2JsonRedisSerializer。这样可以避免存储到Redis中的数据出现乱码问题。在实际使用时,需要确保Object.class是你要序列化的具体类,否则可能会导致序列化异常。

2024-09-04

在Spring Boot中使用Redis进行会话管理,你可以使用Spring Session for Redis。以下是一个简单的例子:

  1. 添加依赖到你的pom.xml



<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
</dependencies>
  1. 配置application.propertiesapplication.yml以连接到Redis服务器:



# application.properties
spring.redis.host=localhost
spring.redis.port=6379
  1. 在Spring Boot应用中使用Redis进行会话管理:



import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
 
@Configuration
@EnableRedisHttpSession // 启用Redis作为HTTP会话存储
public class RedisSessionConfig {
}

现在,Spring Boot应用会自动使用Redis来管理HTTP会话。你可以像处理普通的HTTP会话那样使用HttpSession,Spring会自动将其存储在Redis中。

例如,设置和获取session属性:




import javax.servlet.http.HttpSession;
 
@RestController
public class SessionController {
 
    @GetMapping("/setSession")
    public String setSession(HttpSession session) {
        session.setAttribute("key", "value");
        return "Session attribute set";
    }
 
    @GetMapping("/getSession")
    public String getSession(HttpSession session) {
        return (String) session.getAttribute("key");
    }
}

访问/setSession将在会话中设置一个属性,访问/getSession将获取该属性并返回。所有会话数据都将存储在Redis中,并且可以在不同的应用服务器实例之间共享。

2024-09-04

在Zabbix中,如果你更改了Redis的监听端口,Zabbix自动发现功能和预定义的监控项可能会失败,因为它们可能仍然尝试使用默认的端口(通常是6379)进行连接。为了确保Zabbix能够探测到新的端口,你需要做以下几步:

  1. 确保Redis配置文件中的端口设置正确,并且Redis服务已经重启以应用新的配置。
  2. 在Zabbix agent配置文件(通常是zabbix_agentd.conf)中,更新或添加一个UserParameter,以便能够自定义连接到Redis的命令。例如,如果你的新端口是6380,你可以添加如下配置:



UserParameter=redis.ping[*],/usr/bin/redis-cli -h $1 -p $2 ping
  1. 在Zabbix前端,更新相关的监控项和触发器,使用新的端口号。
  2. 清除Zabbix服务器的缓存,并重启Zabbix agent服务。
  3. 确认Zabbix能够正确探测新端口上的Redis服务。

请注意,如果你使用的是Zabbix的自动发现功能,你可能还需要调整相关的发现规则,以确保它们能够找到正确的端口。这通常涉及到编辑Zabbix前端中相应的自动发现规则或者模板。

2024-09-04



# 备份Redis数据到dump.rdb文件
redis-cli bgsave

# 备份Redis数据到指定文件,如mybackup.rdb
redis-cli bgsave /path/to/mybackup.rdb

# 恢复Redis数据
redis-cli restore mykey dump.rdb

# 恢复Redis数据到指定的RDB文件,如mybackup.rdb
redis-cli restore mykey /path/to/mybackup.rdb

# 如果需要从备份中恢复数据到运行中的Redis服务器,可以直接将RDB文件复制到Redis的工作目录,并重命名为dump.rdb
cp /path/to/mybackup.rdb /var/lib/redis/dump.rdb

# 确保文件权限正确,Redis用户需要有读权限
chown redis:redis /var/lib/redis/dump.rdb

# 重启Redis服务以应用新的RDB文件
service redis restart

以上脚本提供了使用redis-cli工具进行Redis数据的备份和恢复的基本命令。备份操作会创建一个dump文件,恢复操作会将dump文件中的数据恢复到Redis实例中。注意,在实际操作中,备份和恢复的步骤可能需要根据实际环境和配置进行相应的调整。

2024-09-04

在Linux上操作Redis,你可以使用命令行界面。以下是一些基本的命令和操作示例:

  1. 安装Redis:



sudo apt-get update
sudo apt-get install redis-server
  1. 启动Redis服务:



sudo service redis-server start
  1. 停止Redis服务:



sudo service redis-server stop
  1. 使用redis-cli连接到Redis服务器:



redis-cli
  1. redis-cli中设置键值对:



SET key value
  1. redis-cli中获取键对应的值:



GET key
  1. 使用脚本启动Redis服务器:



redis-server /etc/redis/redis.conf
  1. 查看Redis服务状态:



sudo service redis-server status
  1. 使用redis-cli关闭Redis服务器:



redis-cli shutdown
  1. 使用redis-cli检查Redis服务器的运行信息:



redis-cli info

这些命令和操作是在Linux环境下操作Redis的基本方法。你可以根据需要使用更复杂的Redis命令和特性。

2024-09-04

RDB(Redis DataBase)是Redis默认的持久化方式,在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshotting。

配置示例:




save 900 1      # 900秒内至少1个键被修改则触发保存
save 300 10     # 300秒内至少10个键被修改则触发保存
save 60 10000   # 60秒内至少10000个键被修改则触发保存

AOF(Append Only File)是另一种持久化机制,它会在执行写命令时,将命令追加到文件的末尾。

配置示例:




appendonly yes       # 开启AOF持久化
appendfsync everysec # 每秒同步一次至磁盘

RDB和AOF的对比:

RDB是间隔性的数据快照,可能会丢失最后一次快照后的数据。AOF记录每次写操作,数据Persistence更强,但文件大小会比RDB大。

选择哪种持久化方式取决于你的需求,如果对数据完整性要求高,频繁写入,且不希望有大的性能影响,选择RDB可能更合适。如果希望数据完整性和持久化能力都很高,且对性能影响较小,可以两者结合使用。

2024-09-04

以下是一个简化的例子,展示了如何在Spring Boot 3和Spring Security 6中使用JWT和Redis实现登录和令牌身份验证。




// SecurityConfig.java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Autowired
    private AuthenticationEntryPoint authenticationEntryPoint;
 
    @Autowired
    private UserDetailsService userDetailsService;
 
    @Autowired
    private JwtAuthenticationFilter jwtAuthenticationFilter;
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }
 
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors()
            .and()
            .csrf().disable()
            .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/api/v1/auth/login").permitAll()
            .anyRequest().authenticated();
 
        http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
    }
}
 
// JwtAuthenticationFilter.java
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
 
    private final AuthenticationManager authenticationManager;
    private final JwtTokenProvider jwtTokenProvider;
 
    public JwtAuthenticationFilter(AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider) {
        this.authenticationManager = authenticationManager;
        this.jwtTokenProvider = jwtTokenProvider;
        this.setPostOnly(true);
    }
 
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request,
                                                HttpServletResponse response) throws AuthenticationException {
        UsernamePasswordAuthenticationToken authenticationToken = getAuthentication(request);
        return authenticationManager.authenticate(authentication
2024-09-04



import redis
 
# 连接到Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 使用XADD添加消息到流中
stream_key = 'mystream'
message_id = r.xadd(stream_key, {'message': 'Hello, Redis Streams!'})
print(f"添加的消息ID: {message_id}")
 
# 使用XREAD读取流中的消息
consumer_group_name = 'mygroup'
messages = r.xread({stream_key: 0}, count=1, block=0)
for stream_message in messages:
    stream_key, messages_in_stream = stream_message
    for message_id, message in messages_in_stream:
        print(f"消息ID: {message_id}, 内容: {message}")
 
# 使用XACK确认消息已被消费
message_id_to_ack = message_id  # 假设我们要确认的是上面添加的消息
r.xack(stream_key, consumer_group_name, message_id_to_ack)
 
# 使用XDEL删除流中的消息
message_id_to_delete = message_id  # 假设我们要删除的是上面添加的消息
r.xdel(stream_key, message_id_to_delete)

这段代码展示了如何使用Python的redis模块与Redis服务器交互,执行基本的Stream数据结构操作。代码中包含了添加消息到流、读取消息、确认消息已消费以及删除消息的例子。

2024-09-04

哨兵模式(Sentinel)是Redis的一个高可用解决方案,它由一个或多个哨兵(Sentinel)实例组成,这些实例会监控主服务器和其从服务器,并在主服务器下线时自动进行故障转移。

以下是一个基本的哨兵配置文件示例:




# sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

解释:

  • sentinel monitor mymaster: 这行指定了哨兵监控的主服务器名称和地址,最后的数字表示最少有几个哨兵同意下线时才会进行故障转移。
  • sentinel down-after-milliseconds: 如果一个服务器在指定的毫秒数内没有响应,则认为它是下线的。
  • sentinel parallel-syncs: 在故障转移期间,可以有几个从服务器同时进行同步。
  • sentinel failover-timeout: 故障转移超时时间,超过这个时间如果没有完成故障转移就会认为故障转移失败。

启动哨兵的命令:




redis-sentinel /path/to/sentinel.conf

在实际应用中,哨兵模式通常与主从模式配合使用,以保障Redis的高可用性。当主服务器出现故障时,哨兵会自动进行故障转移,选举新的主服务器,并将其他的从服务器指向新的主服务器。

2024-09-04



重要通知:
自2023年4月1日起,由Redis Labs提供的Redis云供应商商业版本将不再提供免费许可证。
 
如果您正在使用Redis Labs提供的商业版本,您需要迁移到其他解决方案,以避免中断。
 
迁移建议:
1. 考虑使用开源Redis版本,例如由Red Hat提供的Red Hat Redis或其他合适的开源替代品。
2. 如果需要商业支持和更高级的功能,可以考虑转向云厂商提供的商业版Redis服务,或者使用Redis Labs提供的付费服务。
3. 检查您的使用情况,如果您在生产环境中使用Redis,请确保有适当的备份和迁移计划。
 
请在您的环境中测试这些更改,以确保它们不会影响您的应用程序。如果您有关于如何进行这些更改的具体问题,欢迎向技术支持寻求帮助。