2024-08-27



import com.lambdaworks.redis.RedisClient;
import com.lambdaworks.redis.RedisURI;
import com.lambdaworks.redis.api.sync.RedisCommands;
import com.lambdaworks.redis.pubsub.api.async.RedisAsyncCommands;
import com.lambdaworks.redis.pubsub.events.MessageListener;
import com.lambdaworks.redis.resource.ClientResources;
 
public class RedissonQueueExample {
    public static void main(String[] args) {
        // 创建RedisClient和RedisConnection
        RedisClient redisClient = RedisClient.create(RedisURI.create("redis://127.0.0.1:6379"));
        RedisAsyncCommands<String, String> asyncCommands = redisClient.connect().async();
        ClientResources clientResources = ClientResources.create();
 
        // 创建Redisson的RQueue对象
        RQueue<String> queue = redisson.create(clientResources).getQueue("myQueue");
 
        // 添加消息监听器
        queue.addListener(String.class, new MessageListener<String>() {
            @Override
            public void onMessage(String message, long replyIndex) {
                System.out.println("Received message: " + message);
            }
        });
 
        // 异步发布消息
        asyncCommands.publish("myQueue", "Hello, Redisson!");
 
        // 关闭连接
        asyncCommands.close();
        redisClient.shutdown();
    }
}

这个例子展示了如何使用Redisson的RQueue来监听一个Redis队列的消息。我们首先创建了RedisClient和RedisConnection,然后通过Redisson的create方法创建RQueue对象。我们为这个队列添加了一个监听器,当有消息发送到队列时,监听器会异步接收到消息并打印出来。最后,我们通过Redis的发布/订阅功能发送一条消息到队列中,并在结束时关闭客户端连接。

2024-08-27



from flask import Flask
from flask_redis import FlaskRedis
 
app = Flask(__name__)
app.config['REDIS_URL'] = 'redis://localhost:6379/0'
 
redis_client = FlaskRedis()
redis_client.init_app(app)
 
@app.route('/')
def index():
    # 设置键值对
    redis_client.set('greeting', 'Hello, Redis!')
    # 获取键的值
    greeting = redis_client.get('greeting')
    return greeting.decode('utf-8') if greeting else 'Greeting not found'
 
if __name__ == '__main__':
    app.run()

这段代码演示了如何在Flask应用中使用Flask-Redis扩展来高效地使用Redis。首先,我们创建了一个Flask实例,并设置了连接到Redis的URL。然后,我们初始化了Flask-Redis扩展,并将其与我们的应用相关联。在路由/中,我们演示了如何使用Redis客户端来存储和检索键值对。

2024-08-27

在Java中使用Redis作为缓存,你可以使用Jedis库。以下是一个简单的工具类示例,用于连接Redis服务器并执行基本操作:




import redis.clients.jedis.Jedis;
 
public class RedisCacheUtil {
    private static final String HOST = "localhost";
    private static final int PORT = 6379;
 
    public static Jedis getRedisConnection() {
        return new Jedis(HOST, PORT);
    }
 
    public static String get(String key) {
        try (Jedis jedis = getRedisConnection()) {
            return jedis.get(key);
        }
    }
 
    public static void set(String key, String value) {
        try (Jedis jedis = getRedisConnection()) {
            jedis.set(key, value);
        }
    }
 
    public static void del(String key) {
        try (Jedis jedis = getRedisConnection()) {
            jedis.del(key);
        }
    }
}

使用方法:




public class RedisExample {
    public static void main(String[] args) {
        // 设置缓存
        RedisCacheUtil.set("myKey", "myValue");
 
        // 获取缓存
        String value = RedisCacheUtil.get("myKey");
        System.out.println(value); // 输出: myValue
 
        // 删除缓存
        RedisCacheUtil.del("myKey");
    }
}

确保你已经将Jedis库作为依赖项添加到你的项目中。如果你使用的是Maven,可以在pom.xml中添加如下依赖:




<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>最新版本号</version>
</dependency>

请替换最新版本号为Jedis的最新版本。

2024-08-27

Redis的淘汰策略主要是指当内存达到最大配置时(maxmemory),Redis如何选择哪些数据淘汰以释放内存。

