2024-09-09

Redis-cli是Redis自带的一个非常方便的命令行工具,可以用于连接Redis服务,并对Redis进行操作。

  1. 连接Redis服务

连接到Redis服务的最基本命令是:




redis-cli

如果Redis服务设置了密码,可以使用-a参数指定密码:




redis-cli -a password

如果Redis服务监听的端口不是默认的6379,可以使用-p参数指定端口:




redis-cli -p port

如果Redis服务监听的主机不是本地,可以使用-h参数指定主机:




redis-cli -h host
  1. 使用Redis命令

连接到Redis服务后,就可以使用Redis提供的命令对数据进行操作了。例如,设置一个key-value:




redis-cli set key value

获取一个key的值:




redis-cli get key

删除一个key:




redis-cli del key

查看所有的key:




redis-cli keys *
  1. 批量操作

如果你有一个文件,里面包含了很多的Redis命令,你可以使用--pipe参数将文件中的命令批量执行:




redis-cli --pipe commands.txt
  1. 导入导出数据

使用-r参数可以将命令的输出结果输出到文件中:




redis-cli -r 10 keys * > output.txt

使用-i参数可以将文件中的命令导入到Redis中执行:




redis-cli -i input.txt
  1. 其他参数

Redis-cli还有很多其他参数,例如-n参数可以让你执行命令时不输出命令回显,-t参数可以让你设置命令超时时间等。

  1. 使用脚本操作Redis

你可以将常用的Redis命令写入脚本,然后通过redis-cli执行脚本:




redis-cli < script.txt

以上就是Redis-cli的基本使用方法,更多高级用法可以查看Redis-cli的官方文档。

2024-09-09

为了搭建一个基本的Redis三主三从高可用集群,你需要遵循以下步骤:

  1. 安装Redis并确保其版本支持集群模式。
  2. 配置三个主节点的redis.conf文件。
  3. 配置三个从节点的redis.conf文件,并指定主节点。
  4. 启动所有Redis实例。
  5. 使用redis-cli创建集群。

以下是示例配置和启动命令:

redis.conf 示例配置(对于主节点):




port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

启动Redis实例:




redis-server /path/to/redis.conf

创建集群:




redis-cli --cluster create <IP1>:7000 <IP2>:7000 <IP3>:7000 <IP4>:7000 <IP5>:7000 <IP6>:7000 --cluster-replicas 1

确保替换 <IP1><IP6> 为你服务器的实际IP地址,并且每个实例的端口号与redis.conf文件中设置的一致。--cluster-replicas 1 指定每个主节点的副本数。

注意:在生产环境中,你还需要考虑持久化配置、密码设置、防火墙规则等因素。

2024-09-09



-- 假设已经有一个Redis客户端库`redis-client`和一个锁工具库`lock-util`
local redisClient = require "redis-client"
local lockUtil = require "lock-util"
 
-- 创建Redis客户端实例
local client = redisClient:new()
 
-- 定义锁的键
local lockKey = "my_lock_key"
 
-- 获取锁
local lock = lockUtil:getLock(client, lockKey)
 
-- 使用锁保护代码
local isLocked, err = lock:lock()
if isLocked then
    -- 在这里编写需要互斥执行的代码
    print("已获取锁,执行业务逻辑")
 
    -- 解锁
    lock:unlock()
else
    -- 处理错误或回退当前操作
    print("获取锁失败: " .. err)
end

这个示例展示了如何在Lua中使用假设的Redis客户端库和锁工具库来获取和释放一个锁。在获取锁成功后,执行需要互斥的代码,并在完成后释放锁。如果无法获得锁,则应当处理错误或相应地回退操作。这是一个典型的分布式锁应用场景,对于学习如何在实际应用中使用Redis锁有很好的教育意义。

2024-09-09



package main
 
import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/go-redis/redis/v8"
    "context"
)
 
var ctx = context.Background()
 
func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 默认没有密码,如果有则填写
        DB:       0,  // 默认数据库为0,可以通过这个字段来切换数据库
    })
 
    pong, err := rdb.Ping(ctx).Result()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(pong)
 
    router := gin.Default()
 
    router.GET("/set/:key/:value", func(c *gin.Context) {
        key := c.Param("key")
        value := c.Param("value")
        _, err := rdb.Set(ctx, key, value, 0).Result()
        if err != nil {
            c.JSON(200, gin.H{
                "error": err.Error(),
            })
            return
        }
        c.JSON(200, gin.H{
            "message": "success",
        })
    })
 
    router.GET("/get/:key", func(c *gin.Context) {
        key := c.Param("key")
        value, err := rdb.Get(ctx, key).Result()
        if err != nil {
            c.JSON(200, gin.H{
                "error": err.Error(),
            })
            return
        }
        c.JSON(200, gin.H{
            "message": value,
        })
    })
 
    router.Run()
}

