2024-09-04

Redis是一种开源的内存中数据结构存储系统,可以用作数据库、缓存和消息中间件。以下是一些Redis的快速入门示例。

安装Redis

在大多数Linux发行版上,可以使用包管理器来安装Redis:




# For Ubuntu/Debian
sudo apt-get install redis-server
 
# For CentOS/RHEL
sudo yum install redis

启动Redis服务




redis-server

连接到Redis服务器




redis-cli

Redis数据类型

Redis支持五种数据类型:字符串(String), 列表(List), 集合(Set), 散列(Hash) 和 有序集合(Sorted Set)。

字符串




# 设置键值
SET key value
 
# 获取键值
GET key

列表




# 在列表左侧插入元素
LPUSH list-key value
 
# 在列表右侧插入元素
RPUSH list-key value
 
# 获取列表所有元素
LRANGE list-key 0 -1

集合




# 添加元素到集合
SADD set-key member
 
# 获取集合所有成员
SMEMBERS set-key

散列




# 设置散列字段
HSET hash-key field value
 
# 获取散列字段值
HGET hash-key field

有序集合




# 添加成员及其分数到有序集合
ZADD sorted-set-key score member
 
# 获取有序集合成员及分数
ZRANGE sorted-set-key 0 -1 WITHSCORES

Redis 事务

Redis事务可以一起执行多个命令,它可以确保命令的原子性。




# 开启事务
MULTI
 
# 将命令加入事务
SADD set-key member1
SADD set-key member2
 
# 执行事务
EXEC

Redis发布/订阅

Redis的发布/订阅机制允许客户端订阅频道,并接收发送到该频道的消息。




# 订阅频道
SUBSCRIBE channel-key
 
# 向频道发布消息
PUBLISH channel-key message

Redis持久化

Redis支持两种持久化方式:RDB(默认)和AOF。




# 手动触发RDB持久化
SAVE
 
# 设置自动持久化规则
CONFIGRWRITECONF

Redis主从复制

Redis主从复制可以实现数据的多个副本。




# 配置从服务器
SLAVEOF host port

Redis的使用场景

  • 缓存系统
  • 排行榜/计数器
  • 消息队列
  • 分布式锁
  • 会话共享
  • 配置共享

Redis客户端

在Python中,可以使用redis-py库来操作Redis。




import redis
 
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 设置键值
r.set('key', 'value')
 
# 获取键值
value = r.get('key')
print(value)

以上是Redis的快速入门示例,详细的使用方法和参数可以参考Redis官方文档。

2024-09-04



import scrapy
from scrapy_redis.spiders import RedisSpider
 
class MySpider(RedisSpider):
    name = 'myspider'
    redis_key = 'myspider:start_urls'
 
    def parse(self, response):
        # 解析响应内容的逻辑
        pass
 
    def closed(self, reason):
        # 当爬虫关闭时需要做的清理工作
        super().closed(reason)
        print(f"Spider {self.name} closed for reason: {reason}")

这个简单的爬虫示例展示了如何使用scrapy_redis库创建一个名为MySpider的Redis爬虫。这个爬虫从myspider:start_urls键中读取起始URL,并在解析每个响应时定义一个parse方法来处理数据提取。当爬虫关闭时,closed方法被调用,并打印关闭的原因。这个例子演示了如何使用scrapy_redis库进行分布式爬取,并且提供了一个简单的模板,方便开发者进行实际项目的爬虫开发。

2024-09-04



#include <stdio.h>
#include <stdlib.h>
#include <hiredis/hiredis.h>
 
