深入了解Redis-基础篇

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 深入了解Redis-基础篇

文章目录

一、故事背景

二、知识点主要构成

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对象的数据序列化以及反序列化等;


523b76073d3d47d7918fd8cab54ceec1.png


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序列化,得到的结果:


05b4b882fa574528817650e5d52cfb28.png


我们可以自定义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的一些实战应用以及底层相关内容。

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

目录
相关文章
|
存储 Kubernetes 网络协议
【K8S系列】深入解析StatefulSet(一)
【K8S系列】深入解析StatefulSet(一)
878 2
|
定位技术
干货!解决Cesium中Entity移动漂移的问题
案例场景:在Cesium开发三维场景展示中,肯定会碰到加载Entity的需求,如果在你的gis应用中,带了地形的展示。那么在旋转切换画面时,Entity是否跟着一起动了起来,感觉像漂移一样呢?
4081 0
干货!解决Cesium中Entity移动漂移的问题
|
机器学习/深度学习 算法 搜索推荐
阿里云机器学习平台PAI与香港大学合作论文入选INFOCOM 2022,有效减少大规模神经网络训练时间
近日,阿里云机器学习平台 PAI 与香港大学吴川教授团队合作的论文”Efficient Pipeline Planning for Expedited Distributed DNN Training”入选INFOCOM(IEEE International Conference on Computer Communications) 2022,论文提出了一个支持任意网络拓扑的同步流水线并行训练算法,有效减少大规模神经网络的训练时间。
阿里云机器学习平台PAI与香港大学合作论文入选INFOCOM 2022,有效减少大规模神经网络训练时间
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
10月前
|
SQL 监控 安全
浅析Waf优缺点:硬件Waf、软件Waf、云Waf之总结
WAF(Web应用防火墙)是专为Web应用设计的安全防护产品,主要形态有硬件WAF、软件WAF和云WAF。硬件WAF易于部署,可承受高吞吐量,但价格昂贵;软件WAF廉价易用,功能丰富,但可能误杀和占用内存;云WAF部署简单,维护成本低,但存在被绕过和数据泄露的风险。RASP(运行时应用自我保护)是一种新兴技术,通过注入应用程序提供实时保护,误报率低,维护成本低,但部署复杂且可能影响性能。未来,WAF防护技术将结合机器学习、词法分析、行为识别和大数据关联分析,实现更精准的攻击识别和防护。
1761 2
|
10月前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
218 2
|
人工智能 中间件 Java
呼叫中心系统如果对接阿里灵积大模型
自chatgpt3.5发布以来,各种大模型飞速发展,各行各业都有接入大模型的需求,呼叫中心行业非常适合通过接入大模型用AI来回答用户的各种咨询,降低人力资源,使用顶顶通呼叫中心中间件,只需要100行不到的代码,就可以非常简单容易的让电话机器人系统,呼叫中心系统快速接入各种大模型
697 2
|
存储 消息中间件 Kubernetes
在K8S中,什么是有状态应用和无状态应用?
在K8S中,什么是有状态应用和无状态应用?
|
数据可视化 应用服务中间件 网络安全
简单易用的Nginx代理管理工具:体验便捷配置、高效管理
Nginx Proxy Manager是一款强大的代理服务器管理工具,提供简单直观的界面来配置和管理Nginx代理服务器,帮助用户轻松提升配置的简洁性和便捷性。
443 0
简单易用的Nginx代理管理工具:体验便捷配置、高效管理
|
文字识别 API
印刷文字识别操作报错合集之用body传inputStream识别 报illegalImageContent,是什么原因
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。