2024-09-04

在这个部分,我们将详细介绍如何在不同的操作系统上从源码开始部署Redis。

在Linux上从源码部署Redis

1. 安装依赖




sudo apt-get update
sudo apt-get install build-essential tcl

2. 下载源码




wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6

3. 编译安装




make
make test # 可选,但推荐
sudo make install

4. 配置Redis

编辑配置文件redis.conf,可以在Redis源码目录中找到一个示例配置文件。

5. 启动Redis服务器




redis-server /path/to/redis.conf

6. 测试Redis




redis-cli ping

如果返回PONG,则表示Redis服务器正在正常运行。

在Windows上从源码部署Redis

1. 安装依赖

下载并安装MSYS2,然后在MSYS2的shell中运行:




pacman -Syu
pacman -Su
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
pacman -S --needed git ca-certificates

2. 下载源码




git clone https://github.com/tporadowski/redis.git
cd redis

3. 编译




cd deps
make hiredis lua jemalloc linenoise



cd ..
make BUILD_TLS=yes BUILD_TESTS=yes

4. 运行Redis




./redis-server

5. 测试Redis

在另一个命令行窗口中,运行:




./redis-cli ping

如果返回PONG,则表示Redis服务器正在正常运行。

注意:以上步骤可能随着Redis和依赖项的版本更新而变化,请参考官方文档或源码仓库获取最新信息。

2024-09-04



import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import java.util.Collections;
import java.util.List;
 
public class FuzzyQueryWithSortedSetAndLua {
 
    private final RedisTemplate<String, String> redisTemplate;
    private final DefaultRedisScript<List<String>> luaScript;
 
    public FuzzyQueryWithSortedSetAndLua(RedisTemplate<String, String> redisTemplate,
                                         DefaultRedisScript<List<String>> luaScript) {
        this.redisTemplate = redisTemplate;
        this.luaScript = luaScript;
    }
 
    public List<String> fuzzyQueryWithSortedSetAndLua(String key, String pattern, long offset, long count) {
        // 使用Lua脚本进行模糊查询并进行分页
        List<String> keys = Collections.singletonList(key);
        Object[] args = new Object[]{pattern, offset, count};
        return redisTemplate.execute(luaScript, keys, args);
    }
}

这段代码展示了如何使用Spring Data Redis的RedisTemplateDefaultRedisScript来执行一个Lua脚本,以实现对Redis ZSet(sorted set)的模糊查询,并结合分页参数进行查询。这是一个简化的例子,实际使用时需要确保Lua脚本的正确性和安全性,并且要考虑如何处理模糊查询的复杂性和性能问题。

2024-09-04

为了保证Redis和数据库数据的一致性,可以采用以下策略:

  1. 写入数据库后更新Redis:先写数据库,成功后写入Redis。
  2. 写入Redis后更新数据库:先写Redis,成功后写数据库,并确保Redis中有相应数据的标记。
  3. 使用事务:在数据库事务中包含Redis操作。

以下是一个简单的示例,展示了如何在写入数据库后更新Redis:




import redis
import pymysql
 
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 连接MySQL
conn = pymysql.connect(host='localhost', user='user', password='pass', db='dbname')
 
try:
    # 写入数据库
    with conn.cursor() as cursor:
        sql = "INSERT INTO table_name (column1, column2) VALUES (%s, %s)"
        cursor.execute(sql, ('value1', 'value2'))
        conn.commit()
 
    # 写入Redis
    r.set('key', 'value')
 
except Exception as e:
    print(f"Error: {e}")
    conn.rollback()
    r.delete('key')  # 如果数据库回滚,需要移除Redis中的数据
finally:
    conn.close()

为了保证数据一致性,在写入Redis后发生异常需要进行回滚操作,在这个例子中,如果数据库事务失败,会进行回滚,并且删除刚刚写入Redis的数据。

为了保证性能,可以考虑使用异步方式更新Redis,或者使用Redis的事务特性,但这会增加复杂度,并可能引入额外的一致性问题。在设计时需要根据具体场景权衡考虑。

2024-09-04

Redis Pub/Sub 系统是一种在 Redis 内的发布者和订阅者之间通信的方法。这种模式可以用于实现实时消息传递。

以下是一个简单的 Python 示例,展示如何使用 Redis 的 Pub/Sub 系统:




import redis
 
# 连接到 Redis 服务器
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 创建一个发布者
pub = r.pubsub()
 
# 订阅一个频道,这里是 'test_channel'
pub.subscribe('test_channel')
 
# 开始监听订阅的频道
for message in pub.listen():
    print(message)
 
# 在另一个会话中,创建一个订阅者并发布消息
r.publish('test_channel', 'Hello, World!')

在这个例子中,我们首先连接到 Redis 服务器,然后创建一个发布者对象。我们订阅了一个名为 'test\_channel' 的频道。然后,我们进入一个循环,以便持续监听订阅的频道。

在另一个会话中,我们发布一条消息到同一个频道。这条消息会立即被我们的订阅者捕获,并打印出来。

这个例子展示了如何使用 Redis Pub/Sub 进行简单的消息传递。它是实时系统和事件驱动应用程序的一个基本构建块。

2024-09-04

在Redis中,数据类型主要包括字符串(String), 列表(List), 集合(Set), 有序集合(Sorted Set), 哈希(Hash)等。

  1. 列表(List)

    列表是一个有序的字符串列表,你可以在列表的两端进行插入(左侧头部,右侧尾部)和删除(头部,尾部)操作。




# 在列表头部插入元素
redis.lpush('mylist', 'element')
 
# 在列表尾部插入元素
redis.rpush('mylist', 'element')
 
# 获取列表的全部元素
redis.lrange('mylist', 0, -1)
 
# 从列表头部删除元素
redis.lpop('mylist')
 
