深入了解Redis-基础篇

本文涉及的产品
云数据库 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的一些实战应用以及底层相关内容。

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
存储 缓存 NoSQL
Redis实现延迟任务的几种方案
Redis实现延迟任务的几种方案
|
22天前
|
存储 人工智能 NoSQL
Redis的未来
【翻译】来自redis官网对未来的规划
171 0
|
6月前
|
存储 JSON NoSQL
redis中的value
需要注意的是,redis中的value是以二进制形式存储的,因此在存储和读取数据时需要进行序列化和反序列化操作。常用的序列化方式包括JSON、Protobuf、Msgpack等。示例代码如下
45 0
|
8月前
|
NoSQL 安全 Redis
|
8月前
|
NoSQL Redis
|
9月前
|
存储 缓存 NoSQL
Redis初探
本篇深入介绍了Redis(Remote Dictionary Server)这一开源的内存数据存储系统,以及它在现代应用开发中的用途和优势。首先,我们对Redis进行了初步探索,解释了Redis是什么,它的主要特点以及适用场景。接着,我们详细讨论了Redis的安装和配置过程,提供了在Linux环境下安装Redis的步骤,并展示了如何启动和关闭Redis服务器。
205 0
|
9月前
|
存储 JSON 自然语言处理
Redis基础学习
Redis基础学习
72 0
|
10月前
|
NoSQL Redis 数据库
什么是Redis
Redis,即远程字典服务,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,Key-Value数据库。类似于map
44 0
|
11月前
|
消息中间件 存储 缓存
【Redis核心知识 四】Redis分布式锁实战(上)
【Redis核心知识 四】Redis分布式锁实战(上)
144 0
|
11月前
|
NoSQL 安全 Java
Redis实战(1)
Redis实战(1)