深入了解Redis-基础篇

news2024/12/26 22:56:52

文章目录

  • 一、故事背景
  • 二、知识点主要构成
    • 2.1、redis简介
    • 2.2、基于CentOS Linux docker容器化安装redis
    • 2.3、redis的数据类型
      • 2.3.1、String类型
      • 2.3.2、Hash类型
      • 2.3.3、List类型
      • 2.3.4、Set类型
      • 2.3.5、SortedSet类型
    • 2.4、Redis的Java客户端
      • 2.4.1、Jedis
        • 2.4.1.1、Jedis的使用步骤:
          • 1、引入依赖
          • 2、创建Jedis对象,建立连接
          • 3、使用Jedis,方法名和Redis命令一致
          • 4、释放资源
        • 2.4.1.2、Jedis连接池:
      • 2.4.2、SpringDataRedis
        • 2.4.2.1、SpringDataRedis的使用步骤:
          • 依赖引入
          • 配置文件添加Redis相关配置信息
          • 注入RedisTemplate
          • 2.4.2.2、SpringDataRedis的序列化方式
  • 三、总结提升

一、故事背景

最近在系统的回顾redis相关的知识,总结成系列博客,方便回顾,也希望大家能给出意见,帮助我更快的成长;

二、知识点主要构成

2.1、redis简介

Redis是一个开源的内存中数据结构存储,用作数据库、缓存、消息代理和流引擎。Redis提供数据结构,如字符串、散列、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流。Redis具有内置复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。

2.2、基于CentOS Linux docker容器化安装redis

docker run \
--restart=always \
--log-opt max-size=100m \
--log-opt max-file=2 \
-p 6379:6379 \
--name redis \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data \
-d redis:5.0.7 \
redis-server /etc/redis/redis.conf \
--appendonly yes \
命令解释:
–restart=always 总是开机启动
–log是日志方面的
-p 6379:6379 将6379端口挂载出去
–name 给这个容器取一个名字
-v 数据卷挂载
/home/redis/myredis/myredis.conf:/etc/redis/redis.conf 这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。
/home/redis/myredis/data:/data 这个同上
-d redis:版本号 表示后台启动哪个版本的redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/redis/myredis/myredis.conf
–appendonly yes 开启redis 持久化
–requirepass 000415 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置

2.3、redis的数据类型

2.3.1、String类型

字符串类型是Redis中最基本的数据存储类型,它是一个由字节组成的序列,在Redis中是二进制安全的。这意味着该类型可以接受任何格式数据,如JPEG图像数据和Json对象说明信息。它是标准的key-value,通常用于存储字符串、整数和浮点。Value可容纳高达512MB的数据。

‎由于所有数据都在单个对象中,Redis 中的字符串操作速度非常快。‎‎基本的‎‎ Redis 命令(如 SET、‎‎GET‎‎ 和 ‎‎DEL‎‎)如下:

  • ‎SET 键值‎‎ ‎‎– 设置指定键的值。‎
  • GET 键‎‎ ‎‎– 检索指定键的值。‎
  • DEL 键‎‎ ‎‎– 删除给定键的值。

应用程序场景:非常常见的场景用于计算站点访问量、当前在线人数等。

2.3.2、Hash类型

