2024-09-03

在Redis中,修改密码通常涉及编辑Redis配置文件或者在运行时通过Redis命令动态修改。

  1. 编辑配置文件:

找到Redis配置文件redis.conf,通常位于/etc/redis//usr/local/etc/目录下。找到文件中的requirepass指令,将其更改为你想要设置的密码。例如:




requirepass yournewpassword

然后重启Redis服务以使更改生效。




sudo service redis-server restart

或者




sudo systemctl restart redis.service
  1. 运行时动态修改:

如果Redis服务正在运行,你可以通过Redis CLI使用CONFIG SET命令动态更改密码。但请注意,CONFIG SET命令需要你先使用旧密码进行认证。




redis-cli -a youroldpassword
> CONFIG SET requirepass "yournewpassword"

更改密码后,所有新的连接都需要使用新密码进行认证。

请确保在实际环境中更改密码时,遵循最佳安全实践,如使用强密码,定期更换密码等。

2024-09-03

Redis 的 zset(sorted set:有序集合)是一种数据类型,它不仅存储元素,而且还将每个元素关联到一个浮点数的分数。在 zset 中的元素都是唯一的,但分数(score)可以重复。

zset 是通过一种称为跳跃列表(skip list)的数据结构和哈希表实现的,这意味着添加、删除和查找元素都有着 log(N) 的时间复杂度。

以下是 zset 的常用命令:

  • ZADD key [NX|XX] [CH] [INCR] score member [score member ...]:添加一个或多个成员及其分数到 zset。
  • ZCARD key:获取 zset 中的成员数。
  • ZCOUNT key min max:计算在 zset 中分数在 min 和 max 之间的成员的数量。
  • ZINCRBY key increment member:增加 zset 中成员的分数。
  • ZRANGE key start stop [WITHSCORES]:按索引范围返回 zset 中的成员。
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:按分数范围返回 zset 中的成员。
  • ZREM key member [member ...]:移除 zset 中的一个或多个成员。
  • ZSCORE key member:获取 zset 中成员的分数。

实例代码(使用 redis-py 库):




import redis
 
# 连接到 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 添加元素到 zset
r.zadd('myzset', {'member1': 1, 'member2': 2})
 
# 获取 zset 的成员数
member_count = r.zcard('myzset')
print(f"Member count: {member_count}")
 
# 计算分数在 1 和 2 之间的成员数
count = r.zcount('myzset', 1, 2)
print(f"Members with scores between 1 and 2: {count}")
 
# 按索引范围返回成员
members = r.zrange('myzset', 0, -1)
print(f"Members: {members}")
 
# 按分数范围返回成员
score_range_members = r.zrangebyscore('myzset', 1, 2)
print(f"Members with scores between 1 and 2: {score_range_members}")
 
# 移除 zset 中的成员
r.zrem('myzset', 'member1')
 
# 获取成员的分数
score = r.zscore('myzset', 'member2')
print(f"Score of 'member2': {score}")

这段代码展示了如何使用 redis-py 库来操作 Redis 中的 zset 类型。

2024-09-03

在实现秒杀系统时,可以通过Redis的原子操作来优化锁的使用,以下是一个使用Lua脚本和Redis的例子:




-- Lua脚本用于实现秒杀
local num = tonumber(ARGV[1])
local user_id = tonumber(ARGV[2])
 
-- 检查库存
if (redis.call('exists', KEYS[1]) == 0) then
    -- 如果库存不存在,则初始化库存
    redis.call('set', KEYS[1], num)
end
 
if (redis.call('get', KEYS[1]) == '0') then
    -- 如果库存为0,则不能购买
    return 0
else
    -- 扣减库存
    redis.call('decr', KEYS[1])
    -- 记录用户购买
    redis.call('sadd', KEYS[2], user_id)
    return 1
end

在这个Lua脚本中,我们首先检查商品库存是否存在,如果不存在,则初始化库存。然后,我们检查库存数量是否为零,如果不为零,则通过decr命令来减少库存,并使用sadd命令将用户ID添加到已购买用户的集合中。

在Redis客户端中执行这个Lua脚本,你需要提供商品库存的键名、商品库存数量、用户ID作为参数,并传入用于库存和用户记录的键名作为KEYS数组的元素。




import redis
 
# 连接到Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
 
# Lua脚本字符串
lua_script = """
...  # 上面提供的Lua脚本代码
"""
 
# 将Lua脚本加载到Redis中
script = r.register_script(lua_script)
 
# 实际的商品库存键名
stock_key = 'item_stock_123'
# 记录购买用户的集合键名
purchase_key = 'purchased_users_123'
 
# 用户ID
user_id = 456
 
# 执行Lua脚本
result = script(keys=[stock_key, purchase_key], args=[str(num), str(user_id)])
 
if result == 1:
    print("秒杀成功")
else:
    print("秒杀失败")

这个Python脚本展示了如何连接到Redis,加载和执行Lua脚本,并处理秒杀逻辑。如果秒杀成功,则可以更新数据库中的库存和记录购买用户信息。

2024-09-03

Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

Redis 支持的五种数据结构分别是:String、List、Set、ZSet(Sorted Set)、Hash。

  1. String

String 是最简单的类型,你可以理解成与 Memcached 一模一个的类型。一个 key 对应一个 value,其上支持的操作与 Memcached 类似。

常用命令:




# 设置 key-value
SET key value
 
# 获取 key 对应的 value
GET key
 
# 删除 key
DEL key
 
# 修改 key 对应的 value
SET key new_value
 
# 在 key 对应的原有 value 基础上追加内容
APPEND key new_content
  1. List

List 是一个双向链表结构,可以在其头部和尾部添加删除元素。

常用命令:




# 在 key 对应的 list 头部添加元素
LPUSH key value1 [value2]
 
# 在 key 对应的 list 尾部添加元素
RPUSH key value1 [value2]
 
# 获取 key 对应的 list 中的所有元素
LRANGE key start stop
 
# 获取 key 对应的 list 的长度
LLEN key
 
# 获取 key 对应的 list 的头部元素
LPOP key
 
# 获取 key 对应的 list 的尾部元素
RPOP key
  1. Set

Set 是一个无序的集合,其中的元素都是唯一的。

常用命令:




# 添加一个或多个成员到 key 对应的 set 集合中
SADD key member1 [member2]
 
# 获取 key 对应的 set 集合中的所有成员
SMEMBERS key
 
# 获取 key 对应的 set 集合中的成员的数量
SCARD key
 
# 判断 member 元素是否是 key 对应的 set 集合的成员
SISMEMBER key member
 
# 从 key 对应的 set 集合中移除一个或多个成员
SREM key member1 [member2]
  1. ZSet(Sorted Set)

ZSet 是一个有序的集合,每个元素都会关联一个 double 类型的分数,通过这个分数来对元素进行从小到大的排序。

常用命令:




# 添加一个或多个成员,以及其分数到 key 对应的 zset 集合中
ZADD key [NX|XX] [CH] [INCR] score1 member1 [score2 member2]
 
# 获取 key 对应的 zset 集合中的所有成员
ZRANGE key start stop [WITHSCORES]
 
# 获取 key 对应的 zset 集合中的成员的数量
ZCARD key
 
# 获取 key 对应的 zset 集合中的成员的分数
ZSCORE key member
 
# 移除 key 对应的 zset 集合中的一个或多个成员
ZREM key member [member...]
  1. Hash

Hash 是一个 string 类型的 field 和 value 的映射表,适用于存储小型的数据表。

常用命令:




# 设置 key 对应的 hash 中指定字段的值
HSET key field value
 
# 获取 key 对应的 hash 中的所有字段和值
HGETALL key
 
# 获取 key 对应的 hash 中的指定字段的
2024-09-03

Redis 7.2.3 for Windows 的安装步骤如下:

  1. 访问 Redis 官网下载页面:https://redis.io/download
  2. 选择相应的版本(7.2.3)下载。
  3. 下载完成后,解压缩到你选择的目录。
  4. 打开命令行界面(CMD),切换到 Redis 解压缩目录。
  5. 运行 redis-server.exe 启动 Redis 服务器。
  6. 新开一个命令行界面,同样切换到 Redis 目录,运行 redis-cli.exe 连接到 Redis 服务器。

以下是在命令行界面中的操作示例:




# 假设 Redis 解压缩到了 C:\redis

# 切换到 Redis 目录
cd C:\redis

# 启动 Redis 服务器
redis-server.exe

# 新开一个命令行界面,连接 Redis
cd C:\redis
redis-cli.exe

完成以上步骤后,你就在 Windows 系统上安装了 Redis 7.2.3。

2024-09-03

Redis 7 安装

对于不同的操作系统,安装Redis 7的方法可能会有所不同。以下是在Linux系统上安装Redis 7的步骤:

  1. 使用命令行下载并解压Redis 7的源代码:

    
    
    
    wget http://download.redis.io/releases/redis-7.0.0.tar.gz
    tar xzf redis-7.0.0.tar.gz
    cd redis-7.0.0
  2. 编译Redis:

    
    
    
    make
  3. 安装Redis(可选):

    
    
    
    sudo make install

Redis 7 配置

Redis的配置文件是redis.conf,你可以根据需要进行修改。例如,你可以修改默认的监听端口或者设置持久化选项。

Redis 7 卸载

如果你需要卸载Redis 7,你可以按照以下步骤操作:

  1. 停止Redis服务。
  2. 删除安装目录下的Redis文件。
  3. 删除配置文件和相关的日志文件。

使用可视化工具连接Redis

可以使用Redis Desktop Manager或其他可视化工具来连接并管理Redis数据库。以Redis Desktop Manager为例,步骤如下:

  1. 下载并安装Redis Desktop Manager。
  2. 打开软件,在界面上填写Redis服务器的IP地址、端口、密码等信息。
  3. 点击“连接”按钮,如果配置正确,你将能够看到Redis数据库中的数据并进行可视化操作。

