首页 > 数据库 >Redis的五种基本类型和业务场景和使用

Redis的五种基本类型和业务场景和使用

时间:2024-10-10 16:51:34浏览次数:3  
标签:场景 redis 配置 Redis springframework 五种 org import redisTemplate

目录

Redis是什么?

Redis的特点

依赖

配置

redis的配置类(用于格式转换,处理乱码)

String(字符串)

特点

业务场景

代码使用案例

List(列表)

特点

业务场景

代码使用案例

Set(集合)

特点

业务场景

代码使用案例

Hash(哈希表)

特点

业务场景

代码使用案例

Sorted Set(有序集合)

特点

业务场景

代码使用案例


Redis是什么?

         Redis是非关系性数据库,Redis 是一个开源的高性能键值数据库,主要用于数据存储和缓存。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。

Redis的特点

  1. 丰富的数据类型‌:Redis不仅支持字符串类型的键值对,还支持列表、哈希、集合和有序集合等多种数据结构,这使得Redis能够处理更复杂的数据操作‌23。
  2. 高性能‌:由于数据存储在内存中,Redis能够提供极高的读写速度,适用于需要高速响应的场景‌12。
  3. 持久化功能‌:Redis支持将内存中的数据周期性地写入磁盘,确保数据的安全性,同时也支持将修改操作写入追加的记录文件,实现主从同步‌14。
  4. 可扩展性‌:Redis提供了丰富的API和脚本功能,支持通过Lua脚本批量执行命令,同时也支持水平扩展,类似于分库分表

依赖

<!--  SpringBoot Boot Redis  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
  </dependency>
<!-- JUnit 5 -->
<dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.8.2</version>
      <scope>test</scope>
</dependency>
<dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.8.2</version>
      <scope>test</scope>
</dependency>

配置

spring:
  redis:
    host: 你的ip
    port: 6379

redis的配置类(用于格式转换,处理乱码)

package com.bwie.common.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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 {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }
}

String(字符串)

特点

        最基本的数据类型,可以包含任何类型的数据,比如整数、浮点数或者字符串。

        最大存储容量为 512MB。

业务场景

      缓存: 存储临时数据,如用户会话信息或页面缓存。

      计数器: 可以用来实现访问计数器、点赞数等自增功能。

      配置存储: 存储应用程序的配置参数。

代码使用案例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class StringExampleServiceTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testStringOperations() {
        // 设置值
        redisTemplate.opsForValue().set("myKey", "Hello, Redis!");
        
        // 获取值
        String value = (String) redisTemplate.opsForValue().get("myKey");
        assertEquals("Hello, Redis!", value);

        // 自增
        redisTemplate.opsForValue().increment("counter", 1);
        Long counterValue = (Long) redisTemplate.opsForValue().get("counter");
        assertEquals(1, counterValue);

        // 设置带过期时间的值
        redisTemplate.opsForValue().set("tempKey", "Temporary Value", 10);
    }
}

注意: 如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的

List(列表)

特点

        是一个链表结构,可以包含多个字符串值(元素)。

        可以在列表的两端进行插入(Push)和删除(Pop)操作,支持对列表进行修剪(Trim)以保留指定范围的元素。

业务场景

     消息队列: 通过列表实现生产者/消费者模式。

     时间线: 存储用户的活动日志或社交媒体的时间线。

     任务调度: 存储待处理任务的队列。

代码使用案例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class ListExampleServiceTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testListOperations() {
        // 添加元素到列表
        redisTemplate.opsForList().leftPush("myList", "item1");
        redisTemplate.opsForList().leftPush("myList", "item2");

        // 获取列表元素
        List<Object> items = redisTemplate.opsForList().range("myList", 0, -1);
        assertEquals(2, items.size());

        // 从列表中弹出元素
        Object poppedItem = redisTemplate.opsForList().rightPop("myList");
        assertEquals("item1", poppedItem);

        // 获取列表长度
        Long listSize = redisTemplate.opsForList().size("myList");
        assertEquals(1, listSize);
    }
}

注意: 如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的

Set(集合)

特点

        是字符串的无序集合,集合中的元素都是独一无二的,即不允许重复。

        支持集合间的交集、并集、差集等操作,可以用于处理多个用户的共同好友、标签等数据。

业务场景

     标签系统: 存储用户的兴趣标签或文章的标签。

     好友关系: 存储用户的好友列表,快速查找共同好友。

     去重: 用于去重操作,例如统计独立访客数。

代码使用案例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertTrue;

@SpringBootTest
public class SetExampleServiceTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testSetOperations() {
        // 添加元素到集合
        redisTemplate.opsForSet().add("mySet", "value1", "value2", "value3");

        // 获取集合中的所有元素
        Set<Object> members = redisTemplate.opsForSet().members("mySet");
        assertTrue(members.contains("value1"));
        assertTrue(members.contains("value2"));
        assertTrue(members.contains("value3"));

        // 删除集合中的元素
        redisTemplate.opsForSet().remove("mySet", "value2");
        assertTrue(!redisTemplate.opsForSet().members("mySet").contains("value2"));
    }
}

注意: 如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的

Hash(哈希表)

特点

        是一个键值对集合,适合用于存储对象。

        每个 Hash 可以存储多达 2^32 - 1 键值对(40多亿)。

        适合存储和读取整个对象,如用户信息、商品信息等。

业务场景

      用户信息: 存储用户的基本信息,例如用户名、邮箱和其他属性。

      商品属性: 存储商品的详细信息,如价格、描述、库存等。

      状态信息: 用于存储状态信息,比如会话或任务的当前状态。

