2024-09-02

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

基本部署

1. 下载和安装




# 下载
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
# 编译
make

2. 运行 Redis 服务器




# 运行
src/redis-server

3. 运行 Redis 客户端




# 新开一个终端,进入redis目录
# 运行
src/redis-cli
# 测试
ping

如果返回 PONG,则表示 Redis 安装成功并可以正常使用。

基本命令

1. 设置键值对




SET key value

2. 获取键对应的值




GET key

3. 删除键




DEL key

4. 检查键是否存在




EXISTS key

5. 设置键的过期时间




EXPIRE key seconds

6. 列出所有键




KEYS *

7. 获取键的数据类型




TYPE key

进阶应用

Redis 支持复杂的数据结构,如字符串、列表、集合、有序集合、哈希表等。

8. 使用列表(list)




# 在列表左侧插入元素
LPUSH key value
# 在列表右侧插入元素
RPUSH key value
# 获取列表指定范围内的元素
LRANGE key start stop

9. 使用集合(set)




# 添加成员
SADD key member
# 获取集合所有成员
SMEMBERS key

10. 使用有序集合(sorted set)




# 添加成员及其分数
ZADD key score member
# 获取有序集合范围内成员
ZRANGE key start stop

11. 使用哈希表




# 设置哈希表字段的值
HSET key field value
# 获取哈希表中字段的值
HGET key field
# 获取哈希表中所有字段及值
HGETALL key

持久化

Redis 支持两种持久化方式:RDB(默认)和 AOF。

12. RDB 持久化

定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。

13. AOF 持久化

记录每个写操作,将它们追加到文件中。

可以在 redis.conf 中配置持久化。

高级特性

14. 发布/订阅




# 发布消息
PUBLISH channel message
# 订阅频道
SUBSCRIBE channel

15. 事务




# 开启事务
MULTI
# 将多个命令入队到事务中
...
# 执行事务
EXEC

16. Lua 脚本




# 执行Lua脚本
EVAL script key
2024-09-02

Redis主从复制是一种可以让从服务器(replica)从主服务器(master)上复制数据的技术。

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

  1. 在主服务器的redis.conf文件中,确保以下配置项被设置:



bind 0.0.0.0
port 6379
  1. 在从服务器的redis.conf文件中,确保以下配置项被设置:



bind 0.0.0.0
port 6380
  1. 在从服务器的redis.conf文件中,使用slaveof指令指定主服务器的IP和端口:



slaveof <master-ip> <master-port>

例如,如果主服务器的IP是192.168.1.100,端口是6379,从服务器的配置应该是:




slaveof 192.168.1.100 6379
  1. 启动主服务器和从服务器的Redis实例。

一旦配置完成并启动了Redis实例,主从复制将自动开始。从服务器会连接到主服务器,并开始接收来自主服务器的数据更新。

注意:在生产环境中,为了数据安全,建议设置密码验证来保护Redis实例,同时也可以考虑使用更复杂的配置,例如哨兵模式(Sentinel)或者集群模式(Cluster)来提供高可用性和数据分布。

2024-09-02

在Spring中配置Redis集群,你可以使用RedisClusterConfiguration类来设置集群的节点和其他属性。以下是一个配置Redis集群的示例:




import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
 
import java.util.HashSet;
import java.util.Set;
 
@Configuration
public class RedisClusterConfig {
 
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration();
        clusterConfig.setClusterNodes(new HashSet<>(Set.of(
                new RedisNode("127.0.0.1", 7000),
                new RedisNode("127.0.0.1", 7001),
                new RedisNode("127.0.0.1", 7002))));
        clusterConfig.setMaxRedirects(3);
 
        return new LettuceConnectionFactory(clusterConfig);
    }
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

在这个配置中,我们定义了一个RedisClusterConfiguration实例,并通过setClusterNodes方法设置了集群节点的信息。RedisNodeRedisClusterConfiguration中的一个内部类,代表单个节点。Set.of是Java 9及以上版本的新特性,用于创建不可变集合。

maxRedirects属性设置了在集群环境中执行命令时,如果因为节点迁移导向新节点的最大重定向次数。

redisConnectionFactory方法返回一个LettuceConnectionFactory实例,它使用了我们配置好的集群配置。