int main(int argc, char **argv) {
    // 连接到Redis服务器
    const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1";
    int port = (argc > 2) ? atoi(argv[2]) : 6379;
    redisContext *c = redisConnect(hostname, port);
    if (c == NULL || c->err) {
        if (c) {
            printf("Connection error: %s\n", c->errstr);
            redisFree(c);
        } else {
            printf("Connection error: can't allocate redis context\n");
        }
        exit(1);
    }
 
    // 使用ACL命令添加用户
    redisReply *reply = redisCommand(c, "ACL SETUSER newuser on >mypassword ~*:*");
    if (reply->type == REDIS_REPLY_ERROR) {
        printf("Error: %s\n", reply->str);
    } else {
        printf("User added successfully\n");
    }
    freeReplyObject(reply);
 
    // 列出所有用户
    reply = redisCommand(c, "ACL LIST");
    if (reply->type == REDIS_REPLY_ERROR) {
        printf("Error: %s\n", reply->str);
    } else if (reply->type == REDIS_REPLY_ARRAY) {
        printf("Number of users: %ld\n", reply->elements);
        for (int i = 0; i < reply->elements; i++) {
            printf("User %d: %s\n", i, reply->element[i]->str);
        }
    }
    freeReplyObject(reply);
 
    // 删除用户
    reply = redisCommand(c, "ACL SETUSER newuser on >mypassword ~*:*");
    if (reply->type == REDIS_REPLY_ERROR) {
        printf("Error: %s\n", reply->str);
    } else {
        printf("User deleted successfully\n");
    }
    freeReplyObject(reply);
 
    // 关闭连接
    redisFree(c);
    return 0;
}

这段代码展示了如何使用Redis的ACL命令来添加、列出和删除用户。注意,实际应用中需要处理内存分配失败的情况,并且在生产环境中应该使用合适的错误处理和资源管理策略。

2024-09-04

Memcached和Redis都是高性能的key-value存储系统,但它们有一些关键的区别:

  1. 数据类型:

    • Memcached:仅支持简单的字符串。
    • Redis:除了字符串,还支持更丰富的数据类型(列表,集合,有序集合,哈希表)以及不同种类的数据结构(如流,位图,超日志)。
  2. 持久化:

    • Memcached:不支持持久化。
    • Redis:支持两种持久化方式:RDB快照和AOF日志。
  3. 内存管理:

    • Memcached:使用LRU(最近最少使用)算法。
    • Redis:提供更多内存管理选项,如:allkeys-lru,volatile-lru,allkeys-random,volatile-random等,并支持内存数据集大小上限。
  4. 性能:

    • Memcached:设计简单,更轻量级。
    • Redis:支持更复杂的数据结构和更丰富的功能,在某些场景下性能更高,但也更消耗资源。
  5. 分布式支持:

    • Memcached:需要结合其他分布式解决方案。
    • Redis:原生支持分布式存储。
  6. 事务支持:

    • Memcached:不支持事务。
    • Redis:支持MULTI/EXEC事务。
  7. 安全性:

    • Memcached:无内置安全措施。
    • Redis:支持通过配置文件或命令设置密码访问,提供了更好的安全性。
  8. 分析工具:

    • Memcached:需要第三方工具。
    • Redis:提供monitor命令,clients命令等用于分析问题。
  9. 代码示例:

    • Memcached通常使用Python的pylibmcmemcache库,而Redis可以使用Python的redis-py库。

在选择Memcached还是Redis时,需要考虑应用程序的具体需求,如数据类型支持、持久化需求、性能要求、分布式支持、安全性等。

2024-09-04

Redis 集群是一种Redis服务器之间的网络连接,其中数据自动在多个节点之间分区。Redis集群的主要目标是提供一种方式,可以在不中断应用程序的情况下扩展Redis的数据库容量和处理能力。

Redis集群的工作原理涉及数据分片、节点通信、故障转移和负载均衡等关键技术。

  1. 数据分片:Redis集群将数据分布在不同的节点上,每个节点负责维护一部分数据。
  2. 节点通信:集群中的节点相互通信,确保节点状态的一致性。
  3. 故障转移:当一个节点不可达时,其负责的数据分片将被其他节点接管。
  4. 负载均衡:新的节点加入或者某个节点失效,集群会重新分配负载。

以下是一个简单的Redis集群设置示例:




# 假设你已经有了三个运行中的Redis节点,在端口7000、7001和7002

# 使用Redis Cluster命令创建一个包含三个主节点的集群
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1

