一、初识Redis

1. 认识NoSQL

2. 认识Redis

  • Redis诞生于2009年,全称是Remote Dictionary Server(远程词典服务器),是一个基于内存的键值型NoSQL数据库
  • 特征
    (1)键值(key-value)型,value支持多种不同数据结构,功能丰富
    (2)单线程执行命令,所有命令是串行执行的,每个命令具备原子性,不会存在一个命令执行过程中,其他命令插入进来的情况(注意:Redis 6.0的多线程仅仅是针对网络请求处理这块,而核心的命令的执行这部分依然是单线程)
    (3)低延迟,速度快(基于内存、IO多路复用、良好的编码:C语言编写)
    (4)支持数据持久化,定期将内存中数据持久化到磁盘,确保数据的安全性
    (5)支持主从集群、分片集群
    (6)支持多语言客户端

3. 安装Redis

  • 安装Redis依赖
    (1)Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖

    yum install -y gcc tcl
    
  • 上传Redis安装包并解压、安装
    (1)将redis-6.2.6.tar.gz包,上传到/usr/local/src目录下
    (2)解压redis-6.2.6.tar.gz,进入解压后目录,运行编译命令,如果没有报错则安装成功

    tar -zxvf redis-6.2.6.tar.gzcd redis-6.2.6make && make install
    

    (3)默认的安装路径:/usr/local/bin目录下

    (4)该目录已经默认配置到环境变量中,可以在任意目录下运行这些命令

    1)redis-cli:Redis提供的命令行客户端
    2)redis-server:Redis的服务端启动脚本
    3)redis-sentinel:Redis的哨兵启动脚本
    
  • 启动Redis
    (1)默认启动

    1)安装完成后,在任意目录输入redis-server命令即可启动Redis
    2)这种启动属于前台启动,会阻塞整个会话窗口,窗口关闭或者按下CTRL + C,则Redis停止【不推荐使用】redis-server
    

    (2)指定配置启动

    1)修改Redis配置文件redis.conf(路径:/usr/local/src/redis-6.2.6)2)备份redis.conf
    cp redis.conf redis.conf.bak3)修改redis.conf文件中的一些配置
    # 监听的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
    bind 0.0.0.0
    # 守护进程,修改为yes后即可后台运行
    daemonize yes
    # 密码,设置后访问Redis必须输入密码
    requirepass 1233214)Redis的其它常见配置
    # 监听的端口
    port 6379
    # 工作目录,默认是当前目录(哪里启动,哪里就是工作目录),也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
    dir .
    # 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
    databases 1
    # 设置redis能够使用的最大内存
    maxmemory 512mb
    # 日志文件,默认为空,不记录日志,可以指定日志文件名
    logfile "redis.log"5)启动Redis
    # 进入redis安装目录
    cd /usr/local/src/redis-6.2.6
    # 启动
    redis-server redis.conf6)停止服务
    # 利用redis-cli来执行shutdown命令,即可停止Redis服务,因为之前配置了密码,因此需要通过-a来指定密码
    redis-cli -a 123321 shutdown
    

    (3)开机自启

    1)新建一个系统服务文件
    vim /etc/systemd/system/redis.service2)输入以下内容
    [Unit]
    Description=redis-server
    After=network.target[Service]
    Type=forking
    ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
    PrivateTmp=true[Install]
    WantedBy=multi-user.target3)重载系统服务
    systemctl daemon-reload4)可以用下面这组命令来操作redis
    # 启动
    systemctl start redis
    # 停止
    systemctl stop redis
    # 重启
    systemctl restart redis
    # 查看状态
    systemctl status redis5)让redis开机自启
    systemctl enable redis
    

4. Redis客户端

  • 命令行客户端

  • 图形化桌面客户端
    (1)安装包:https://github.com/lework/RedisDesktopManager-Windows/releases

  • 编程客户端【后续实现】

二、Redis常见命令