Redis提供了以下几种淘汰策略:

  1. noeviction: 不进行淘汰,当内存不足时,新写入操作会报错。
  2. allkeys-random: 在内存达到最大限制时,随机淘汰键。
  3. volatile-random: 在使用了expire的键中,随机淘汰。
  4. allkeys-lru: 在内存达到最大限制时,基于最少最近使用算法(LRU)淘汰键。
  5. volatile-lru: 在使用了expire的键中,基于最少最近使用算法(LRU)淘汰键。
  6. allkeys-lfu: 在内存达到最大限制时,基于最少频繁使用(LFU)算法淘汰键。
  7. volatile-lfu: 在使用了expire的键中,基于最少频繁使用(LFU)算法淘汰键。

在配置文件中设置淘汰策略:




maxmemory-policy allkeys-lru

在Redis命令行中设置淘汰策略:




CONFIG SET maxmemory-policy allkeys-lru

实际应用中,选择合适的淘汰策略取决于应用的需求和数据的重要性。例如,如果希望保证热点数据不被淘汰,可以选择LRU或LFU策略;如果希望新数据总是可用,可以选择随机淘汰(random)策略。

2024-08-27



public class RDelayedQueueUsageExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建Redisson实例
        RedissonClient redisson = Redisson.create();
 
        // 获取延迟队列RDelayedQueue对象
        RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue();
 
        // 创建一个延迟任务(例如5秒后执行)
        delayedQueue.offer("message-1", 5, TimeUnit.SECONDS);
 
        // 创建一个延迟任务并指定执行时间点(Date类型)
        Date futureDate = new Date(System.currentTimeMillis() + 5000);
        delayedQueue.offer("message-2", futureDate);
 
        // 创建一个延迟消费者(监听器)
        delayedQueue.addListener(new MessageListener<String>() {
            @Override
            public void onMessage(String message, long delay) {
                // 处理消息
                System.out.println("Process delayed message: " + message);
            }
        });
 
        // 延迟消费者将会在消息到达时自动处理,此处主线程休眠以等待消息处理
        Thread.sleep(10000);
 
        // 关闭Redisson客户端
        redisson.shutdown();
    }
}

这段代码展示了如何使用Redisson提供的RDelayedQueue来处理延迟消息。它创建了一个Redisson客户端,获取了一个RDelayedQueue对象,并向队列中添加了两个延迟任务。然后,它添加了一个监听器来处理这些任务,并在主线程中等待一段时间以便可以看到消息的处理结果。最后,它关闭了Redisson客户端。这个例子简单直观地展示了如何使用Redisson的RDelayedQueue来进行延迟消息处理。

2024-08-27



# Redis 配置文件示例
 
# 设置Redis监听的IP地址,如果要监听所有地址,可以使用0.0.0.0
bind 127.0.0.1
 
# 设置Redis服务的监听端口,默认为6379
port 6379
 
# 设置Redis是否以守护进程方式运行
daemonize no
 
# 设置Redis的日志文件路径
logfile "/var/log/redis/redis-server.log"
 
# 设置Redis数据库的数量,默认16个数据库(db0...db15)
databases 16
 
# 设置Redis密码,如果配置了密码,客户端连接时需要使用AUTH命令进行认证
requirepass yourpassword
 
# 设置Redis最大内存容量,达到最大内存后,会使用allkeys-lru或volatile-lru策略进行数据淘汰
maxmemory 2gb
 
# 设置内存淘汰策略,当达到maxmemory时使用的策略
maxmemory-policy allkeys-lru
 
# 设置是否开启虚拟内存机制,需要vm-enabled yes配合使用
vm-enabled no
 
# 设置swap文件路径
dir /var/spool/redis
 
# 设置是否在每次后台I/O操作后进行日志记录,如RDB/AOF
appendonly no
 
# 设置AOF文件的更新频率
appendfsync everysec
 
# 设置客户端空闲超时时间,0表示禁用空闲连接超时
timeout 300
 
# 设置是否启用TCP keepalive,可以防止死链接
tcp-keepalive 0
 
# 设置Redis连接数的最大客户端数,返回错误当达到这个数值
maxclients 10000
 
# 设置Redis集群配置参数,如果不使用集群可以忽略
cluster-enabled no
cluster-config-file nodes.conf
cluster-node-timeout 5000
 
# 设置Redis的高级配置参数,如RDB保存点,大Key检测等
save 900 1
save 300 10
save 60 10000
 