# 上述命令将创建一个具有三个主节点和一个副本的集群
# --cluster-replicas 1 表示每个主节点都会有一个副本节点

在实际应用中,你可能需要配置更多参数,例如集群节点的配置文件、网络设置、集群节点间的通信端口等。

记住,Redis集群并不是万能的,它也有其局限性,例如不支持并发写操作,因此在设计应用程序时需要考虑这些因素。

2024-09-04



#!/bin/bash
# 设置Redis Cluster节点数量
NODES=3
# 设置Redis Cluster每个节点的端口号起始值
PORT_START=7000
# 设置Redis Cluster配置文件的基本路径
CONF_PATH=/path/to/redis-cluster/conf
# 设置Redis Cluster数据文件的基本路径
DATA_PATH=/path/to/redis-cluster/data
# 设置Redis Cluster日志文件的基本路径
LOG_PATH=/path/to/redis-cluster/log
 
# 创建配置文件和数据目录,并设置权限
for port in `seq $PORT_START $(($PORT_START+$NODES-1))`
do
    mkdir -p ${CONF_PATH}/${port}
    mkdir -p ${DATA_PATH}/${port}
    mkdir -p ${LOG_PATH}/${port}
    echo "port ${port}" > ${CONF_PATH}/${port}/redis.conf
    echo "dir ${DATA_PATH}/${port}" >> ${CONF_PATH}/${port}/redis.conf
    echo "logfile ${LOG_PATH}/${port}/redis.log" >> ${CONF_PATH}/${port}/redis.conf
    echo "cluster-enabled yes" >> ${CONF_PATH}/${port}/redis.conf
    echo "cluster-config-file nodes-${port}.conf" >> ${CONF_PATH}/${port}/redis.conf
    echo "cluster-node-timeout 5000" >> ${CONF_PATH}/${port}/redis.conf
    echo "appendonly yes" >> ${CONF_PATH}/${port}/redis.conf
    chmod 755 ${CONF_PATH}/${port}
    chmod 755 ${DATA_PATH}/${port}
    chmod 755 ${LOG_PATH}/${port}
done
 
# 启动所有Redis实例
for port in `seq $PORT_START $(($PORT_START+$NODES-1))`
do
    redis-server ${CONF_PATH}/${port}/redis.conf
done
 
# 创建Redis Cluster
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1

这个扩容脚本示例展示了如何为Redis Cluster创建配置文件、目录和日志文件,并设置合适的权限。然后,脚本启动所有Redis实例,并使用redis-cli命令来创建一个包含三个主节点和一个副本的Redis Cluster。这个例子简洁明了,并且使用了bash脚本的循环和条件语句来自动化这个过程。

2024-09-04

在Java中操作Redis和Redis的持久化,你可以使用Jedis库。以下是一个简单的例子:

  1. 添加Jedis依赖到你的项目中(如果使用Maven):



<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>最新版本</version>
</dependency>
  1. 操作Redis的示例代码:



import redis.clients.jedis.Jedis;
 
public class RedisExample {
    public static void main(String[] args) {
        // 连接到Redis服务器
        Jedis jedis = new Jedis("localhost", 6379);
        
        // 设置键值对
        jedis.set("key", "value");
        
        // 获取并打印值
        System.out.println("获取键 'key' 对应的值: " + jedis.get("key"));
        
        // 关闭连接
        jedis.close();
    }
}
  1. Redis的持久化操作:

Redis支持两种持久化方式:RDB(默认)和AOF。

  • RDB:定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。
  • AOF:每个写命令都通过append操作保存到文件中。

配置RDB持久化(在redis.conf中设置):




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

配置AOF持久化(在redis.conf中设置):




appendonly yes  # 开启AOF持久化
appendfilename "appendonly.aof"  # AOF文件名
dir /path/to/redis/dir  # AOF文件存储目录

注意:持久化配置需要根据实际需求和性能影响进行调整。

2024-09-04

