目录
[2.1String 字符串](#2.1String 字符串)
[1. 字符串 (String)](#1. 字符串 (String))
[2. 哈希 (Hash)](#2. 哈希 (Hash))
[3. 列表 (List)](#3. 列表 (List))
[4. 集合 (Set)](#4. 集合 (Set))
[5. 有序集合 (Sorted Set)](#5. 有序集合 (Sorted Set))
一,基础篇
1.介绍
Redis 是一个非常流行的开源键值(Key-Value)存储系统Redis,是用C语言开发的一个基于内存的键值对数据库 ,它具有以下特点:
①.高性能:
Redis 提供了非常高的读写速度,每秒可以处理数万次的读写操作。
由于其主要数据结构都存放在内存中,所以访问速度极快。
②.数据结构丰富:
支持多种数据类型如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等。
这些数据结构非常适合用于实现缓存、消息队列、排行榜等多种应用场景。
③.持久化支持:
Redis 支持两种持久化机制:RDB(Redis Database Backup)和 AOF(Append Only File)。
RDB 会在指定的时间间隔内生成数据集的时间点快照。
AOF 会记录每次写入操作,当 Redis 重启时可以通过重放这些写入操作来恢复数据。
④.主从复制:
Redis 支持主从复制,可以轻松搭建高可用架构。
主服务器可以同步数据到一个或多个从服务器,从服务器可以作为备份或者用来分担读取负载。
⑤.事务支持:
Redis 支持事务,可以将多个命令打包成一个单独的序列化操作执行。
事务中的命令会按顺序执行,但不保证原子性。
⑥.Lua 脚本支持:
Redis 内置了对 Lua 脚本的支持,可以在单个请求中执行复杂的操作,提高性能并减少网络往返次数。
⑦.发布/订阅模式:
Redis 支持发布/订阅模式,客户端可以订阅频道接收消息,也可以向频道发布消息。
⑧.跨平台:
Redis 使用 ANSI C 编写,可以在多个操作系统上运行,包括 Linux 和 macOS。
⑨.多语言客户端:
Redis 提供了多种语言的客户端库,方便不同编程语言的应用程序进行集成。
使用场景:
- 缓存:作为数据库查询结果的缓存层。
- 会话存储:存储用户的会话数据。
- 消息队列:利用列表结构实现消息队列。
- 实时分析:例如统计在线用户数量。
- 分布式锁:通过设置过期时间的键来实现简单的分布式锁机制。
2.安装与下载
第一步:下载 Redis中文网https://www.redis.net.cn/ 第二步:安装
目录或文件 | 作用 |
---|---|
redis-benchmark | 性能测试工具 |
redis-check-aof | AOF文件修复工具 |
redis-check-dump | RDB文件检查工具(快照持久化文件) |
redis-cli | 命令行客户端 |
redis-server | 启动redis服务器 |
redis.windows.conf | redis核心配置文件 (可以通过修改 requirepass 后的默认值修改密码) |
第三步:启动服务
出现该标识证明服务启动成功
3.客户端的使用
通过简单的配置可以通过客户端操作Redis
4.补充重点
键值 <String,5种数据类型>
Redis采用的是键值对存储,键的类型只能为字符串,值支持五种数据类型
-
字符串(string):普通字符串,Redis中最简单的数据类型
-
哈希(hash):也叫散列,类似于Java中的HashMap结构
-
列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
-
集合(set):无序集合,没有重复元素,类似于Java中的HashSet
-
有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
二,命令篇
2.1String 字符串
字符串类型是Redis中最为基础的数据存储类型。
sql* 增加数据:set key value * 获取数据:get key * 删除数据:del key * 增加数据的时候设置过期时间:setex key 存活时间(单位是s) value * 增加的时候判断可以是否存在:setnx key value * 自增(减)操作:incr/decr key incrby/decrby key step
操作演示:
1.增加数据:set key value
2.获取数据与删除数据
获取数据:get key
删除数据:del key通过再次查询发现数据成功被删除
3.设置过期时间
setex key 存活时间(单位是s) value
4.增加时判断是否存在
setnx key value
5.自增与自减
自增(减)操作:incr/decr key incrby/decrby key step
2.2.Hash哈希
Hash类型极其类似于java中的Map,值里面可以存放一组组的键值对,该类型非常适合于存储对象类型的信息。
sql* 增加数据:hset key hkey hvalue * 获取数据(单个):hget key hkey * 获取数据(所有):hgetall key * 获取所有hkey: hkeys key * 获取所有hvalue: hvals key * 删除数据(单个): hdel key hkey * 删除数据(所有): del key
操作演示:
1.增加数据
增加数据:hset key hkey hvalue
2.获取:数据,hkeys,hvals
获取数据(单个):hget key hkey 获取数据(所有):hgetall key
获取所有hkey: hkeys key 获取所有hvalue: hvals key
3.删除数据
删除数据(单个): hdel key hkey
从列表中可以看出:name,age,sex 变为只有 age,sex删除数据(所有): del key
从列表中可以看出已经没有a的数据
2.3.List列表
List类型底层是一个双向字符串链表,里面的元素是
有序的,可重复的
,我们可以从链表的任何一端进行元素的增删。
sql* 添加数据:lpush(rpush) key value * 查询数据:lrange key [开始索引 结束索引] * 列表长度:llen key * 删除数据:lpop(rpop) key * 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止:BRPOP key timeout
操作演示:
1.数据的添加与查询
- 添加数据:lpush(rpush) key value
- 查询数据:lrange key [开始索引 结束索引]
列表长度:llen key
2.删除数据
- 删除数据:lpop(rpop) key
- 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止:BRPOP key timeout
初始list 删除后
2.4.Set集合
Set类型底层是一张hash表,里面的元素是无序的,不可重复的。
sql* 添加数据:sadd key value * 查看数据:smembers key * 获取元素数量:scard key * 移除集合元素:srem key value
操作演示:
1.数据的添加与查询
- 添加数据:sadd key value
- 查看数据:smembers key
- 获取元素数量:scard key
2.数据的移除
移除集合元素:srem key value
2.5.ZSet集合
ZSet,也称sortedSet,在Set的基础上,加入了有序功能,在添加元素的时候,允许指定一个分数,它会按照这个分数排序。
sql* 添加数据:zadd key score value * 查询数据:zrange key [开始索引 结束索引] * 删除数据:zrem key value
操作演示:
1.数据的添加与查询
- 添加数据:zadd key score value
- 查询数据:zrange key [开始索引 结束索引] 以0为初始节点
2.数据的删除
删除数据:zrem key value
首先用大于集合长度的范围查询集合中元素 可以看出集合中只有 a,b,c
2.6通用命令
通用命令指的是不受数据类型限制的一批命令
sql1. 模糊查询键:keys 模糊匹配规则 2. 根据键判断记录是否存在:exists key 3. 根据键判断值类型:type key 4. 返回key的剩余生存时间:TTL key 5. 选择数据库: select 库索引[从0开始] 6. 清空当前数据库: flushdb 7. 清空所有数据库: flushall
操作演示:
三,Java操作篇
定义:
Redis提供了多种数据结构,每种数据结构都有其特定的使用场景。在 Java 中,通常使用 Redis 客户端库来与 Redis 交互。常见的 Redis 客户端有 Jedis 和 Lettuce,还有 Spring Data Redis 等高级封装。
环境配置:
1.添加依赖
在 pom.xml 文件中添加 Spring Boot 的 Redis Starter 依赖:
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.添加配置项
在 application.properties 或 application.yml 文件中配置 Redis 的基本信息:
XML
spring:
redis:
host: localhost
port: 6379
password: 1234
database: 0 # 操作的是0号数据库
3.提供配置类
创建一个配置类来配置 RedisTemplate 和 StringRedisTemplate:
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
private final RedisConnectionFactory factory;
public RedisConfig(RedisConnectionFactory factory) {
this.factory = factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置 key 和 value 的序列化方式
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
template.afterPropertiesSet();
return template;
}
@Bean
public RedisTemplate<String, String> stringRedisTemplate() {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置 key 和 value 的序列化方式
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
实现示例:
1. 字符串 (String)
字符串是最简单的数据类型,可以用来存储简单的键值对。
实现示例:
java
import redis.clients.jedis.Jedis;
public class StringExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 设置 key-value
jedis.set("key", "value");
// 获取 value
String value = jedis.get("key");
System.out.println("Value: " + value);
// 关闭连接
jedis.close();
}
}
2. 哈希 (Hash)
哈希允许将多个字段值映射存储在一个键下。
实现示例:
java
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class HashExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 设置 hash
Map<String, String> fields = new HashMap<>();
fields.put("field1", "value1");
fields.put("field2", "value2");
jedis.hset("hashKey", fields);
// 获取所有字段
Map<String, String> allFields = jedis.hgetAll("hashKey");
System.out.println("All Fields: " + allFields);
// 关闭连接
jedis.close();
}
}
3. 列表 (List)
列表是按照插入顺序排列的字符串集合。
实现示例:
java
import redis.clients.jedis.Jedis;
public class ListExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 向列表添加元素
jedis.lpush("listKey", "element1", "element2");
// 获取列表中的所有元素
List<String> elements = jedis.lrange("listKey", 0, -1);
System.out.println("Elements: " + elements);
// 关闭连接
jedis.close();
}
}
4. 集合 (Set)
集合是无序且不重复的字符串集合。
实现示例:
java
import redis.clients.jedis.Jedis;
public class SetExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 添加元素到集合
jedis.sadd("setKey", "element1", "element2", "element1");
// "element1" 重复,只存储一次
// 获取集合中的所有元素
Set<String> members = jedis.smembers("setKey");
System.out.println("Members: " + members);
// 关闭连接
jedis.close();
}
}
5. 有序集合 (Sorted Set)
有序集合类似于集合,但是每个成员都关联了一个分数,用于排序。
实现示例:
java
import redis.clients.jedis.Jedis;
public class SortedSetExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 添加元素到有序集合
jedis.zadd("sortedSetKey", 1.0, "element1");
jedis.zadd("sortedSetKey", 2.0, "element2");
// 获取有序集合中的所有元素
Set<String> sortedMembers = jedis.zrange("sortedSetKey", 0, -1);
System.out.println("Sorted Members: " + sortedMembers);
// 关闭连接
jedis.close();
}
}