请注意,具体的安装步骤和配置可能会根据不同的操作系统和可视化工具有所变化。

2024-09-03

在Redis中,如果你想关闭手动触发的SAVEBGSAVE命令,可以通过配置文件或者运行时通过命令来实现。

  1. 通过配置文件关闭手动SAVE

    在Redis配置文件中,找到以下行:

    
    
    
    save <seconds> <changes>

    将其注释掉或删除,这样Redis就不会在指定的时间内自动执行SAVE操作。

  2. 通过Redis命令关闭手动SAVE

    你可以在Redis CLI中执行以下命令来禁用手动SAVE

    
    
    
    config set save ""

    这条命令会设置Redis的保存策略为空,这样就不会自动执行SAVE操作。

  3. 关闭BGSAVE

    如果你也想关闭BGSAVE,可以使用类似的方法。在配置文件中找到以下行:

    
    
    
    rdbchecksum yes

    将其改为:

    
    
    
    rdbchecksum no

    这样Redis在执行BGSAVE时就不会进行校验和计算,从而减少性能开销。

请注意,关闭手动SAVEBGSAVE可能会影响你的数据持久化策略,因此请确保你有其他的自动持久化机制来代替它们,如RDB或AOF。

2024-09-03

Redis 主从复制和集群配置涉及多个方面,以下是基于 Redis 配置主从复制和创建 Redis Cluster 的简要步骤和示例配置:

主从复制配置:

  1. 在主节点的 redis.conf 文件中设置:



bind 0.0.0.0
port 6379
  1. 在从节点的 redis.conf 文件中设置:



bind 0.0.0.0
port 6380
slaveof <主节点IP> <主节点端口>

启动主节点和从节点的 Redis 服务。

Redis Cluster 配置:

  1. 在每个节点的 redis.conf 文件中设置:



bind 0.0.0.0
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  1. 启动所有节点的 Redis 服务。
  2. 使用 redis-cli 创建集群:



redis-cli --cluster create <节点IP1>:<端口1> <节点IP2>:<端口2> ... --cluster-replicas 1

其中,<节点IP1>:<端口1> 是你的 Redis 节点列表,--cluster-replicas 1 指定每个主节点的副本数。

以上步骤和配置是基于 Redis 的默认设置。根据实际部署环境,可能需要调整配置,例如设置密码、调整网络参数等。

2024-09-03

在Redis 7.x中,可以通过Redis Cluster Manager (RCM)来动态地对Redis集群进行扩容或缩容。以下是一个简化的例子,展示如何使用RCM来扩展集群的容量。

首先,确保你已经安装了Redis 7.x和RCM。

  1. 启动一个新的Redis节点,并将其加入到集群中:



redis-cli --cluster add-node new_node_ip:new_node_port existing_node_ip:existing_node_port
  1. 对新节点进行数据迁移:



redis-cli --cluster reshard new_node_ip:new_node_port

按照提示选择源节点和目标节点,以及需要迁移的键的数量。

  1. 重新分配hash slots:



redis-cli --cluster rebalance new_node_ip:new_node_port

按照提示确认开始重新分配。

对于缩容,步骤相似:

  1. 对于想要移除的节点,重新分配其slots到其他节点:



redis-cli --cluster rebalance existing_node_ip:existing_node_port
  1. 移除节点:



redis-cli --cluster del-node new_node_ip:new_node_port

注意:在实际操作中,应该在维护窗口和负载低峰时段执行这些操作,以避免对服务造成影响。

2024-09-03



from fastapi import FastAPI
from fastapi_utils.tasks import repeat_every_second
from celery import Celery
 
# 初始化FastAPI应用
app = FastAPI()
 
# 创建Celery实例
def create_celery_app(app: FastAPI):
    celery = Celery('fastapi_celery', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')
    celery.conf.update(
        result_expires=3600,
    )
    celery.conf.beat_schedule = {
        'add-every-second': {
            'task': 'fastapi_celery.tasks.add',
            'schedule': 1.0,
            'args': (1, 2)
        },
    }
    @celery.on_after_configure.connect
    def setup_periodic_tasks(sender, **kwargs):
        # 自定义定时任务
        pass
    return celery
 
# 创建Celery对象
celery_app = create_celery_app(app)
 
# 定义Celery任务
@celery_app.task
def add(x, y):
    return x + y
 
# 定义FastAPI路由
@app.get("/")
async def root():
    return {"message": "Hello World"}
 
# 启动FastAPI和Celery Worker
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

这个代码示例展示了如何在FastAPI应用中集成Redis和Celery来实现异步任务和定时任务。首先,我们创建了一个Celery实例,指定了Redis作为消息代理和结果存储。然后,我们定义了一个定时任务“add-every-second”,它会每秒调用一个名为fastapi_celery.tasks.add的异步任务。最后,我们启动了FastAPI服务和Celery Worker。这个例子简洁明了,展示了如何将FastAPI与异步任务框架结合使用。