【Redis 开发】(长篇学习)掌握Redis的用法,各种客户端下的操作

Redis

前言

我们在作者之前的文章: 快速掌握Redis安装与基本语法的基础上进行系统的学习,学习自黑马程序员的Redis实战课堂,进行学习总结,希望对大家有所帮助

Redis

SQL语句与NoSQL语句的特点:

数据关联:在关系型数据库中,表与表之间存在数据库的关联信息,而NoSQL数据之间没有关联信息,需要自定义逻辑进行信息关联
事务特性: NoSQL只能维持基本的事务操作,所以一般对事务性要求高的需要用关系型数据库
数据结构:不是说完全自由,有一个宽泛的整体结构,比如Redis键值类型,MongDB文档类型,列类型(HBse)Graph(Neo4j)
扩展性: 垂直就是数据库需要部署在一个机器上,只能够通过添加存储空间的方式进行优化,而水平就是Redis存储数据时根据id值通过hash进行运算分布式的存储在多个机器上
单线程:每个命令具有原子性,现在常说的版本是多线程是指在网络请求方面是多线程处理,其本质还是单线程
低延迟,速度快:基于内存,IO多路复用
数据持久化:定时将内存数据写入到磁盘当中
支持主从集群,分片集群:提高上述所讲的水平扩展

Redis的安装

前边所讲的Redis的安装,安装的版本是windows版本的,我们现在安装Linux版本

安装地址:https://redis.io/

步骤:

  1. 执行yum install -y gcc ctl:安装Redis依赖,Rrdis是基于C语言开发的,需要gcc依赖
  2. 将下载的Redis压缩包上传到/usr/local/src目录下
  3. 进行解压
  4. 进入到解压后的Redis目录下执行make && make install:先编译后安装
  5. 默认的安装目录在/usr/local/bin目录下
  6. 该目录已经默认配置到环境变量,因此可以在任意目录下运行这些命令

redis-cli:是redis提供的命令行客户端
redis-server:是redis的服务端启动脚本
redis-sentinel:是redis的哨兵启动脚本

Redis启动

  • 启动方式

默认启动:执行redis-server这种属于前台启动,会阻碍整个会话窗口,如果ctrl+c退出,redis停止

后台启动:

  1. 修改redis的配置文件在/usr/local/src/redis-7目录下的redis.conf
  2. cp redis.conf redis.conf.bck:先备份一份文件
  3. 修改监听的地址bind 监听地址,学习可以设置为 0.0.0.0允许任意网络访问
  4. 修改守护进程为daemonize yes:可以进行后台运行
  5. 设置密码 requirepass 密码
  6. 回到解压目录下再次启动redis执行redis-server redis.conf

Redis开机自启动

  1. 执行vi /etc/systemd/system/redis.service:创建一个系统服务文件
  2. 在文件中输入:
java 复制代码
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-7.0.15/redis.conf
[Install]
WantedBy=multi-user.target
  1. 重载系统服务systemctl daemon-reload
  2. 启动服务systemctl start redis
  3. 设置开机自启动systemctl enable redis

Redis其他常用配置

  1. port 端口号:设置监听的端口号

  2. dir .:工作目录(默认当前目录),保存运行的日志文件,持久化等文件

  3. database 数量:设置数据库的数量,表示能使用几个库默认16个

  4. maxmemory 512mb:设置redis能够使用的最大内存

  5. logfile "redis.log":指定日志文件名称

Redis客户端

命令行客户端

Redis安装之后就自带命令行客户端redis-cli
redis-cli [选项] [命令]

选项:
-h 127.0.0.1:指定要连接的redis节点的ip地址,默认为127.0.0.1
-p 6379:指定要连接的redis节点的端口,默认为6379
-a 123456:指定访问redis的访问密码

命令:

指连接上redis之后要进行的操作,例如:
ping:从客户端向服务器段进行连接测试,正常返回pong

不指定命令连接redis客户端会进入redis-cli的交互控制台

图形化客户端:

安装地址:https://github.com/lework/RedisDesktopManager-Windows/releases

解压后双击进行安装:

安装之后双击resp.exe文件启动

进入连接设置:

创建连接,成功后:

Redis常见命令

在学习Redis的常用命令少不了帮助文档:https://redis.io/commands