# 设置检测大键的阈值,超过这个值会报告为大Key
large-key-threshold 10
 
# 设置是否记录慢查询,并可以配置慢查询的阈值
slowlog-log-slower-than 10000
slowlog-max-len 128
 
# 设置Redis的PID文件路径
pidfile /var/run/redis/redis-server.pid
 
# 设置Redis的主从复制配置
slaveof <masterip> <masterport>

这个配置文件提供了基本的Redis配置选项,包括监听地址、端口、日志文件、数据库数量、密码、内存大小、虚拟内存、磁盘持久化策略、连接超时、集群配置、保存点和慢查询日志配置等。开发者可以根据自己的需求进行相应的调整。

2024-08-27

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

  1. RDB 持久化:

    RDB 是 Redis 默认的持久化方式。它会在一定的间隔时间内将内存中的数据集快照写入磁盘,生成一个dump.rdb文件。

    配置文件中的关键配置项:

    
    
    
    save 900 1        # 900秒内至少1个键被修改则触发保存
    save 300 10       # 300秒内至少10个键被修改则触发保存
    save 60 10000     # 60秒内至少10000个键被修改则触发保存
    dbfilename dump.rdb          # RDB文件名
    dir ./                        # RDB文件存储目录
  2. AOF 持久化:

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

    配置文件中的关键配置项:

    
    
    
    appendonly yes          # 开启AOF持久化存储
    appendfilename "appendonly.aof"  # AOF文件名
    appendfsync everysec    # 每秒同步一次至磁盘

在实际应用中,可以根据数据的重要性和性能需求选择合适的持久化方式,或者两者结合使用。如果需要快速恢复数据,可以使用 RDB 文件。如果需要保证数据的完整性,可以使用 AOF 方式。

2024-08-27

AOF(Append Only File)是Redis的另一种持久化方式,用于记录每一个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只允许追加不允许改写,重启时重新执行AOF文件中的命令达到数据恢复的目的。

AOF文件大小会一直增大,为了解决这个问题,Redis引入了AOF文件重写机制。当AOF文件的大小超过了配置的阈值时,Redis会自动启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

AOF文件重写的主要目的是为了减少AOF文件的大小,提高磁盘效率。

以下是AOF文件重写的伪代码:




def rewriteAof():
    # 创建临时文件
    temp_file = create_temp_file()
    
    # 遍历现有的所有键
    for key in db.keys():
        # 对每个键取值
        value = db.get(key)
        # 将键值对写入临时文件
        temp_file.write(key, value)
    
    # 替换原有的AOF文件
    replace_aof_file(temp_file)

在Redis中,AOF文件重写是通过bgrewriteaof命令触发的。当AOF文件的大小超过了配置的阈值时,Redis会在后台自动执行AOF文件的重写操作。如果手动执行该命令,Redis会创建一个新的AOF文件,只包含当前数据库状态所必需的最小指令集。这样可以显著减小AOF文件的大小,加快数据恢复的速度。

2024-08-27



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
 
@Service
public class RedisService {
 
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 
    public void setKey(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }
 
    public String getKey(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }
 
    public void deleteKey(String key) {
        stringRedisTemplate.delete(key);
    }
}

这段代码展示了如何在Spring Boot 3项目中使用StringRedisTemplate来进行基本的Redis操作,包括设置键值对、获取键对应的值以及删除键。这是一个简单的服务类,可以被其他组件注入并使用。

2024-08-27

清空 Redis 的 LIST 有多种实现方法,以下是几种不同的方式:

方法一:使用 DEL 命令删除 LIST




redis_conn = redis.Redis(host='localhost', port=6379)
redis_conn.delete('my_list')

方法二:使用 LTRIM 命令重新赋值一个空的 LIST




redis_conn = redis.Redis(host='localhost', port=6379)
redis_conn.ltrim('my_list', 1, 0)

方法三:使用 RPUSHX 命令将空列表写入 LIST




redis_conn = redis.Redis(host='localhost', port=6379)
redis_conn.rpushx('my_list', [])

方法四:使用 LPUSH、RPOP 或 LTRIM 结合循环删除 LIST 中的元素




redis_conn = redis.Redis(host='localhost', port=6379)
while redis_conn.llen('my_list') > 0:
    redis_conn.rpop('my_list')

以上是几种不同的方法来清空 Redis 的 LIST,可以根据具体情况选择适应的方式。