这段代码首先创建了一个Redis客户端,并尝试连接到本地的Redis服务。然后,定义了两个路由处理函数,一个用于设置键值对,一个用于获取键对应的值。最后启动了Gin服务器。这个例子展示了如何在Gin框架中使用Redis客户端进行简单的键值存储操作。

2024-09-09

Redis 事务是一组命令的集合。事务同意多个命令在同一上下文中执行,保证事务内的命令按预期执行,中间不会插入其他命令。

Redis 事务主要通过 MULTIEXECDISCARDWATCH 命令来实现。

  1. MULTI 命令用于开启一个事务。它的返回值总是 OK
  2. EXEC 命令用于执行事务中的所有命令。
  3. DISCARD 命令用于取消事务,放弃执行事务中的所有命令。
  4. WATCH 命令用于监视一个或多个键,如果在事务执行之前键的值发生变化,则取消事务的执行。

以下是一个使用 Redis 事务的 Python 示例:




import redis
 
# 连接到本地Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 开启Redis事务
pipeline = r.pipeline()
 
# 将要在事务中执行的命令加入到事务中
pipeline.multi()
pipeline.set('key1', 'value1')
pipeline.set('key2', 'value2')
pipeline.set('key3', 'value3')
 
# 执行事务
pipeline.exec()
 
# 获取设置的值进行验证
print(r.get('key1')) # 输出:value1
print(r.get('key2')) # 输出:value2
print(r.get('key3')) # 输出:value3

在这个例子中,我们首先通过 pipeline 对象开启了一个事务,然后使用 multi 方法开始事务,并将三个 set 命令加入到事务中。最后,我们通过 exec 方法执行了这个事务。

注意:在实际使用中,应该确保 Redis 服务器的正常运行,并处理可能出现的异常。

2024-09-09



import redis
 
# 连接到Redis服务器
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
 
# 发布消息到channel
def publish_message(channel, message):
    redis_client.publish(channel, message)
 
# 订阅特定channel的消息
def subscribe_to_channel(channel):
    pubsub = redis_client.pubsub()
    pubsub.subscribe(channel)
    for message in pubsub.listen():
        if message['type'] == 'message':
            print(f"Received message: {message['data'].decode()}")
 
# 示例使用
channel_name = "my_channel"
message_to_publish = "Hello, Redis!"
 
# 发布消息
publish_message(channel_name, message_to_publish)
 
# 订阅消息
subscribe_to_channel(channel_name)

这段代码演示了如何使用redis-py库在Redis中发布和订阅消息。首先,我们连接到Redis服务器。然后,我们定义了publish_message函数来发布消息到指定的channel,以及subscribe_to_channel函数来订阅一个channel并打印接收到的消息。最后,我们使用示例展示了如何调用这些函数来发送和接收消息。

2024-09-09



# 设置Redis最大内存
maxmemory 2gb
 
# 设置内存淘汰策略
maxmemory-policy allkeys-lru
 
# 设置Redis的最大连接数
maxclients 10000
 
# 设置Redis的超时时间
timeout 300
 
# 开启Redis的持久化机制,使用RDB和AOF
save 900 1
save 300 10
save 60 10000
 
appendonly yes
appendfsync everysec
 
# 设置Redis的日志级别
loglevel notice
 
# 设置Redis的日志文件路径
logfile /var/log/redis/redis-server.log
 
# 设置Redis的数据库数量
databases 16
 
# 设置Redis的TCP连接的监听队列长度
tcp-backlog 511
 
# 设置Redis的最小空闲内存
min-slaves-to-write 3
min-slaves-max-lag 10

以上配置示例展示了如何设置Redis的最大内存、内存淘汰策略、最大连接数、超时时间、持久化策略、日志记录级别和路径、数据库数量、TCP连接队列长度、最小空闲内存等关键配置项,以优化Redis的性能。

2024-09-09