# 从列表尾部删除元素
redis.rpop('mylist')
  1. 集合(Set)

    集合是一个无序的字符串集合,你可以添加,删除,检查成员存在性等操作。




# 添加成员
redis.sadd('myset', 'member')
 
# 删除成员
redis.srem('myset', 'member')
 
# 检查成员是否存在
redis.sismember('myset', 'member')
 
# 获取集合的全部成员
redis.smembers('myset')
  1. 有序集合(Sorted Set)

    有序集合是一个无序的字符串集合,每个成员都关联着一个分数,用于排序。




# 添加成员
redis.zadd('myzset', {'member': score})
 
# 删除成员
redis.zrem('myzset', 'member')
 
# 获取全部成员
redis.zrange('myzset', 0, -1)
 
# 获取成员的分数
redis.zscore('myzset', 'member')
  1. 哈希(Hash)

    哈希是一个字符串字段和字符串值之间的映射表,适用于存储小型结构化数据。




# 设置哈希字段
redis.hset('myhash', 'field', 'value')
 
# 获取哈希字段
redis.hget('myhash', 'field')
 
# 获取全部哈希字段和值
redis.hgetall('myhash')
 
# 删除哈希字段
redis.hdel('myhash', 'field')

以上代码是使用Python的redis包进行操作的,需要先安装:




pip install redis

这些操作是Redis中最常用的数据类型操作,在实际应用中,你可以根据需要选择合适的数据类型来存储数据。

2024-09-04

Redis 主从复制用于将一个 Redis 服务器的数据同步到其他服务器,是 Redis 实现数据冗余备份和高可用性的重要机制。

  1. 主从复制配置示例:

在从服务器的配置文件中加入以下设置:




slaveof <master-ip> <master-port>
  1. 哨兵(Sentinel)是 Redis 高可用性解决方案:它能够监控主服务器和其从服务器,并在主服务器出现故障时自动进行故障转移。
  2. 哨兵模式配置示例:

在 sentinel.conf 文件中配置:




sentinel monitor mymaster <master-ip> <master-port> <quorum>
sentinel down-after-milliseconds mymaster <milliseconds>
sentinel parallel-syncs mymaster <numslaves>
sentinel failover-timeout mymaster <milliseconds>
  1. 集群(Cluster)模式通过将数据自动分布在多个节点上来提供更大规模的数据存储和更高的吞吐量。
  2. 集群配置示例:

在 redis.conf 文件中配置:




cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout <milliseconds>
appendonly yes

在启动集群的各个节点时,使用 redis-server --cluster-enabled yes --port <port> --cluster-config-file nodes-<port>.conf --cluster-node-timeout <milliseconds> --appendonly yes --appendfilename appendonly-<port>.aof --dbfilename dump-<port>.rdb --logfile <port>.log 命令。

以上是配置 Redis 主从复制、哨兵和集群的基本示例,具体配置会根据实际需求和环境有所不同。

2024-09-04

Redis和MongoDB是两种不同类型的数据库,它们之间有显著的不同点,包括数据模型、用例、性能和可伸缩性。

  1. 数据模型:

    • Redis:Redis主要使用键值存储模型,适合快速读写操作。
    • MongoDB:MongoDB使用面向文档的模型,适合复杂查询和大量数据的存储。
  2. 用例:

    • Redis:适合用于缓存、队列、排行榜、计数器等实时应用。
    • MongoDB:适合复杂查询、非结构化数据存储、大数据分析等场景。
  3. 性能:

    • Redis:Redis是内存数据库,读写速度快。
    • MongoDB:尽管MongoDB也是内存数据库,但当数据量大时,读写速度可能会下降。
  4. 可伸缩性:

    • Redis:使用Redis Cluster可以实现水平扩展。
    • MongoDB:MongoDB原生支持分片,可以实现大规模数据的分布式存储和扩展。
  5. 成本:

    • Redis:Redis是开源且可以自由使用,但需要额外的硬件成本。
    • MongoDB:MongoDB提供免费版本,对于小型应用足够使用,但对于大型应用可能需要付费版本或云服务。
  6. 持久化存储:

    • Redis:数据可以持久化到磁盘。
    • MongoDB:所有数据默认都在磁盘上,且支持持久化以防止数据丢失。
  7. 复杂查询:

    • Redis:不支持复杂的查询操作。
    • MongoDB:支持复杂的查询操作,包括索引、聚合等。

在选择Redis还是MongoDB时,需要考虑应用需求、数据量、可用性要求和预算等因素。

2024-09-04



# 安装Docker
sudo apt-get update
sudo apt-get install -y docker.io
 
# 启动Redis单机实例
docker run --name my-redis -d redis
 
# 获取Redis容器的IP地址
REDIS_IP=$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' my-redis)
 
# 启动Redis集群实例
docker run --name my-redis-cluster -d -p 7000-7005 redis redis-server --appendonly yes --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --port 7000
 
# 进入Redis集群容器内部
docker exec -it my-redis-cluster /bin/sh
 
# 在容器内部执行Redis集群的创建脚本
redis-cli --cluster create $REDIS_IP:7000 $REDIS_IP:7001 $REDIS_IP:7002 $REDIS_IP:7003 $REDIS_IP:7004 $REDIS_IP:7005 --cluster-replicas 1

这段代码展示了如何使用Docker快速部署单机Redis和Redis集群。首先安装Docker,然后启动单机Redis实例,并获取其IP地址。接着启动Redis集群实例,并通过端口映射暴露出来。最后,进入Redis集群容器,并使用redis-cli命令行工具创建集群,其中--cluster-replicas 1表示每个主节点有一个副本。

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库进行分布式爬取,并且提供了一个简单的模板,方便开发者进行实际项目的爬虫开发。