我们也可以在客户端命令行中通过help进行相关查看

Redis数据库中Key一般是String类型,value类型:

list:一个有序的集合,本质是一个链表
Set:无序集合
SortedSet:可排序的集合
GEO:一个地理坐标
BitMap和HyperLog:特殊的按照位进行存储,本质是字符串

在进行命令的学习中建议配合help命令进行学习

  • Redis通用命令

KEYS [模板]:查询符合模板所有的key,例如keys *name*:匹配所有中间由name的key
DEL:删除一个指定的key,也可以删除多个key,多个key用空格隔开
EXISTS:判断key是否存在例如exists age
EXPIRE:给一个key设置有效期,有效期到期会自动删除key例如repire age 20设置有效期为20秒
TTL: 查看一个key的剩余有效期

  • String类型的数据

存储的数据可能是字符串类型,也可能字符串是数字或浮点数,不管是哪种格式,底层都是字节数组存储,数字类型的字符串编译成二进制文件存储在字节数组中,而字符串是以字母的形式存入字节数组的

String常见的命令

incrby age -1:控制key进行自减
setex age 20:添加一个key并设置有效期

注意:在开发过程中我们都通过id作为key进行存储,如果我们的用户id为1,商品信息的id也为1,那么这个时候我们应该如何进行区分呢:

Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开
项目名:业务名:类型名:id

如果value是一个java对象:将对象序列化为JSON字符串后存储

  • Hash类型数据

Hash类型,也叫散列,其value是一个无序字典,类似于java中的HashMap结构

在Spring类型中java对象是序列化为JSON格式的字符串进行存储,但是这样能进行修改

Hash结构可以将对象中的每个字段进行独立存储,方便修改:

Hash类型常见命令

  • List类型

Redis中的list类型与java中的LinkedList类似,可以看作一个双向链表结构,可以进行正向检索,也可以进行反向检索

特征:有序,元素可以重复,插入和删除快,查询速度一般

List的常见命令

  • Set类型

Redis的Set结构与java中的HashSet类型,可以看作是一个value为null的HashMap

特征:无序,元素不可重复,查找块,支持交集并集差集

Set常用命令

  • SortedSet类型

Redis的SortedSet是一个可排序的set集合,与java中的treeSet有些相似,但底层数据结构差距很大,SortSet中的每一个元素都带有一个score属性,可以基于score属性对元素进行排序,底层实现一个跳表(SkipList) {实现排序,加快查询速度}加Hash表

特征:可排序,元素不重复,查询速度块

实际应用:用来实现排行榜这样的功能

SortedSet常用指令

注意:所有的排序默认都是升序的,如果要降序则在命令的Z之后添加REV即可

场景应用:将班级的学生和成绩存入redis并进行排名

Redis的java客户端

在Redis官网中提供了各种语言的客户端

地址:https://redis.io/clients

客户端 简介
jedis 以Redis命令作为方法名称,简单实用易学习,但是jedis实例是线程不安全的,多线程环境下需要基于连接池使用
lettuce 是基于Netty实现的,支持同步,异步和响应式编程方式,线程安全,支持Redis哨兵模式,集群模式和管道模式
Redisson Redisson是一个基于Redis实现的分布式,可伸缩的java数据结构集合,包含了Map,Queue,Lock等强大功能
Spring Data Redis Spring框架给出的整合jedis和lettuce的技术

jedis学习

jedis官方地址:http://github.com/redis/jedis

简单的jedis 入门流程

第一步:导入依赖

java 复制代码
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>5.0.2</version>
        </dependency>

第二步: 建立连接

java 复制代码
private Jedis jedis
//给出jedis的初始化方案
@BeforeEach
void setUp(){
    jedis =new Jedis("虚拟机的ip",redis端口号);
    jedis.auth("密码");
    //选择库
    jedis.select(0);
}

第三步:通过jedis进行操作,例如
String result=jedis.set("name","wode")
String name=jedis.get("name")

第四步:释放资源
jedis.close()

Jedis连接池

创建jedis连接池:

java 复制代码
public class JedisConnectionFactory {
    private static final JedisPool jedispool;
    static {
        //通过连接池配置对象配置连接池
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        //设置最大连接数
        jedisPoolConfig.setMaxTotal(8);
        //设置最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        //设置最小空闲连接,当很长一段时间没有使用连接,连接就会被销毁
        jedisPoolConfig.setMinIdle(0);
        //设置当连接池中没有连接的时候等待的最大时间
        jedisPoolConfig.setMaxWaitMillis(1000);
        jedispool=new JedisPool(jedisPoolConfig,"虚拟机ip",6379,1000,"密码");
    }
    public static Jedis getJedis(){
        return jedispool.getResource();
    }
}

创建Jedis连接池后再进行创建jedis的时候就从连接池获取连接
Jedis jedis=JedisConnectionFactory.getJedis();

同时释放资源的时候就成为还回连接

SpringDataRedis

SpringData是Spring中数据操作的整合,其中对Redis的集成模块就叫做SpringDataRedis

官网地址:https://spring.io/projects/spring-data-redis

SpringDataRedis简述

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

SpringDataRedis中提供了RedisTemplate工具类,封装了各种对Redis的操作,并且将不同的数据类型的操作API封装:

SpringDataRedis快速入门

第一步:引入依赖

java 复制代码
		<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>

第二步:配置文件信息

yml 复制代码
spring:
  data:
    redis:
      host: 192.168.75.134
      port: 6379
      password: 520521
      lettuce:
        pool:
          max-active: 8 #最大连接
          max-idle: 8 #最大空闲数
          min-idle: 0  # 最小空闲连接
          max-wait: 100  #连接等待时间

注意:在配置文件中默认使用的是lettuce的pool连接池,这是Spring默认的,如果使用jedis的pool还需引入jedis的依赖

第三步:注入RedisTemplate

java 复制代码
@Autowired
private RedisTemplate redistemplate;

第四步:进行操作
redistemplate.opsForValue().set("name","wode"):插入一条String类型的数据
Object name=redistemplate.opsForValue().get("name"):读取一条String类型数据

注意:在执行第四步的插入操作之后,在redis中出现一条长文

这是由于在redistemplate中都是以对象的形式进行输入的,在输入之后,通过SpringDataRedis中的JDK序列化将java对象转化为字节的方式传输到redis中

这样肯定是不方便的,那么怎么办,需要写出自己的序列化方式

  • 自定义序列化方式
java 复制代码
 @Configuration
public class Redisconfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String, Object> stringObjectRedisTemplate = new RedisTemplate<>();
        //设置连接工厂
        stringObjectRedisTemplate.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        stringObjectRedisTemplate.setKeySerializer(RedisSerializer.string());
        stringObjectRedisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        stringObjectRedisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        //设置value的序列化
        //返回
        return stringObjectRedisTemplate;
    }
}

这样就会解决了序列化的问题,但是你会发现使用JSON的序列化器后,在redis的数据中会出现反序列化所需要的类名,一旦数据多了,每条数据有一条类信息,这就会非常的臃肿,耗费内存

为了节省空间,我们不采用JSON的序列化器来处理value,而是统一使用String序列化器,要求只能存储string类型的key和value,所以,当需要存储java对象的时候,手动完成对象的序列化和反序列化

这时Spring提供了一个StringRedisTemplate类,它的key和value的序列化方式就是String方式,大大方便我们

java 复制代码
private StringRedisTemplate stringredistemplate;
//通过这个类再执行相应的redis操作的时候默认的序列化方式就是string
只不过需要将对象进行手动的序列化
private static final ObjectMapper mapper=new ObjectMapper();
//创建对象
User user=new User("nihao",2);
//手动的序列化
String json=mapper.writeValueAsString(user);
StringRedisTemplate.opsForValue().set("User:1",user);
相关推荐
小白学大数据14 分钟前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
@小博的博客21 分钟前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
time never ceases35 分钟前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
Frank牛蛙39 分钟前
1.每日SQL----2024/11/7
数据库·sql
Ciderw41 分钟前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
薛晓刚42 分钟前
数据库优化指南:如何将基本功能运用到极致?
数据库
stars_User1 小时前
MySQL数据库面试题(下)
数据库·mysql
南宫生1 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
未来之窗软件服务1 小时前
sql速度优化多条合并为一条语句
数据库
山东布谷科技官方1 小时前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发