在CentOS 7上安装Redis 7.2.4,可以按照以下步骤进行:

  1. 首先,更新你的系统包索引并升级所有包:

    
    
    
    sudo yum update
  2. 安装编译相关工具:

    
    
    
    sudo yum install -y gcc make
  3. 下载Redis 7.2.4的源代码:

    
    
    
    wget http://download.redis.io/releases/redis-7.2.4.tar.gz
  4. 解压源代码:

    
    
    
    tar xzf redis-7.2.4.tar.gz
  5. 进入Redis源代码目录:

    
    
    
    cd redis-7.2.4
  6. 编译Redis:

    
    
    
    make
  7. 安装Redis到系统路径里(可选):

    
    
    
    sudo make install
  8. 如果你想要安装Redis的可执行文件到/usr/local/bin,确保你已经执行了上面的make install步骤。
  9. 启动Redis服务器:

    
    
    
    redis-server
  10. 你也可以通过指定配置文件来启动Redis服务器:

    
    
    
    redis-server /path/to/redis.conf
  11. 如果你想要Redis随系统启动,你可以使用systemd服务文件。创建一个名为redis.service的文件,内容如下:

    
    
    
    [Unit]
    Description=Redis In-Memory Data Store
    After=network.target
     
    [Service]
    User=redis
    Group=redis
    ExecStart=/usr/local/bin/redis-server /path/to/redis.conf
    ExecStop=/usr/local/bin/redis-cli shutdown
    Restart=always
     
    [Install]
    WantedBy=multi-user.target

    将此文件保存至/etc/systemd/system/redis.service,然后使用以下命令启用和启动Redis服务:

    
    
    
    sudo systemctl daemon-reload
    sudo systemctl enable redis
    sudo systemctl start redis

请注意,上述步骤可能需要根据你的系统配置和安全策略进行调整。特别是,建议设置密码,配置防火墙规则,以及使用非root用户运行Redis服务等安全建议。

2024-09-09

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种攻击技术,它允许攻击者利用服务器发送任意的请求到内部系统。在这种情况下,攻击者可能会利用SSRF漏洞来尝试未授权访问目标服务器上的Redis服务。如果Redis没有设置适当的保护措施,攻击者可以通过发送特制的请求获取到服务器的敏感文件,进而实现未授权的文件读取或getshell。

解决这个问题通常涉及以下几个方面:

  1. 更新Redis到最新版本,因为一些新版本可能已经内置了防御措施。
  2. 配置Redis,使其不监听外部接口或者限制可访问的IP地址。
  3. 如果Redis需要从外部访问,使用防火墙规则来限制哪些服务可以连接到Redis服务器。
  4. 对于SSRF漏洞,应该修复或避免使用SSRF功能,或者在服务器上实施更严格的输入验证。

如果你是开发者,以下是一个简单的示例代码来避免SSRF攻击:




import requests
 
def fetch_url(url):
    # 只允许请求本地地址
    if not url.startswith('http://localhost') and not url.startswith('http://127.0.0.1'):
        return "Invalid URL"
    
    response = requests.get(url)
    return response.text
 
# 使用示例
url = "http://example.com"
content = fetch_url(url)
print(content)

在这个示例中,我们检查URL是否以http://localhosthttp://127.0.0.1开头,只有当URL符合这个条件时才会进行请求。这样可以防止SSRF攻击利用服务端发起的请求进行攻击。

2024-09-09

Redis主从复制是一种数据复制方式,它可以确保主数据库(Master)和从数据库(Slave)之间的数据一致性。主数据库可以进行读写操作,当写操作导致数据变化时,这些变化会以日志的形式发送给从数据库。从数据库会应用这些变化,保持与主数据库的数据同步。

以下是配置Redis主从复制的基本步骤:

  1. 配置主数据库(Master):

    redis.conf文件中,注释或移除slaveof指令。

  2. 配置从数据库(Slave):

    redis.conf文件中,使用slaveof指令指定主数据库的IP和端口。

    
    
    
    slaveof <master-ip> <master-port>

    如果需要,还可以配置从数据库只读(slave-read-only yes)。

  3. 重启Redis服务使配置生效。

示例配置:

Master redis.conf:




# No special configuration for Master required

Slave redis.conf:




slaveof <master-ip> <master-port>
slave-read-only yes

在实际操作中,替换<master-ip><master-port>为实际的主数据库的IP地址和端口号。

主从复制可以通过Redis的命令行接口进行快速配置,不需要修改配置文件。例如,可以在运行的Slave Redis服务器上执行:




redis-cli SLAVEOF <master-ip> <master-port>

要取消从数据库的复制状态,可以在从数据库执行:




redis-cli SLAVEOF NO ONE

这些是主从复制的基本概念和配置方法,实际应用中可能需要考虑更多因素,如身份验证、哨兵模式等。