hash 是一个键值(key=>value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。和String略像,但value中存放的是一张表,一般用于多个个体的详细事项排列,String也可以做到,但要比hash麻烦许多。

  • ‎HSET‎‎ – 将值映射到哈希中的键。‎
  • ‎HGET‎‎ – 检索与哈希中的键关联的各个值。‎
  • ‎HGETALL‎‎ ‎‎–显示整个哈希内容。‎
  • ‎HDEL‎‎ – 从哈希中删除现有的键值对。‎

应用程序方案:存储部分更改数据,如用户信息、会话共享。

2.3.3、List类型

list是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着,即使有数以千万计的元素列表,也可以极快地获得10条记录在头部或尾部。可列入名单的要素最多只有4294967295个。

  • ‎LPUSH‎‎ – 将值推送到列表的左端。‎
  • ‎RPUSH‎‎ – 将值推送到列表的尾端。‎
  • LRANGE‎‎ – 检索一系列项目。‎
  • LPOP/RPOP‎‎ ‎‎– 用于显示和删除两端的项目。‎
  • LINDEX‎‎– 从列表中的特定位置获取值。‎

应用场景:最新消息排行榜;消息队列,以完成多程序之间的消息交换。

2.3.4、Set类型

Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。所谓集合就是一堆不重复值的组合,并且是没有顺序的。在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还提供了诸如collection、union和differences等操作,使得实现诸如commandism、poperhike、secondfriends这样的功能变得很容易,或者选择是将结果返回给客户机,还是将它们保存到使用不同命令的新的集合中。

  • ‎SADD‎‎ – 向集合中添加一个或多个项目。‎
  • SISMEMBER‎ – 找出一个项目是否是集合的一部分。‎ ‎
  • SMEMBERS‎‎– 从集合中检索所有项目。‎ ‎
  • SREM‎‎ – 从集合中删除现有项。‎

2.3.5、SortedSet类型

sorted set也叫Redis zset ,和set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。可以按成员、排序顺序和分数值访问排序集中的项目。

  • ‎ZADD‎‎‎‎– 将具有分数的成员添加到排序集。‎ ‎
  • ZRANGE‎‎‎–根据项目在排序顺序中的位置检索项目。‎‎withscores‎‎ ‎‎选项生成实际分数值。‎
  • ‎ZRANGEBYSCORE ‎–根据定义的分数范围从排序集中提取项目。‎‎withscores‎‎ ‎‎选项生成实际分数值。‎
  • ‎ZREM‎‎–‎‎从已排序的集中删除项目。‎

使用场景:带有权重的元素,比如一个游戏的用户得分排行榜;比较复杂的数据结构,一般用到的场景不算太多。

2.4、Redis的Java客户端

2.4.1、Jedis

JavaRedis,以Redis命令作为方法名称,学习成本低,简单实用,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用;

2.4.1.1、Jedis的使用步骤:

1、引入依赖
<!--jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>
2、创建Jedis对象,建立连接
private Jedis jedis;
    @BeforeEach
    void setUp(){
        //建立连接
        jedis = new Jedis("124.70.79.190",6379);
        //设置密码
        //jedis.auth("");
        //选择库
        jedis.select(1);
    }
3、使用Jedis,方法名和Redis命令一致
    @Test
    public void testString(){
        String result = jedis.set("name","小明");
        System.out.println(result);

        String name = jedis.get("name");
        System.out.println(name);
    }
    @Test
    public void testHash(){
        jedis.hset("user:1","name","Jack");
        jedis.hset("user:1","age","21");
        Map<String, String> stringStringMap = jedis.hgetAll("user:1");
        System.out.println(stringStringMap);
        String name = jedis.hget("user:1", "name");
        System.out.println(name);
    }
4、释放资源
    @AfterEach
    void tearDown(){
        if (jedis!=null){
            jedis.close();
        }
    }

2.4.1.2、Jedis连接池:

public class JedisConnectionFactory {
    private static final JedisPool jedisPool;
    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //最大连接
        jedisPoolConfig.setMaxTotal(8);
        //最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        //最小空闲连接
        jedisPoolConfig.setMinIdle(8);
        //设置最长等待时间
        jedisPoolConfig.setMaxWaitMillis(200);
        jedisPool = new JedisPool(jedisPoolConfig,"124.70.79.190",6379,1000);
    }
    //获取Jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

2.4.2、SpringDataRedis

SpringData是Spring中数据操作的模块,包含了对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis;
它提供了对不同Redis客户端的整合,其中包括Lettuce和Jedis,提供了RedisTemplate统一API来操作Redis,支持Redis的发布订阅模型,支持Redis哨兵和Redis集群,支持基于JDK,JSON,Spring对象的数据序列化以及反序列化等;
在这里插入图片描述

2.4.2.1、SpringDataRedis的使用步骤:

依赖引入
		<!--Redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
配置文件添加Redis相关配置信息
spring:
  redis:
    host: 124.70.79.190
    port: 6379
    database: 1
    lettuce:
      pool:
        max-active: 8 #最大连接
        max-idle: 8 #最大空闲连接
        min-idle: 0 #最小空闲连接
        max-wait: 100 #连接等待时间
注入RedisTemplate
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString(){
        redisTemplate.opsForValue().set("name","wmj");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }
2.4.2.2、SpringDataRedis的序列化方式

按上述例子往redis中存入一个key为name,value为wmj的字符串,实际在redis中key并不是我们所认识的name,value也不是我们所认识的wmj,通过可视化工具可以看到,RedisTemplate可以接受任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果:
在这里插入图片描述
我们可以自定义RedisTemplate的序列化方式,如下:

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        //1、创建RedisTemplate对象
        RedisTemplate<String,Object> template = new RedisTemplate<>();
        //2、设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //3、创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //4、设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //5、设置value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //6、返回
        return template;
    }
}

