Redis基础

目录

一,基础篇

1.介绍

2.安装与下载

3.客户端的使用

4.补充重点

二,命令篇

[2.1String 字符串](#2.1String 字符串)

操作演示:

2.2.Hash哈希

操作演示:

2.3.List列表

操作演示:

2.4.Set集合

操作演示:

2.5.ZSet集合

操作演示:

2.6通用命令

操作演示:

三,Java操作篇

定义:

环境配置:

实现示例:

[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通用命令

通用命令指的是不受数据类型限制的一批命令

sql 复制代码
 1. 模糊查询键: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();
    }
}
相关推荐
竹影卿心19 分钟前
Java连接HANA数据库
java·数据库·windows
anddddoooo22 分钟前
Kerberoasting 离线爆破攻击
网络·数据库·安全·microsoft·网络安全
time never ceases1 小时前
Elasticsearch安装和数据迁移
大数据·数据库·elasticsearch·es
tatasix1 小时前
Go Redis实现排行榜
开发语言·redis·golang
程序员shen1616111 小时前
注意⚠️:矩阵系统源码开发/SaaS矩阵系统开源/抖音矩阵开发优势和方向
java·大数据·数据库·python·php
IvorySQL1 小时前
2024 开放原子开发者大会活动回顾|瀚高 IvorySQL 开源数据库在国产软件的开源实践
数据库·postgresql·开源数据库·国产数据库·ivorysql
云计算DevOps-韩老师2 小时前
【网络云计算】2024第52周-每日【2024/12/26】小测-理论&实操-备份MySQL数据库并发送邮件-解析
linux·开发语言·网络·数据库·mysql·云计算·perl
2401_850410832 小时前
redis的持久化
数据库·redis·bootstrap
如雨随行20202 小时前
Mysql事务
数据库·mysql·oracle
Java雪荷2 小时前
基于 Vant UI + Redisson BitSet 实现签到日历
java·redis·vue