1. Redis数据结构介绍

  • Redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样
  • Redis将操作不同数据类型的命令进行分组,在官网(https://redis.io/commands)可以查看不同命令组
  • 通过help也可以查看命令分组

2. Redis通用命令

  • KEYS:查看符合模板的所有key,不建议在生产环境中使用
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个KEY设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个key的剩余有效期

3. String类型

4. Hash类型

5. List类型

6. Set类型

7. SortedSet类型

三、Redis的Java客户端

1. Jedis客户端

  • Jedis官网:https://github.com/redis/jedis

  • maven依赖

     <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>
    
  • Jedis基础操作

    package com.swaggyhang;import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import redis.clients.jedis.Jedis;import java.util.Map;/*** Jedis基础操作*/
    public class JedisTest {private Jedis jedis;@Beforepublic void setUp() {// 1.建立连接jedis = new Jedis("192.168.6.128", 6379);// 2.设置密码jedis.auth("123321");// 3.选择库jedis.select(0);}@Testpublic void testString() {// 存入数据String result = jedis.set("name", "虎哥");System.out.println("result = " + result);// 获取数据String name = jedis.get("name");System.out.println("name = " + name);}@Testpublic void testHash() {// 存入数据jedis.hset("user:1", "name", "jack");jedis.hset("user:1", "age", "21");// 获取数据Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@Afterpublic void tearDown() {if (jedis != null) {// 关闭连接jedis.close();}}
    }
    
  • Jedis连接池
    (1)Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,推荐使用Jedis连接池代替Jedis的直连方式

    package com.swaggyhang.jedis.util;import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;/*** Jedis连接池工具类** @author swaggyhang* @create 2023-07-12 20:52*/
    public class JedisConnectionFactory {private static final JedisPool JEDIS_POOL;static {JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMaxWaitMillis(1000);// 创建连接池对象JEDIS_POOL = new JedisPool(poolConfig, "192.168.6.128", 6379, 1000, "123321");}public static Jedis getJedis() {return JEDIS_POOL.getResource();}
    }
    

2. SpringDataRedis客户端

  • SpringData:是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就是SpringDataRedis

  • SpringDataRedis官网:https://spring.io/projects/spring-data-redis

  • 特征
    (1)提供了对不同Redis客户端的整合(Lettuce和Jedis)
    (2)提供了RedisTemplate统一API来操作Redis
    (3)支持Redis的发布/订阅模型
    (4)支持Redis哨兵和Redis集群
    (5)支持基于Lettuce的响应式编程
    (6)支持基于JDK(默认)、JSON、字符串、Spring对象的数据序列化和反序列化
    (7)支持基于Redis的JDKCollection实现

  • 常见API
    (1)SpringDataRedis中通过提供了RedisTemplate工具类,其中封装了各种对Redis的操作,并且将不同数据类型的操作API封装到不同的类型中

  • maven依赖

    <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><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
    </dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
    </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency>
    
  • application.yaml配置

    spring:redis:host: 192.168.6.128port: 6379password: 123321lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 1000ms
    
  • 基础操作:SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单

    package com.swaggyhang;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;@SpringBootTest
    class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testString() {// 写入数据redisTemplate.opsForValue().set("name", "虎哥");// 读取数据Object value = redisTemplate.opsForValue().get("name");System.out.println("value = " + value);}
    }
    

3. SpringDataRedis的序列化方式

  • RedisTemplate可以接收任意Object作为值写入Redis,在写入Redis之前会把Object序列化为字节形式,默认采用JDK序列化

  • 采用JDK序列化的缺点
    (1)可读性差
    (2)内存占用较大

  • 一般情况下,采用下面方式,手动指定Redis的key和value的序列化方式

  • 创建Redis配置类,指定RedisTemplate的key和value的序列化方式

    package com.swaggyhang.redis.config;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.RedisSerializer;/*** @author swaggyhang* @create 2023-07-12 21:32*/
    @Configuration
    public class RedisConfig {/*** RedisConnectionFactory无需手动创建,由SpringBoot自动创建** @param connectionFactory redis连接工厂类* @return RedisTemplate*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 设置key的序列化:StringRedisSerializertemplate.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置value的序列化:GenericJackson2JsonRedisSerializertemplate.setValueSerializer(RedisSerializer.json());template.setHashValueSerializer(RedisSerializer.json());return template;}
    }
    
  • 测试类

    package com.swaggyhang;import com.swaggyhang.redis.pojo.User;
    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;@SpringBootTest
    class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testpublic void testString() {// 写入数据redisTemplate.opsForValue().set("name", "虎哥");// 读取数据Object value = redisTemplate.opsForValue().get("name");System.out.println("value = " + value);}@Testpublic void testSaveUser(){redisTemplate.opsForValue().set("user:100", new User("虎哥", "21"));User user = (User) redisTemplate.opsForValue().get("user:100");System.out.println("user = " + user);}
    }
    
  • 测试结果:这种方式可以自动序列化和反序列化

4. StringRedisTemplate

  • 尽管JSON的序列化方式可以满足需求,但依然存在一些问题,为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入Redis的value中,带来额外的内存开销

  • 为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化

  • Spring默认提供了一个StringRedisTemplate类,其key和value的序列化方式默认就是String方式,因此,我们无需自定义StringRedisTemplate

    package com.swaggyhang;import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.swaggyhang.redis.pojo.User;
    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.StringRedisTemplate;@SpringBootTest
    class RedisDemoApplicationTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();@Testpublic void testString() {// 写入数据stringRedisTemplate.opsForValue().set("name", "虎哥");// 读取数据Object value = stringRedisTemplate.opsForValue().get("name");System.out.println("value = " + value);}@Testpublic void testSaveUser() throws JsonProcessingException {User user = new User("虎哥", "21");String json = OBJECT_MAPPER.writeValueAsString(user);stringRedisTemplate.opsForValue().set("user:100", json);String jsonUSer = stringRedisTemplate.opsForValue().get("user:100");User user1 = OBJECT_MAPPER.readValue(jsonUSer, User.class);System.out.println("user1 = " + user1);}
    }
    
  • 测试结果

  • 操作Hash类型

     @Testpublic void testHash() {stringRedisTemplate.opsForHash().put("user:200", "name", "虎哥");stringRedisTemplate.opsForHash().put("user:200", "age", "21");// 获取所有Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:200");System.out.println("entries = " + entries);}
    
  • 测试结果

【Redis基础】快速入门相关推荐

  1. 零基础快速入门SpringBoot2.0教程 (三)

    一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...

  2. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 4. 函数

    什么样的程序员才是优秀的程序员?咪博士认为"慵懒"的程序员才是真正优秀的程序员.听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务.函数便是程序 ...

  3. 零基础快速入门web学习路线(含视频教程)

    下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利 ...

  4. python海龟教程_Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环...

    条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...

  5. 【Python零基础快速入门系列 | 03】AI数据容器底层核心之Python列表

    • 这是机器未来的第7篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/124957520 <Python零基础快速入门 ...

  6. redis原理快速入门知识点总结

    redis原理快速入门知识点总结 1. 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 为什么用缓存? 1.高性能: 一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是 ...

  7. 【Python零基础快速入门系列 | 07】浪漫的数据容器:成双成对之字典

    这是机器未来的第11篇文章 原文首发链接:https://blog.csdn.net/RobotFutures/article/details/125038890 <Python零基础快速入门系 ...

  8. ROS2零基础快速入门

    ROS2入门最快需要多少时间?3天: ROS2开发一款基础机器人需要多久?3个星期: ROS2怎么才能算"精通"?不可能,3年也不行-- 如何判断一款通用性软件成熟并可以投入精力去 ...

  9. 【PR】零基础快速入门教程

    [PR]零基础快速入门教程 PR(Premiere)能做什么? PR欢迎界面及新建项目 工作区及窗口说明 导入文件 建立序列 视频剪辑 添加字幕 导出视频 使用软件:Premiere2020 新年卷起 ...

  10. 0基础快速入门CSS技术栈(4)—图解详细阐述CSS的复合选择器、标签显示模式、行高、CSS背景,及最为重要的CSS三大特性附带权重计算笔试题(附详细案例源码解析过程)

    文章目录 1. 0基础快速入门CSS技术栈(4) 2. 重点提炼 3. CSS复合选择器 3.1 后代选择器(重点) 3.1.1 example01 3.2 子元素选择器 3.2.1 exmaple0 ...

最新文章

  1. 中国矿业大学计算机控制技术英语,中国矿业大学计算机控制系统参考试卷4及答案.pdf...
  2. java排序算法代码_Java实现八种排序算法(代码详细解释)
  3. wxHtml 示例:演示虚拟文件系统功能
  4. ECCV 2020 论文大盘点-遥感与航空影像处理识别篇
  5. 世行报告称气候变暖已给发展中国家造成影响
  6. c语言运算符优先级结合,C语言运算符优先级和结合性
  7. java需求分析和设计,附面试题
  8. 识别出脸部以及给脸部打马赛克
  9. javaeye怎么打不开了?当前!2010,10,24,23:08
  10. C#.NET常见问题(FAQ)-如何改变字符串编码
  11. 山山的数学(简单版)
  12. 炫酷报表制作工具推荐:RDP报表工具
  13. Windows Mobile 6 Professional SDK
  14. 关闭iTunes iPhone自动备份(Windows+Mac)及删除过期备份
  15. 【转】android builder.setPositiveButton处 报错
  16. [转妙文]垃圾收集趣史
  17. 中国电信天翼空间发布移动应用开发运营平台
  18. 计算机专业单招考试网上面试范文,2分钟单招面试自我介绍
  19. DZ先生怪谈国标之云台控制流程
  20. 今天分享给你几个绘制Excel表格的技巧

热门文章

  1. 证券投资基金会计核算准则学习
  2. Python基于mysql+Django框架图书管理系统源代码(含mysql文件)
  3. 【致加西亚的信】读后感
  4. 英语基础语法(七)-动词
  5. phantompdf 下载_实用!手机俄语输入法下载攻略!
  6. 【9.5】隐函数的求导公式
  7. CSS基础(一)day3
  8. 获取外网IP地址API
  9. Python如何实现机器人聊天
  10. 【jQuery】获取url参数及url加参数的方法