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,请确保有适当的备份和迁移计划。
 
请在您的环境中测试这些更改,以确保它们不会影响您的应用程序。如果您有关于如何进行这些更改的具体问题,欢迎向技术支持寻求帮助。 
2024-09-04

在Java中,有多种方式可以使用Redis,最常见的方式之一是使用Jedis客户端。

以下是使用Jedis客户端连接Redis服务器的一些示例代码:

  1. 连接到Redis服务器:



import redis.clients.jedis.Jedis;
 
public class Main {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //查看服务是否运行
        System.out.println("服务正在运行: "+jedis.ping());
    }
}
  1. 存储键值对:



import redis.clients.jedis.Jedis;
 
public class Main {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        //设置 redis 字符串数据
        jedis.set("myKey", "myValue");
        // 获取存储的数据并输出
        System.out.println("redis 存储的字符串为: "+ jedis.get("myKey"));
    }
}
  1. 使用Redis的列表:



import redis.clients.jedis.Jedis;
 
public class Main {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        //使用List的push操作
        jedis.lpush("myList", "element1");
        jedis.lpush("myList", "element2");
        // 获取列表
        List<String> list = jedis.lrange("myList", 0 ,2);
        // 输出列表元素
        for(int i=0; i<list.size(); i++) {
            System.out.println("列表的第 "+i+" 个元素是: "+list.get(i));
        }
    }
}
  1. 使用Redis的集合:



import redis.clients.jedis.Jedis;
 
public class Main {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        // 添加一些元素到集合
        jedis.sadd("mySet", "member1");
        jedis.sadd("mySet", "member2");
        jedis.sadd("mySet", "member3");
        // 获取集合中的所有成员
        Set<String> set = jedis.smembers("mySet");
        // 输出集合中的成员
        for(String member: set) {
            System.out.println("集合的成员: "+ member);
        }
    }
}
  1. 使用Redis的哈希表:



import redis.clients.jedis.Jedis;
 
public class Main {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        // 添加一些元素到哈希表
        jedis.hset("myHash", "field1", "value1");
        jedis.hset
2024-09-04

在Redis中,maxmemory参数用于指定Redis最大使用的内存量。当到达这个内存使用量时,Redis将会根据maxmemory-policy参数指定的策略来决定如何处理新的写入操作。

配置maxmemory参数

redis.conf文件中配置maxmemory参数,指定最大内存使用量。例如,要设置为2GB,可以这样配置:




maxmemory 2gb

配置maxmemory-policy参数

maxmemory限制到达时,需要通过maxmemory-policy参数来指定内存达到阈值时的行为。以下是一些常用的策略:

  • noeviction: 不进行驱逐,写命令会返回错误。
  • allkeys-lru: 当内存不足以容纳更多数据时,使用最近最少使用算法进行驱逐。
  • volatile-lru: 只对设置了过期时间的键进行最近最少使用算法驱逐。
  • allkeys-random: 在内存达到限制时随机驱逐键。
  • volatile-random: 在内存达到限制时随机驱逐设置了过期时间的键。
  • volatile-ttl: 驱逐具有更早过期时间(TTL)的键。

例如,配置为LRU(最近最少使用)策略:




maxmemory-policy allkeys-lru

配置建议

  • 设置maxmemory时,应该为系统的实际可用内存量留出一些空间,以便Redis可以继续执行任务,比如执行持久化操作。
  • 根据应用程序的数据访问模式选择合适的maxmemory-policy策略。
  • 如果应用程序对响应时间敏感,可以使用allkeys-lruvolatile-lru策略。
  • 如果应用程序对数据缓存效果敏感,可以使用allkeys-random策略。
  • 在生产环境中,应该监控Redis的内存使用情况,并适时调整maxmemorymaxmemory-policy参数。

示例配置




# 设置最大内存为2GB
maxmemory 2gb

# 设置内存达到最大值时的驱逐策略为LRU
maxmemory-policy allkeys-lru

以上配置将Redis限制在2GB内存使用量,并在达到限制时使用LRU算法进行数据驱逐。

2024-09-04

Redis提供了两种持久化机制RDB(Redis DataBase)和AOF(Append Only File)。

RDB:

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

配置示例:




save 900 1      # 900秒内至少1个键被修改则触发保存
save 300 10     # 300秒内至少10个键被修改则触发保存
save 60 10000   # 60秒内至少10000个键被修改则触发保存
 
dbfilename dump.rdb                      # RDB文件名
dir /path/to/your/redis/directory        # RDB文件存储目录

AOF:

AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态。

配置示例:




appendonly yes                   # 开启AOF持久化
appendfilename "appendonly.aof"  # AOF文件名
dir /path/to/your/redis/directory        # AOF文件存储目录
 
# 同步策略
appendfsync everysec              # 每秒同步一次至磁盘
# appendfsync everysec           # 每次写命令都同步至磁盘(慢,安全)
# appendfsync no                 # 完全依赖操作系统,不同步(快,不安全)

在实际应用中,可以根据数据的重要性和性能需求选择合适的持久化方式,或者两者结合使用。

2024-09-04



# 使用mset批量设置键值对
mset key1 value1 key2 value2 key3 value3
 
# 使用pipeline减少客户端与服务器之间的往返次数
pipeline = 连接对象.pipeline()
pipeline.set('key1', 'value1')
pipeline.set('key2', 'value2')
pipeline.set('key3', 'value3')
pipeline.execute()
 
# 慢查询日志和分析
config set slowlog-log-slower-than 10000  # 设置慢查询阈值为10毫秒
config set slowlog-max-len 128  # 设置慢查询日志长度
slowlog get 5  # 获取最近的5条慢查询
 
# 内存优化
# 设置键的过期时间来管理内存
set key value EX 10  # 设置键的过期时间为10秒

以上代码演示了如何使用Redis的mset来批量设置键值对,以及如何使用pipeline来减少客户端与服务器之间的往返延迟。同时,通过设置慢查询日志和相关参数,可以监控和优化Redis的性能。最后,通过设置键的过期时间,可以有效管理Redis的内存使用。