ToB企服应用市场:ToB评测及商务社交产业平台

标题: redis常用知识汇总(包括 jedis 和 springboot 整合 redis) [打印本页]

作者: 王國慶    时间: 2024-9-9 14:30
标题: redis常用知识汇总(包括 jedis 和 springboot 整合 redis)
先容

Redis 是一个开源的内存数据库,它支持多种数据结构,并且常用于高速缓存、会话管理、消息队列等场景。Redis 的全称是 Remote Dictionary Server,是一种 key-value(键值对)存储系统,能够以极高的性能处理大量数据的读写操纵。
Redis 的主要特点:

1、Redis 根本配置

Redis 的配置文件通常定名为 redis.conf,存放在 Redis 安装目录中。通过修改该文件,可以自定义 Redis 的各种行为。
配置文件位置

关键配置选项

1. 端口号

2. 绑定地址

3. 守护进程模式

4. 暗码保护

5. RDB 快照文件

启动和使用 Redis 配置

2、Redis 的通用下令

除了与数据结构相关的下令外,Redis 还提供了一些通用下令,用于管理 Redis 实例、数据操纵和服务器配置。
3、Redis 的数据结构

Redis 是一个高性能的键值存储系统,支持多种复杂的数据结构。这些数据结构使得 Redis 不仅可以作为简单的缓存,还能满意更多样化的数据存储需求。以下是 Redis 支持的主要数据结构:
字符串(String )

String 是 Redis 中最根本的数据类型,每个键对应一个字符串类型的值(value)。
常见下令

哈希(Hash )

Hash 是 Redis 中的一种用于存储键值对的聚集。它类似于编程语言中的哈希表或字典。一个 Hash 里可以存储多个字段和值,因此非常适合存储对象。
常见下令

列表(List)

列表是一个有序的字符串聚集,可以在聚集的头部或尾部插入、删除元素。适合用于实现消息队列等功能。
常见下令

聚集(Set)

聚集是无序的字符串聚集,不答应重复元素。适合用于存储必要唯一性的聚集,如标签、用户脚色等。
常见下令

有序聚集(Sorted Set)

有序聚集类似于聚集,但每个元素都会关联一个分数,元素按分数举行排序。适合用于排名、评分系统等场景。
常见下令

Jedis 是一个用于与 Redis 数据库交互的 Java 客户端库。通过 Jedis,你可以在 Java 应用程序中执行各种 Redis 操纵,如增删改查等。Jedis 提供了一组简单易用的 API,使开发者可以轻松地将 Redis 集成到他们的 Java 应用程序中。
" :  "的作用

在 Redis 中,冒号 ( 用于创建键名的层级结构,以帮助构造和管理数据。例如,user:1000:name 表示用户 ID 为 1000 的名字,order:5000:status 表示订单 ID 为 5000 的状态。使用冒号可以让数据看起来像路径一样分层,便于分类和查询。
假设你在存储用户信息和订单信息:
这里,user: 和 order: 是前缀,用于区分不同类型的数据,而冒号 : 用于分隔不同的层级。
4、jedis

Jedis 是一个用于与 Redis 数据库交互的 Java 客户端库。通过 Jedis,你可以在 Java 应用程序中执行各种 Redis 操纵,如增删改查等。Jedis 提供了一组简单易用的 API,使开发者可以轻松地将 Redis 集成到他们的 Java 应用程序中。
Jedis 的根本用法

  1. import redis.clients.jedis.Jedis;
  2. import redis.clients.jedis.JedisPool;
  3. import redis.clients.jedis.JedisPoolConfig;
  4. public class JedisConnectionFactory {
  5.     private static final JedisPool jedisPool;
  6.     static {
  7.         // 配置连接池
  8.         JedisPoolConfig poolConfig = new JedisPoolConfig();
  9.         poolConfig.setMaxTotal(8);         // 最大连接数
  10.         poolConfig.setMaxIdle(8);          // 最大空闲连接数
  11.         poolConfig.setMinIdle(0);          // 最小空闲连接数
  12.         poolConfig.setMaxWaitMillis(1000); // 最大等待时间
  13.         // 创建连接池对象
  14.         jedisPool = new JedisPool(poolConfig,
  15.                                   "127.0.0.1", // Redis 主机地址
  16.                                   6379,              // Redis 端口号
  17.                                   1000,              // 超时时间
  18.                                   "yourPassword");         // Redis 密码
  19.     }
  20.     public static Jedis getJedis() {        // 通过这个方法在pool中获取jedis
  21.         return jedisPool.getResource();
  22.     }
  23. }
复制代码
参数说明:

5、SpringDataRedis

Spring Data Redis 是 Spring Data 生态系统中的一个模块,提供与 Redis 的简便集成。Redis 是一个高性能的内存键值存储,Spring Data Redis 通过提供简单、同等和声明式的方式,简化了与 Redis 的交互,将低级别的 Redis 操纵抽象为高级 API 和模板。
1、预备工作

添加依赖

常见配置

  1. spring:
  2.   data:
  3.     redis:
  4.       # Redis 服务器的主机地址
  5.       host: localhost
  6.       # Redis 服务器的端口
  7.       port: 6379
  8.       # 配置 Redis 连接池(Lettuce 使用的连接池)
  9.       lettuce:
  10.         pool:
  11.           # 连接池中最大活动连接数
  12.           max-active: 8
  13.           # 连接池中最大空闲连接数
  14.           max-idle: 8
  15.           # 连接池中最小空闲连接数
  16.           min-idle: 0
  17.           # 连接池中最大等待时间
  18.           max-wait: 100ms
  19.       # Redis 数据库索引(默认为 0,Redis 默认提供 16 个数据库)
  20.       database: 0
  21.       # Redis 服务器的密码,用于身份验证
  22.       password: yourpassword
复制代码
配置结果

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.data.redis.connection.RedisConnectionFactory;
  4. import org.springframework.data.redis.core.RedisTemplate;
  5. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  6. import org.springframework.data.redis.serializer.StringRedisSerializer;
  7. @Configuration
  8. public class RedisConfig {
  9.     @Bean
  10.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  11.         // 创建RedisTemplate对象
  12.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  13.         // 设置连接工厂
  14.         template.setConnectionFactory(connectionFactory);
  15.         // 使用 StringRedisSerializer 代替 GenericJackson2JsonRedisSerializer
  16.         //  GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  17.         StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  18.         GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  19.         // 设置key的序列化
  20.         template.setKeySerializer(stringRedisSerializer);
  21.         template.setHashKeySerializer(stringRedisSerializer);
  22.         template.setValueSerializer(genericJackson2JsonRedisSerializer);
  23.         template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
  24.         return template;
  25.     }
  26. }