redisTemplate方法返回一个RedisTemplate实例,它使用了刚才定义的LettuceConnectionFactory。这个模板可以用来操作Redis集群。

2024-09-02

"Redis的47连环炮" 这个表述可能是一个误导性的说法,因为Redis并没有47连环炮这样的概念。如果你是在谈论Redis的47条命令,这是一个常见的测试,目的是检查开发者对Redis的理解程度。

关于前端项目文档,一般包括以下几个部分:

  1. 项目介绍
  2. 技术栈说明
  3. 安装和运行指南
  4. 使用文档
  5. 常见问题解答
  6. 更新日志
  7. 贡献指南

以下是一个简单的前端项目文档模板:




# 项目名称
这是一个前端项目的简单说明。
 
## 技术栈
- 前端框架:例如React, Vue, Angular
- 构建工具:例如Webpack, Parcel
- 状态管理:例如Redux, Vuex, NgRx
 
## 安装和运行
1. 克隆项目到本地:`git clone [项目仓库地址]`
2. 进入项目目录:`cd 项目名称`
3. 安装依赖:`npm install` 或 `yarn install`
4. 运行项目:`npm start` 或 `yarn start`
 
## 使用文档
项目中使用的各种组件、库的使用方法。
 
## 常见问题解答
问题1:如何解决构建时的某个错误?
答案:可以通过以下步骤解决:
 
1. 清理缓存:`npm run clean` 或 `yarn clean`
2. 删除 `node_modules` 文件夹:`rm -rf node_modules`
3. 重新安装依赖:`npm install` 或 `yarn install`
4. 重新构建项目:`npm start` 或 `yarn start`
 
## 更新日志
- **[Add]** 新功能A
- **[Change]** 变更B,可能对用户体验有影响
- **[Fix]** 修复C,影响了用户的使用
 
## 贡献指南
如果你想为这个项目做出贡献,请先阅读[贡献指南](CONTRIBUTING.md)。

这个模板提供了一个简洁的文档结构,涵盖了项目介绍、技术栈、安装运行、使用文档、常见问题解答、更新日志和贡献指南等方面。在实际应用中,可以根据项目的具体情况进行详细编写。

2024-09-02

Redis的HyperLogLog是一种用于估算集合中元素数量的数据结构。它可以接受输入元素,并且只需要极小的存储空间。

HyperLogLog的基本命令包括:

  • PFADD key element [element ...]:添加元素到HyperLogLog中。
  • PFCOUNT key [key ...]:返回一个或多个HyperLogLog的基数估算值。
  • PFMERGE destkey sourcekey [sourcekey ...]:将多个HyperLogLog合并为一个。

HyperLogLog的基本原理是通过一种算法来减少内存的使用,该算法包括一个基数估算的因子,并且在输入数据集中使用哈希函数来生成一系列索引。当需要计算数量时,HyperLogLog会根据这些索引进行估算。

下面是一个使用Redis命令行的简单示例:




# 添加元素到HyperLogLog结构
127.0.0.1:6379> PFADD myhyperloglog a b c d e
(integer) 1

# 估算HyperLogLog的基数
127.0.0.1:6379> PFCOUNT myhyperloglog
(integer) 5

# 合并两个HyperLogLog
127.0.0.1:6379> PFADD anotherhyperloglog f g h
(integer) 1
127.0.0.1:6379> PFMERGE mergedhyperloglog myhyperloglog anotherhyperloglog
OK
127.0.0.1:6379> PFCOUNT mergedhyperloglog
(integer) 8

在实际应用中,HyperLogLog通常用于日志记录、数据统计和在大数据量下的计数问题。由于其内存高效,HyperLogLog非常适合用于大规模数据的计数和统计。

2024-09-02

在Java中,使用RedisTemplateopsForHash()方法可以操作Redis中的哈希类型数据。delete方法用于删除指定哈希中的一个或多个键。

以下是delete方法的基本使用示例:




import org.springframework.data.redis.core.RedisTemplate;
import java.util.List;
 
public class RedisHashExample {
    private RedisTemplate<String, String> redisTemplate;
 