三、总结提升

本文阐述了Redis的一些基本概念、Redis的几种基本数据类型以及Redis的Java客户端的基本使用,后续还会更新Redis的一些实战应用以及底层相关内容。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/757510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 572. 另一棵树的子树(java)

另一棵树的子树 另一棵树的子树题目描述解法一 DFS解法二 KMP 算法 KMP 算法 另一棵树的子树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subtree-of-another-tree 题目描述 给你两棵二叉树 root 和 subRoot 。检验 …

脑电微状态方法可靠吗?

摘要 EEG微状态是在静息态EEG记录中观察到的代表功能性脑网络的状态&#xff0c;在快速切换到另一个网络之前保持稳定40-120ms。人们认为微状态特征(如持续时间、发生率、覆盖率和转换概率)可以作为精神和神经系统疾病以及心理社会特征的神经标志物。然而&#xff0c;需要可靠…

设计模式-01策略模式

1 什么是设计模式 先看一段设计模式总结之父们GOF在《设计模式 可复用面向对象软件的基础》一书中描述的一段话&#xff1a; 设计模式就是程序编码设计时的一些套路&#xff0c;这些套路都是经过前人千锤百炼总结出来的经验&#xff0c;由GoF总结出23种经典套路&#xff0c;即…

4028: 按位与

题目内容 输入格式 输入第一行一个整数 n n n。 第二行 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1​,a2​,⋯,an​。 输出格式 输出一行一个整数表示答案。 样例 1 输入 5 6 2 3 4 7 样例 1 输出 7 #include<bits/stdc.h> using namespace std…

怎样优雅地增删查改(三):业务用户的增删查改

文章目录 创建业务用户创建业务用户同步器创建业务用户应用服务增删改查 创建控制器测试按组织架构查询按职称查询 创建业务用户 区别于身份管理模块&#xff08;Identity模块&#xff09;的鉴权用户IdentityUser&#xff0c;业务用户&#xff08;BusinessUser&#xff09;是围…

【Python】正则表达式语法入门

目录 正则表达式 1、点&#xff1a;匹配所有字符 2、星号&#xff1a;重复匹配任意次 3、加号&#xff1a;重复匹配多次 4、花括号&#xff1a;匹配指定次数 5、贪婪模式和非贪婪模式 6、反斜杠&#xff1a;对元字符的转义 7、方括号&#xff1a;匹配几个字符之一 8、…

计算机科学与技术基础课程复习

文章目录 大学计算机基础 大学计算机基础 国防科技大学慕课 从算牌开始&#xff0c;记录数据 数据的计算规则 帕斯卡的加法器 计算自动化 图灵的梦想 乘10运算的图灵机 图灵记 根据状态和记录&#xff1b;根据控制器规则&#xff0c;从起始状态到结束状态&#xff0c;从…

less 笔记