复制代码
2、对数据的操纵

Spring Data Redis 提供了一组 API 用于操控 Redis 数据库。以下是一些常用的 API 及其详细说明:
1. 字符串操纵 (String)

2. 哈希操纵 (Hash)

3. 列表操纵 (List)

4. 聚集操纵 (Set)

5. 有序聚集操纵 (Sorted Set)

3、RedisTemplate 和 StringRedisTemplate

1. RedisTemplate

RedisTemplate 是一个泛型类,能够处理不同类型的键和值。你可以指定键和值的序列化方式,以及 Redis 数据的类型(如 String, Object, Hash, List, Set, ZSet 等)。
主要特点:

2. StringRedisTemplate

StringRedisTemplate 是 RedisTemplate 的一种特化版本,它专门用于操纵 String 类型的键和值。它默认使用 StringRedisSerializer 来对键和值举行序列化和反序列化,因此只处理 String 数据类型。
主要特点:

3. 区别总结

特性RedisTemplateStringRedisTemplate支持的键和值类型支持任何类型(如 String, Object, Integer 等)只支持 String 类型的键和值序列化方式必要手动配置序列化器(可以选择 JSON、JDK 序列化等)默认使用 StringRedisSerializer,无需额外配置适用场景适用于复杂的数据类型,如 Object、JSON 等。适用于简单的 String 类型数据操纵。示例1:

图一是通过 RedisTemplate 存到 redis 中的 JSON 字符串,图二是通过 StringRedisTemplate 存到redis 中的 JSON 字符串,由于 RedisTemplate 能够实现 自动的反序列化,所以必要存储多余的 @class 信息,会造成内存的浪费。


示例2:

观察下图有 @Test 注解的代码
  1. // Uesr类
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9.     String name;
  10.     Integer age;
  11. }
  12. // 测试
  13. @Autowired
  14.     private RedisTemplate<String, Object> redisTemplate;
  15.     @Autowired
  16.     private StringRedisTemplate stringRedisTemplate;
  17.    
  18. @Test
  19.     void insertUser() {
  20.         User user = new User("world", 1);
  21.         redisTemplate.opsForValue().set("user:1", user);    // 自动将JAVA对象序列换成JSON格式的字符串
  22.         User myuser = (User) redisTemplate.opsForValue().get("user:1"); // 自动反序列化,将JSON格式的字符串转换成JAVA对象
  23.         System.out.println("myuser = " + myuser);
  24.     }
  25. @Test
  26.     void insertUser2() {
  27.         User user = new User("world", 2);
  28.         String jsonUser = JSON.toJSONString(user);  // 手动序列化成JSON格式的字符串
  29.         stringRedisTemplate.opsForValue().set("user:1", jsonUser);
  30.         String str = stringRedisTemplate.opsForValue().get("user:1");
  31.         System.out.println("str = " + str);
  32.         User myuser = JSON.parseObject(str, User.class);    // 手动从JSON格式的字符串转换成JAVA对象
  33.         System.out.println("myuser = " + myuser);
  34.     }
复制代码
下面两张图分别是第一个Test和第二个Test输出的结果


通过上面图可以清晰的看到 RedisTemplate 会自动系列化JSON格式字符串和反序列化成JAVA对象,但是 StringRedisTemplate 都必要手动处理
6、增补

上面用到的JSON处理库是 fastjson2, 可在 maven 官网 下载依赖

fastjson 常见用法
  1. // 将 Java 对象序列化为 JSON 字符串
  2. String jsonString = JSON.toJSONString(user);
  3.         
  4. // 将 JSON 字符串反序列化为 Java 对象
  5. User deserializedUser = JSON.parseObject(jsonString, User.class);
  6. // 创建一个 JSONObject
  7. JSONObject jsonObject = new JSONObject();
  8. jsonObject.put("name", "John");
  9. // 转换成JSON字符串
  10. jsonObject.toString()
  11. // 解析 JSON 字符串
  12. String jsonString = "{"name":"ld","age":18,"city":"ShangHai"}";
  13. JSONObject parsedObject = JSONObject.parseObject(jsonString);
  14. // 获取value, 输出 ld
  15. System.out.println("Name: " + parsedObject.getString("name"));
复制代码
临时更到这里 ... 后面再补

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4