    public RedisHashExample(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
 
    public void deleteHashKeys(String hashKey, List<String> keys) {
        redisTemplate.opsForHash().delete(hashKey, keys.toArray(new String[0]));
    }
}

在这个例子中,deleteHashKeys方法接受一个哈希键(hashKey)和一个键列表(keys),然后使用delete方法从指定的哈希中删除这些键。redisTemplate.opsForHash().delete接受一个哈希键和一个键数组,表示要删除的键的集合。

注意:RedisTemplate需要正确配置序列化器以确保键和值能正确地序列化和反序列化。

2024-09-02



# 安装Python
sudo apt-get update
sudo apt-get install python3
sudo apt-get install python3-pip
 
# 配置Linux网络(以配置静态IP为例)
sudo nano /etc/netplan/01-netcfg.yaml
 
# 输入以下内容,替换为你的网络配置
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.10/24
      gateway4: 192.168.1.1
      nameservers:
          addresses: [8.8.8.8, 8.8.4.4]
 
# 应用网络配置
sudo netplan apply
 
# 安装和运行Redis
sudo apt-get install redis-server
sudo systemctl start redis-server
sudo systemctl enable redis-server
 
# 安装MongoDB
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod

以上代码提供了在Ubuntu系统上从源码安装Python、配置静态IP地址、安装和启动Redis服务以及安装和启动MongoDB服务的示例。注意,这些命令需要在终端中以root用户或使用sudo执行。

2024-09-02

在Spring Boot中集成Redis时使用RedisTemplate配置泛型可能会导致类型转换异常,因为RedisTemplate默认使用JdkSerializationRedisSerializer作为序列化器,它会对对象进行二进制序列化。

解决方法:

  1. 使用StringRedisTemplate而不是RedisTemplate,它默认使用String作为键和值的序列化方式。
  2. 如果需要使用RedisTemplate并且希望使用自定义的序列化器,可以在配置中指定:



@Configuration
public class RedisConfig {
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
 
        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
 
        // 配置value的序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // 配置key的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
 
        template.afterPropertiesSet();
        return template;
    }
}

在这个配置中,我们使用了Jackson2JsonRedisSerializer作为值的序列化器,并且通过ObjectMapper的配置来允许多态查找。注意,键仍然使用了StringRedisSerializer

确保你的实体类都标注了适当的Jackson注解,例如@JsonTypeInfo@JsonSubTypes来支持多态反序列化。

2024-09-02

对于Redis抖动问题,可以采取以下措施来减少其对系统的影响:

  1. 健壮的重试逻辑:当Redis连接断开时,应用程序应该能够尝试重新连接。
  2. 合理的超时设置:调整客户端的连接超时设置,以便在网络抖动时能够更长时间地保持连接。
  3. 分布式部署:如果可能,使用Redis集群或哨兵模式来提高系统的可用性。
  4. 监控和日志记录:对Redis的健康状况进行监控,并记录日志,以便发现问题。
  5. 客户端选择:选择稳定性较好的Redis客户端库,比如StackExchange.Redis,并关注最新版本的更新。

以下是一个简单的示例代码,展示了如何在使用StackExchange.Redis客户端时处理重试逻辑:




var redis = ConnectionMultiplexer.Connect("localhost");
var db = redis.GetDatabase();
 
while (true)
{
    try
    {
        // 尝试执行操作
        var value = db.StringGet("mykey");
        // 如果成功,则退出循环
        break;
    }
    catch (Exception ex)
    {
        // 如果发生异常,记录日志
        Log.Error("Redis operation failed, retrying...", ex);
        // 等待一段时间后再次尝试
        Thread.Sleep(1000); // 等待1秒
    }
}

在实际应用中,重试的间隔时间和次数应根据实际情况进行调整,并结合具体的服务质量(QoS)策略。

2024-09-02

在Ubuntu 20.04上安装Docker并运行MySQL和Redis的命令如下:

  1. 更新软件包索引:



sudo apt update
  1. 安装Docker:



sudo apt install docker.io
  1. 启动Docker服务:



sudo systemctl start docker
sudo systemctl enable docker
  1. 运行MySQL容器:



sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

tag替换为你想要的MySQL版本标签,如5.78.0latest

  1. 运行Redis容器:



sudo docker run --name redis -d redis

以上命令假设你已经安装了Docker并且它正在运行。如果你需要安装Docker并且运行MySQL和Redis,你可以将上述步骤串联起来,不需要分开执行。