Spring Boot整合Redis可以通过Spring Data Redis或Jedis实现。以下是使用Spring Data Redis的一个基本示例:

  1. 添加依赖到pom.xml



<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置application.propertiesapplication.yml



# application.properties
spring.redis.host=localhost
spring.redis.port=6379
  1. 使用RedisTemplateStringRedisTemplate操作Redis:



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
 
@RestController
public class RedisController {
 
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
 
    @GetMapping("/set")
    public String setKey(@RequestParam String key, @RequestParam Object value) {
        redisTemplate.opsForValue().set(key, value);
        return "success";
    }
 
    @GetMapping("/get")
    public Object getKey(@RequestParam String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

这个示例提供了两个简单的API:一个用于设置键值对到Redis,另一个用于从Redis中获取键的值。RedisTemplate是Spring提供的一个泛型类,用于操作Redis。这个例子使用了默认的配置,如果需要自定义配置,可以创建一个配置类。

2024-09-04

在Redis中,我们可以使用一些特殊的命令来获取服务器的全局状态,这些命令被称为"全局命令"。

  1. INFO命令

INFO命令是最常用的全局命令之一。它返回关于Redis服务器的各种信息和统计,包括服务器基本信息、客户端连接信息、内存信息等。

示例代码:




redis-cli INFO
  1. SLAVEOF命令

SLAVEOF命令用于将当前服务器转变为另一个服务器的从属服务器。

示例代码:




redis-cli SLAVEOF 192.168.1.100 6379
  1. SAVEBGSAVE命令

SAVE命令会阻塞当前服务器进程,直到RDB文件被保存完成。而BGSAVE命令会创建一个子进程来完成RDB文件的创建,父进程则继续处理其他命令。

示例代码:




redis-cli SAVE
redis-cli BGSAVE
  1. DEBUG OBJECT命令

DEBUG OBJECT命令用于获取Redis中某个key的调试信息。

示例代码:




redis-cli DEBUG OBJECT mykey
  1. CONFIG GETCONFIG SET命令

CONFIG GET命令用于获取Redis服务器的配置参数。CONFIG SET命令用于设置Redis服务器的配置参数。

示例代码:




redis-cli CONFIG GET *
redis-cli CONFIG SET save "60 1"
  1. CLIENT LIST命令

CLIENT LIST命令用于获取连接到Redis服务器的客户端列表。

示例代码:




redis-cli CLIENT LIST
  1. MONITOR命令

MONITOR命令用于实时监控Redis服务器接收到的命令。

示例代码:




redis-cli MONITOR
  1. SHUTDOWN命令

SHUTDOWN命令用于关闭Redis服务器。

示例代码:




redis-cli SHUTDOWN

以上就是一些Redis的全局命令,每个命令都有其特定的用途和使用场景。在实际应用中,可以根据需要选择合适的命令来操作Redis服务器。

2024-09-04

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

  1. RDB 持久化

RDB 是 Redis 默认的持久化方式。在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是 Snapshot 快照,保存的文件后缀是 .rdb




# 在 redis.conf 中配置
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 文件存储目录
  1. AOF 持久化

AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态的。在发生断电等问题时可能会丢失最后一段时间的命令,因此 AOF 可以配置同步策略。




# 在 redis.conf 中配置
appendonly yes  # 开启 AOF 持久化存储
appendfilename "appendonly.aof"  # AOF 文件名

# 同步策略
appendfsync always  # 每次写入都同步,最慢但最安全
appendfsync everysec  # 每秒同步一次,折衷方案
appendfsync no  # 完全依赖操作系统,最快但不安全
  1. 比较与选择
  • RDB 是一个快照,体积小,恢复速度快,但可能会丢失最后一次保存后的数据。
  • AOF 记录每次写操作,体积大,恢复速度慢,但不会丢失数据。

选择哪种持久化方式取决于你对数据完整性和性能的需求。如果你希望在服务器失效时丢失尽可能少的数据,那么 RDB 可能更适合。如果你需要最小化数据丢失风险并且可以接受较长的恢复时间,AOF 可能更好。