代码使用案例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.HashMap;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class HashExampleServiceTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testHashOperations() {
        // 设置哈希
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("name", "John");
        userMap.put("age", 30);
        redisTemplate.opsForHash().putAll("user:1000", userMap);

        // 获取哈希的字段
        String name = (String) redisTemplate.opsForHash().get("user:1000", "name");
        assertEquals("John", name);

        // 更新哈希中的字段
        redisTemplate.opsForHash().put("user:1000", "age", 31);
        Integer age = (Integer) redisTemplate.opsForHash().get("user:1000", "age");
        assertEquals(31, age);
    }
}

注意: 如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的

Sorted Set(有序集合)

特点

        类似于集合,每个成员都是唯一的,但每个成员都会关联一个浮点数值,称为分数(score)。

        成员按分数排序,可以根据分数范围获取成员,也可以按分数获取排名。

        适合需要根据分数进行排序和范围查询的场景,如排行榜、时间线等

业务场景

     排行榜: 存储用户积分、排名等,可以快速查询前 N 名用户。

     时间戳排序: 根据时间戳的排序存储事件日志。

      优先级队列: 实现任务调度,按照优先级处理任务。

代码使用案例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertTrue;

@SpringBootTest
public class ZSetExampleServiceTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testZSetOperations() {
        // 添加元素到有序集合
        redisTemplate.opsForZSet().add("myZSet", "value1", 1);
        redisTemplate.opsForZSet().add("myZSet", "value2", 2);
        redisTemplate.opsForZSet().add("myZSet", "value3", 3);

        // 获取有序集合中的所有元素
        Set<Object> zSetMembers = redisTemplate.opsForZSet().range("myZSet", 0, -1);
        assertTrue(zSetMembers.contains("value1"));
        assertTrue(zSetMembers.contains("value2"));
        assertTrue(zSetMembers.contains("value3"));

        // 移除有序集合中的元素
        redisTemplate.opsForZSet().remove("myZSet", "value1");
        assertTrue(!redisTemplate.opsForZSet().range("myZSet", 0, -1).contains("value1"));
    }
}

注意: 如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的

标签:场景,redis,配置,Redis,springframework,五种,org,import,redisTemplate
From: https://blog.csdn.net/2301_81405087/article/details/142824624

相关文章

  • Redis 5大数据类型
    这里说的数据类型是value的数据类型,key的类型都是字符串。5种数据类型:redis字符串(String)redis列表(List)redis集合(Set)redis哈希表(Hash)redis有序集合(Zset)哪里去获取redis常用数据类型操作命令:http://redis.cn/commands.html2.1、redis键(key)keys*:查看当前库所有的keyexis......
  • Redis 数据类型hash(哈希)
    目录1基本特性2主要操作命令 2.1设置和获取字段2.1.1 HSETkeyfieldvalue2.1.2 HGETkeyfield2.1.3 HMSETkeyfield1value1[field2value2...] 2.1.4 HMGETkeyfield1[field2...]2.2检查字段是否存在2.2.1 HEXISTSkeyfield2.3获取所有字段和......
  • 搭建Redis哨兵集群并使用RedisTemplate实现读写分离
    一、理论相关通过上篇博客:搭建Redis“主-从-从”模式集群并使用RedisTemplate实现读写分离,我们已经搭建好了Redis“主-从-从”模式集群并且实现读写分离,这里会出现几个问题:如果主库宕机了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就会涉及到三个......
  • 希音面试:Redis脑裂,如何预防?你能解决吗?(看这篇就够了)
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 从理论到实践:AI智能分析网关V4烟火检测算法的应用场景探索
    在信息化和智能化的今天,AI智能分析网关V4作为一款集成了先进技术的硬件设备,在烟火检测领域展现出了强大的应用价值。本文将详细阐述AI智能分析网关V4烟火检测算法的原理及其在各种场景中的应用。一、AI智能分析网关V4烟火检测算法原理深度学习基础TSINGSEE青犀AI智能分析网关V4......
  • Redis面试篇3
    1、Redis的数据类型,以及每种数据类型的使用场景?常见的几种数据类型和使用场景如下:字符串(String):字符串类型是Redis最基本的数据结构,一个键最大能存储512MB。使用场景:适用于计数器、分布式锁、缓存等常见。列表(List):列表是链表结构,可以在头部和尾部添加元素。......
  • 异步场景: promise、async函数与await命令介绍
    如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。在鸿蒙的开发中,我们时常会遇到promise异步场景,有同学反馈说希望提一下。异步开发这部分的内容比较多,我不确定这位朋友具体想讨论是哪些方面,那我从......
  • 【Redis入门到精通十】Redis哨兵
    目录哨兵(Sentinel)1.哨兵的由来2.哨兵的基本概念3.基于docker安装配置Redis哨兵4.哨兵选取主节点的原理1.主观下线2.客观下线3.选举出哨兵的leader4.leader挑选出合适的slave成为新的master哨兵(Sentinel)    RedisSentinel是Redis的高可用实现方案,在......
  • redis介绍与安装
    Redis简介Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供l......
  • redis安装致命错误jemalloc/jemalloc.h
    安装报错在安装redis的时候,执行 make&&makeinstall发生以下错误解决方案 其实可以读一下redis里的Readme.md文件,我截图了其中的部分,使用makeMALLOC=libc&makeinstall Redis指令记录 DBSIZECONFIGGETdatabases ......