1 margin-left 之后有 margin: 0 导致margin-left 无效 --> 不能重复定义 .btn-group {margin-left: calc(100% - 350px);display: inline-block;margin: 0; // 重复定义 导致上面 没有效果padding: 0; } 2 一定要F12检查元素 看各个div的宽度是否太长 导致靠左靠右 计算不…

5.1 Python高阶特性之递归函数

基本概念&#xff1a; 如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数使用递归函数的优点是逻辑简单清晰&#xff0c;缺点是递归过深会导致栈溢出。【注意】 递归函数定义时&#xff0c; 一定存在某个条件能结束执行&#xff0c; 递归最重要的就是需要避免死…

免费使用Elasticsearch官网15天

注册登录 点击创建索引时候会给你展示一个密钥。这个密钥就是你的用户密码 如下图 你的服务地址大致样式如下 https://huihai.es.us-central1.gcp.cloud.es.io 这里需要你输入用户密码,上面图4&#xff08;图中&#xff09;&#xff0c;下载时候的用户密码 登录完成 这样就能…

【Python爬虫】CSDN热榜文章热门词汇分析

&#x1f4da; 前言 在信息时代&#xff0c;我们经常需要从大量的文章中获取有用的信息。本文将介绍如何使用Python进行数据处理&#xff0c;获取热榜文章的标题和标签&#xff0c;并使用jieba库进行数据分析。通过本文的学习&#xff0c;你将掌握获取和分析热榜文章数据的技巧…

[英语单词] components;

*[kәm’pәunәnt] n. 元件, 组件, 成分 a. 组成的, 构成的 【计】 组件 【化】 组分 【医】 成分; 组元(神经元组) 有很多地方使用这个单词&#xff0c;在组成整体时&#xff0c;作为单位一内的占有比率。那为什么不用portion&#xff1f; 这样每一个组成部分都是一个compon…

使用 YOLOv8 和 Streamlit 构建实时对象检测和跟踪应用程序:第 1 部分-介绍和设置

示例:图像上的对象检测 介绍 实时视频中的目标检测和跟踪是计算机视觉的一个重要领域,在监控、汽车和机器人等各个领域都有广泛的应用。 由于需要能够识别和跟踪对象、确定其位置并对它们进行实时分类的自动化系统,对视频帧中的实时对象检测和跟踪的需求日益增加。 在这…

疫情防控【并查集,离线查询,依次删除节点逆向转化为逐渐添上节点】

5 5 3 1 2 1 3 1 5 2 5 3 4 4 3 1 3 1 4 2 3 5 3 3 4 2 3 3 5 1 3 2 3 2 5 3 4输出样例: 1 2 3#include <bits/stdc.h> using namespace std; const int M1e35; const int N2e55; vector<int> e[N]; #define pii pair<int,int> vector<pii> query[M];…

day26 求一段连续子数组之和的最大值

题目描述 方法一&#xff1a;超出时间限制 思路&#xff1a;选一个起点&#xff0c;选一个终点&#xff0c;计算起点到终点的和&#xff1b;求max&#xff1b; 起点几种可能&#xff1a;0 到 size -1; 终点&#xff1a; 起点 到 size -1&#xff1b; int maxSubArray(int* nu…

【网站 全选和单选】js 实现-点击全选按钮时,所有的按钮都会被选中或取消选中。

要实现的效果如图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

【基本绘图注释函数】——MatLab画图

目录索引 title&#xff1a;ylable&#xff1a;legend&#xff1a; title&#xff1a; 在绘图中添加标签。此类函数的输入是一个字符串。MATLAB 中的字符串是用双引号 (") 引起来的。 上面一部分画图代码这里省略 title("Sample Mass")ylable&#xff1a; 为y轴…

BUUCTF-EasyLogin

这是一道 Node.js 语言的题目&#xff0c;在此记录我在做这道题的思考过程。 这道题考的是 CVE-2022-23540. 简单测试 进入题目环境&#xff1a; 一个登录页面&#xff0c;由题目的名称 EasyLogin&#xff0c;我猜测这道题是身份认证缺陷的问题。不过&#xff0c;还是下意识测…

用主流编程语言解小学题

最近在网上刷到一个视频&#xff0c;内容是奶奶有60 元钱&#xff0c;去超市买了10元水果&#xff0c;收营员应该找奶奶多少钱?我一开始反应就是50元&#xff0c;后来想了想题干里没有说明这60元是怎么构成的&#xff0c;有可能是一张50元和一张10元&#xff0c;或者是3张20元…

day36-JSON+Servlet

0目录 JSONServlet 1.JSONServlet 1.1 创建工程/导入依赖/创建包/BaseDao...... 依赖&#xff1a;javax.servlet、jstl、mysql、taglibs、fastjson <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <…