2024-09-03

Redis 支持五种数据类型:字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。以下是每种数据类型的简单应用场景:

  1. 字符串(String):

    存储单个或少量数据,如会话信息、用户配置文件等。




SET user:1000 "John Doe"
GET user:1000
  1. 列表(List):

    实现队列系统,可以使用 LPUSH/RPUSH 插入数据,使用 LPOP/RPOP 移除数据。




LPUSH recent.articles "Article-100"
LRANGE recent.articles 0 4
  1. 集合(Set):

    实现共同好友、标签系统,可以使用 SADD 添加元素,SMEMBERS 获取所有元素。




SADD user:1000:follows 1001
SMEMBERS user:1000:follows
  1. 有序集合(Sorted Set):

    实现排行榜系统,可以使用 ZADD 添加元素,ZRANGE 获取所有元素。




ZADD scoreboard 100 user:1000
ZRANGE scoreboard 0 -1 WITHSCORES
  1. 哈希(Hash):

    存储结构化数据,如用户的个人资料。




HSET user:1000 name "John Doe"
HGETALL user:1000

以上每种数据类型都有自己的特点和适用场景,开发者可以根据实际需求选择合适的数据类型来应用。

2024-09-03



# 第8天: Redis Exporter安装与部署
 
# 1. 下载并解压redis_exporter
wget https://github.com/oliver006/redis_exporter/releases/download/v0.27.0/redis_exporter_v0.27.0_linux_amd64.tar.gz
tar xvzf redis_exporter_v0.27.0_linux_amd64.tar.gz
 
# 2. 创建一个服务用户
useradd -r -s /bin/false -M redis_exporter
 
# 3. 移动二进制文件到合适的目录
mv redis_exporter /usr/local/bin/
chown redis_exporter:redis_exporter /usr/local/bin/redis_exporter
 
# 4. 创建systemd服务文件
cat << EOF > /etc/systemd/system/redis_exporter.service
[Unit]
Description=Redis Exporter
After=network.target
 
[Service]
User=redis_exporter
Group=redis_exporter
Type=simple
ExecStart=/usr/local/bin/redis_exporter \\
  -redis.addr redis://user:password@localhost:6379/0
 
[Install]
WantedBy=multi-user.target
EOF
 
# 5. 重载systemd以读取新服务文件并启动服务
systemctl daemon-reload
systemctl start redis_exporter.service
systemctl enable redis_exporter.service
 
# 6. 配置Prometheus
# 编辑Prometheus配置文件prometheus.yml,添加redis_exporter作为一个target
# 通常在这个文件中的scrape_configs部分

注意:在实际部署时,需要替换上述代码中的user, password, 和localhost:6379为你的Redis实例的实际访问凭据。同时,确保你的Redis实例配置了适当的访问权限,并且Prometheus服务器能够访问Redis Exporter的端口(默认为9121)。

2024-09-03

Redis的INCRDECR命令用于将存储在key中的数字值增加或减少1。如果key不存在,那么在执行INCR命令前,会先将其值设为0。

这里是INCRDECR命令的基本使用方法:

  • INCR key:将存储在key的数值增加1。如果key不存在,那么在执行操作前,这个key的值会被设置为0。然后执行增加操作。返回值会是新的数值。
  • DECR key:将存储在key的数值减去1。如果key不存在,那么在执行操作前,这个key的值会被设置为0。然后执行减少操作。返回值会是新的数值。

示例代码(使用redis-cli):




# 设置key的初始值
SET mycounter "10"

# 使用INCR命令增加
INCR mycounter
# 此时mycounter的值会变为11

# 使用DECR命令减少
DECR mycounter
# 此时mycounter的值会变为10

在实际应用中,你可以使用这些命令来实现计数器功能,例如记录网页点击次数、实现限流控制等。

2024-09-03

报错解释:

WRONGPASS invalid username-password pair 错误表明你在使用Spring Data Redis时提供了不正确的用户名和密码组合。这通常发生在连接到Redis服务器时,如果服务器配置了访问认证(如使用requirepass指令),而你在客户端配置中提供的凭证不匹配,就会发生此错误。

解决方法:

  1. 检查你的Redis服务器配置文件(通常是redis.conf),查看是否有设置requirepass指令,并确认你使用的密码是否正确。
  2. 检查Spring Data Redis的配置,确保你在配置文件中正确设置了spring.redis.password属性,与你的Redis服务器设置的密码一致。
  3. 如果你使用的是连接池,比如lettuce或jedis,确保连接池配置中的密码也是正确的。
  4. 确认没有任何拼写错误或者不必要的空格在密码中。
  5. 如果你的应用部署在多个环境(开发、测试、生产等),请确保在每个环境中使用正确的Redis凭证。

如果以上步骤都确认无误,但问题依旧,请检查Redis服务器的日志文件,以确定是否有更详细的错误信息可以帮助你解决问题。

2024-09-03

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

  1. 通过配置文件:

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

    
    
    
    save <seconds> <changes>

    将其注释掉即可禁用基于时间的自动保存。例如:

    
    
    
    # save 300 10
  2. 通过运行时命令:

    你可以通过Redis客户端连接到服务器,然后执行以下命令来禁用手动保存:

    
    
    
    config set save ""

    这将清空所有的自动保存规则。

如果你想关闭Redis的持久化功能,可以通过以下方式:

  1. 通过配置文件:

    在配置文件中,可以将持久化相关的所有配置项都注释掉或删除。

  2. 通过运行时命令:

    连接到Redis服务器后,可以执行如下命令:

    
    
    
    config set appendonly no
    config set save ""

    这将关闭AOF持久化和所有的自动保存规则。

请注意,关闭Redis的手动保存和持久化功能可能会导致数据在服务器重启后不会自动恢复。这种做法在生产环境中需要谨慎考虑。

2024-09-03

由于Redis 7.2是最新版本,安装指南可能会随着版本更新而变化。以下是一个基于官方文档的Redis 7.2在Linux上的安装指南:

  1. 下载Redis 7.2:



wget http://download.redis.io/releases/redis-7.2.0.tar.gz
  1. 解压缩:



tar xzf redis-7.2.0.tar.gz
  1. 进入目录:



cd redis-7.2.0
  1. 编译Redis:



make
  1. 运行测试:



make test
  1. 安装Redis:



sudo make install
  1. (可选)安装Redis的可视化工具:



sudo apt-get install redis-tools
  1. 启动Redis服务器:



redis-server
  1. (可选)使用Redis客户端连接服务器:



redis-cli

请注意,这是一个基础安装指南,具体细节可能会根据你的操作系统和环境配置有所不同。如果你遇到任何问题,请参考官方文档或者社区支持。

2024-09-03

在这篇文章中,我们将详细介绍如何部署Redis集群。我们将使用Redis的官方工具redis-trib.rb,它是一个Ruby脚本,用于创建和管理Redis集群。

  1. 环境准备

    确保你的机器上安装了Ruby环境,因为redis-trib.rb是用Ruby编写的。

  2. 获取redis-trib.rb

    你可以从Redis的GitHub仓库中获取redis-trib.rb。




wget https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb
  1. 确保Redis实例运行

    在部署Redis集群之前,你需要至少有6个Redis实例运行在不同的端口上。




redis-server --port 7000
redis-server --port 7001
redis-server --port 7002
redis-server --port 7003
redis-server --port 7004
redis-server --port 7005
  1. 创建Redis集群

    使用redis-trib.rb创建集群。




ruby redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

这个命令会创建一个有3个主节点和3个从节点的集群。

  1. 验证集群

    使用以下命令验证集群是否成功创建并运行。




redis-cli -c -p 7000

然后执行info命令,查看集群信息。




127.0.0.1:7000> info

你应该看到集群信息,包括集群状态为ok。

以上步骤是部署Redis集群的基本步骤。在实际部署时,你可能需要考虑更多的配置选项,如集群节点配置、网络配置、持久化配置等。

2024-09-03



-- 假设有一个Redis的库存数据结构如下:
-- "item:iphone" : 100
-- "sold:iphone" : 50
 
-- 检查库存是否充足
local item_key = "item:iphone"
local sold_key = "sold:iphone"
local requested_quantity = 30
 
-- 获取当前库存和已售出数量
local current_inventory = redis.call("GET", item_key)
local sold_count = redis.call("GET", sold_key)
 
-- 检查是否有足够的库存
if current_inventory - sold_count < requested_quantity then
    return 0 -- 库存不足
else
    -- 扣减库存
    redis.call("INCRBY", sold_key, requested_quantity)
    return 1 -- 库存足够
end

这段Lua脚本用于Redis的事务环境中,可以安全地减少库存,避免超卖现象。它首先检查是否有足够的库存来处理预定的数量,如果有,则通过增加sold:iphone的计数来减少库存。如果库存不足,脚本会返回0,表示没有减少库存。这个脚本是线程安全的,可以用于高并发环境。

2024-09-03



from bloom_filter import BloomFilter
 
# 假设已经有了一个支持元素删除的布隆过滤器
class ScalableBloomFilter(BloomFilter):
    def add(self, item):
        super().add(item)
    
    def remove(self, item):
        self.bit_array[self.hashfuncs[0](item) self.size] = 0
        for i, hash_func in enumerate(self.hashfuncs[1:], 1):
            self.bit_array[hash_func(item) % self.size + i * self.shift] = 0
 
# 使用ScalableBloomFilter解决缓存穿透问题
def cache_response(bf, key, fetch_func):
    if bf.exists(key):  # 如果key存在于布隆过滤器中,直接返回
        return "Data exists in cache."
    elif not bf.exists(key):  # 如果key不存在布隆过滤器中
        data = fetch_func(key)  # 尝试从数据库获取数据
        if data:
            bf.add(key)  # 如果数据存在,添加到布隆过滤器中
            return data
        else:
            bf.add(key)  # 如果数据不存在,添加到布隆过滤器中,避免缓存穿透
            return "Data does not exist."
 
# 示例使用
bf = ScalableBloomFilter(10000, 0.01)
key = "some_key"
 
# 假设这是一个从数据库获取数据的函数
def fetch_data_from_db(key):
    if key == "exist_key":
        return "Data from DB"
    else:
        return None
 
# 缓存响应
response = cache_response(bf, key, fetch_data_from_db)
print(response)

这个代码示例展示了如何使用一个支持元素删除的布隆过滤器来解决缓存穿透的问题。首先,我们定义了一个名为ScalableBloomFilter的类,它继承自BloomFilter并添加了删除元素的功能。然后,我们定义了一个cache_response函数,它使用布隆过滤器来检查键是否存在于缓存中,如果不存在,它会尝试从数据库中获取数据,并相应地更新布隆过滤器。最后,我们演示了如何使用这个函数和过滤器来处理缓存响应。

2024-09-03



# 导入Scrapy相关组件
import scrapy
from scrapy_redis.spiders import RedisSpider
from scrapy_redis.items import RedisItem
 
class DoubanMovieSpider(RedisSpider):
    name = 'douban_movie'
    allowed_domains = ['movie.douban.com']
    redis_key = 'douban_movie:start_urls'
 
    def parse(self, response):
        movie_list = response.css('.grid_view li')
        for movie in movie_list:
            title = movie.css('.title::text').extract_first()
            rating = movie.css('.rating_num::text').extract_first()
            link = movie.css('a::attr(href)').extract_first()
            cover = movie.css('.cover::attr(src)').extract_first()
 
            item = RedisItem()
            item['title'] = title
            item['rating'] = rating
            item['link'] = link
            item['cover'] = cover
 
            yield item
 
        next_page = response.css('.paginator a.next::attr(href)').extract_first()
        if next_page:
            yield response.follow(next_page, self.parse)

这个实战代码实现了一个简单的基于Scrapy-Redis的分布式电影评分TOP250的爬虫。它使用了RedisSpider类替代了scrapy.Spider类,并且定义了一个parse方法来解析电影信息,同时实现了分页的处理。这个代码示例是分布式爬虫的入门级别,适合学习如何利用Scrapy-Redis进行有效的网络数据爬取。