基于内存的 key-value 键值对 数据库
应用程序和数据库之间的 Redis 相当于 CPU 和内存之间的 Cache。
- 基于内存,读写性能高
- 适合存储热点数据
使用AnotherRedisDesktopManager图形化管理界面
123465
注意:
使用配置文件,则在启动时必须指定所使用的配置文件。如果不使用配置文件,Redis 会使用默认参数运行;
1. 5种常用数据类型
key-value 键值对:key 是字符串类型,value有5常用数据类型:
- 字符串(string):普通字符串,Redis中最简单的数据类型(细分为string,int,float)
- 哈希(hash):也叫散列,类似于Java中的HashMap结构
- 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
- 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
- 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
2. Redis常用命令
2.1 字符串类型常用命令
- SET key value 设置指定key的值
- GET key 获取指定key的值
- SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
- SETNX key value 只有在 key 不存在时设置 key 的值
2.2 哈希操作命令
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:
- HSET key field value 将哈希表 key 中的字段 field 的值设为 value
- HGET key field 获取存储在哈希表中指定字段的值
- HDEL key field 删除存储在哈希表中的指定字段
- HKEYS key 获取哈希表中所有字段
- HVALS key 获取哈希表中所有值
2.3 列表操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
- LPUSH key value1 [value2] 将一个或多个值插入到列表头部
- LRANGE key start stop 获取列表指定范围内的元素
- RPOP key 移除并获取列表最后一个元素
- LLEN key 获取列表长度
- BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止
2.4 集合操作命令
Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
- SADD key member1 [member2] 向集合添加一个或多个成员
- SMEMBERS key 返回集合中的所有成员
- SCARD key 获取集合的成员数
- SINTER key1 [key2] 返回给定所有集合的交集
- SUNION key1 [key2] 返回所有给定集合的并集
- SREM key member1 [member2] 移除集合中一个或多个成员
2.5 有序集合操作命令
Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令:
常用命令:
- ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
- ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
- ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
- ZREM key member [member …] 移除有序集合中的一个或多个成员
2.6 通用命令
Redis的通用命令是不分数据类型的,都可以使用的命令:
- KEYS pattern 查找所有符合给定模式( pattern)的 key
- EXISTS key 检查给定 key 是否存在
- TYPE key 返回 key 所储存的值的类型
- DEL key 该命令用于在 key 存在时删除 key
3 在java中操作Redis
3.1 Redis的Java客户端:
- Jedis
- lettuce
- Spring Data Redis
3.2 Spring Data Redis
使用步骤:
- 导入Spring Data Redis 的maven坐标(一般带上jedis)
- 配置Redis数据源
- 编写配置类,创建RedisTemplate对象
- 通过RedisTemplate对象操作Redis
- 通过redisTemplate对象实例获取所需数据类型的对象,再进行所需操作。
配置类:(序列化器可优化)
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建Redis模版对象");
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
为什么这样写?
- 设置连接工厂:
RedisTemplate
需要一个RedisConnectionFactory
来建立与 Redis 服务器的连接,因此需要将其设置到RedisTemplate
中。 - 设置键的序列化器:Redis 是一个键值对存储系统,键和值 在传输和存储时需要进行序列化。
StringRedisSerializer
是 Spring Data Redis 提供的一个序列化器,用于将键序列化为字符串,这样可以方便地在 Redis 中存储和查询。默认的序列化导致可读性差、内存占用大
API | 返回值类型 | 说明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作 String 类型数据 |
redisTemplate.opsForHash() | HashOperations | 操作 Hash 类型数据 |
redisTemplate.opsForList() | ListOperations | 操作 List 类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作 Set 类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作 SortedSet 类型数据 |
redisTemplate | – | 通用的命令 |
对象存储的序列化问题:
1.自动序列化:
将存储对象的序列化器设置为json对象存储,但是存到redis里为了自动转换会将类的全路径同时存入,造成资源大量浪费,不推荐
2.手动序列化:
解决上述问题,一般手动序列化存储的对象,都已string的类型json的格式存入,如下
示例代码:
@Service
public class UserService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
//springboot依赖传递 jackson 里的序列化工具类
@Autowired
private ObjectMapper objectMapper;
public void saveUser(String key, User user) {
// 手动将对象序列化为 JSON 字符串
String json = objectMapper.writeValueAsString(user);
redisTemplate.opsForValue().set(key, json);
}
public User getUser(String key) {
String json = redisTemplate.opsForValue().get(key);
if (json != null) {
// 手动将 JSON 字符串反序列化为对象
return objectMapper.readValue(json, User.class);
}
return null;
}
}