43-Redis

Happy Clover (● ̄(エ) ̄●) 2022-09-23 09:33:34 阅读数:283

43-redisredis

43-MybatisPlus-heima-笔记



笔记内容来自黑马程序员视频教程

一、Redis入门

①:简介

在这里插入图片描述
在这里插入图片描述

②:应用场景

  • Redis应用场景
    • 缓存
    • 任务队列
    • 消息队列
    • 分布式锁

③:下载与安装

01. 下载

Redis安装包分为windows版和Linux版:

网盘下载:
链接:https://pan.baidu.com/s/1MC7IBz_rYGaqMXq9jSZnwQ
提取码:Coke

02.安装(Linux)

在这里插入图片描述

1. 在 /usr/oop 目录下创建 redis目录
在这里插入图片描述
2. 将安装包上传到redis目录中
在这里插入图片描述
3. 解压安装
解压:tar -zxvf redis-4.0.0.tar.gz
在这里插入图片描述
4. 安装Redis的依赖gcc
命令:yum install gcc-c++
在这里插入图片描述
5. cd /usr/oop/redis/redis-4.0.0Go to this directory to compile
编译命令:make
在这里插入图片描述
6. 进入redis的src目录,进行安装
安装命令:make install
在这里插入图片描述

03.安装(Windows)

在这里插入图片描述

1. 直接解压即可
在这里插入图片描述

④:Redis服务启动与停止

01. Linux中redis服务启动

  • Linux中edis服务启动,可以使用redis-server,默认端口号为6379
  • Ctrl+C停止Redis服务
1.启动服务 执行redis-server在src目录下
进入src目录:cd /usr/oop/redis/redis-4.0.0/src
执行redis-server: ./redis-server
在这里插入图片描述在这里插入图片描述
2. 连接Redis
进入src目录:cd /usr/oop/redis/redis-4.0.0/src
执行redis-cli: ./redis-cli
在这里插入图片描述

02 . Linux中后台运行redis服务

  • Ctrl+C停止Redis服务 (先停止服务)
修改配置文件( redis.conf)
1. 进入到 /usr/oop/redis/redis-4.0.0 目录下
2. vim redis.conf
3. 将 daemonize no 修改为 daemonize yes

在这里插入图片描述在这里插入图片描述

1. 保存退出后(重新启动服务)
进入目录:cd /usr/oop/redis/redis-4.0.0
执行redis-server并加载文件: src/redis-server ./redis.conf
在这里插入图片描述
2. 连接服务
进入src目录:cd /usr/oop/redis/redis-4.0.0/src
执行redis-cli: ./redis-cli
在这里插入图片描述

03. windows中启动和停止Redis服务

1. 启动服务
在这里插入图片描述在这里插入图片描述
2. 启动客户端
在这里插入图片描述在这里插入图片描述

⑤:设置Redis服务连接密码

Redis By default the connection service does not require a password

01. 修改配置文件

修改配置文件( redis.conf)
1. 进入到 /usr/oop/redis/redis-4.0.0 目录下
2. vim redis.conf
3. 添加以下内容(密码为root)
4. requirepass root
1. 修改配置文件 设置密码 保存退出
在这里插入图片描述

02. Restart the service and connect

1. Find the process firstID 并结束该进程
查找命令 ps -ef | grep redis
结束进程 kill -9 77246

在这里插入图片描述

2. 重新启动服务
进入目录 cd /usr/oop/redis/redis-4.0.0
执行redis-server并加载文件src/redis-server ./redis.conf
在这里插入图片描述

3. 启动客户端
进入src目录cd /usr/oop/redis/redis-4.0.0/src
执行redis-cli ./redis-cli -h localhost -p 6379
在这里插入图片描述

4. 执行keys * 试试 (会报错,还没有认证)
在这里插入图片描述
5. Password authentication is performed while connecting
指令:./redis-cli -h localhost -p 6379 -a root
在这里插入图片描述

⑥:设置Redis允许远程连接

01. windows中远程连接Linux中Redis

1. 默认redis是不能远程连接的
在这里插入图片描述

02. 修该配置文件

修改配置文件( redis.conf)
1. 进入到 /usr/oop/redis/redis-4.0.0 目录下
2. vim redis.conf
3. Comment out the following line of code
4. bind 127.0.0.1

在这里插入图片描述

1. Find the process firstID 并结束该进程
查找命令 ps -ef | grep redis
结束进程 kill -9 77246

在这里插入图片描述

2. 重新启动服务
进入目录 cd /usr/oop/redis/redis-4.0.0
执行redis-server并加载文件src/redis-server ./redis.conf
在这里插入图片描述

3. 启动客户端
进入src目录cd /usr/oop/redis/redis-4.0.0/src
执行redis-cli ./redis-cli -h localhost -p 6379
在这里插入图片描述

4. 再次使用windows连接
在这里插入图片描述
5. If it still fails to connect 开放 6379 端口
命令: firewall-cmd --zone=public --add-port=6379/tcp --permanent
重新加载文件:firewall-cmd --reload

⑦:Redis数据类型

  • Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
    • 字符串string
    • 哈希hash
    • 列表list
    • 集合set
    • 有序集合sorted set
      在这里插入图片描述

⑧:设置Redisdatabase and switch databases

01.设置Redis数据库的数量

修改配置文件
Linux修改redis.conf
windows修改redis.windows.conf

在这里插入图片描述

02. Redisswitch database

切换数据库 select index(数据库index)

在这里插入图片描述

二、安装Redis可视化工具

①:下载

(Redis Desktop Manager)
官网下载https://redisdesktop.com/download

网盘下载:
链接:https://pan.baidu.com/s/1MC7IBz_rYGaqMXq9jSZnwQ
提取码:Coke

②:安装

说明:Redis Desktop Manager是一款简单快速、跨平台的Redis桌面管理工具,也被称作Redis可视化工具;支持命令控制台操作,以及常用,查询key,rename,delete等操作.

1. 双击运行
在这里插入图片描述
2. 下一步3. 我同意
在这里插入图片描述在这里插入图片描述
4. 修改安装路径
在这里插入图片描述

③:使用方法

1.进入RedisDesktopManager的主界面
在这里插入图片描述
  • Name:Give the connection a name
  • Host:redis服务器的ip地址
  • Port:redis服务器的端口号
  • Auth:密码字段,如果redisThe server has password authentication set up,则需要填写,没有设置,为空即可
  • Fill it out and click”Test Connection"进行测试,没有问题再点击OK完成连接
2. 启动windows Redis 服务
在这里插入图片描述
3. 连接
在这里插入图片描述
3.该工具支持根据筛选条件查询add new key,key,reload等
在这里插入图片描述
4.支持常用redis操作;as for the targetkey执行rename,delete,addrow,reload value操作
在这里插入图片描述
5.支持命令控制台操作
在这里插入图片描述

三、Redis常用命令

①:字符串类型常用命令

SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
SETNX key value 只有在key不存在时设置key的值

更多命令可以参考Redis中文网https://www.redis.net.cn

1. Set 和 Get
在这里插入图片描述
2. The value set the second time overwrites the value set the first time
在这里插入图片描述
3. SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
在这里插入图片描述
4. SETNX key value 只有在key不存在时设置key的值
在这里插入图片描述

②:哈希hash操作命令

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,常用命令:

HSET key field value 将哈希表key中的字段field的值设为value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
HGETALL key 获取在哈希表中指定key的所有字段和值

在这里插入图片描述

1. HSET key field value 将哈希表key中的字段field的值设为value
在这里插入图片描述
2. HGET key field 获取存储在哈希表中指定字段的值
在这里插入图片描述
3. HKEYS key 获取哈希表中所有字段**加粗样式**
在这里插入图片描述
4. HVALS key 获取哈希表中所有值
在这里插入图片描述
5. HGETALL key 获取在哈希表中指定key的所有字段和值
在这里插入图片描述
6. HDEL key field 删除存储在哈希表中的指定字段
在这里插入图片描述
7. 删除多个字段
在这里插入图片描述

③:列表List操作命令

Redis列表是简单的字符串列表,按照插入顺序排序,常用命令:

LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
BRPOP key1 [key2 timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表
直到等待超时或发现可弹出元素为止

在这里插入图片描述

1. LPUSH key value1 [value2] 将一个或多个值插入到列表头部
在这里插入图片描述
2. LRANGE key start stop 获取列表指定范围内的元素
在这里插入图片描述
3. RPOP key 移除并获取列表最后一个元素
在这里插入图片描述
4. LLEN key 获取列表长度
在这里插入图片描述
5. BRPOP key1 [key2 timeout 移出并获取列表的最后一个元素
如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
在这里插入图片描述

在这里插入图片描述

④:无序集合set操作命令

Redis set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:

SADD key member1[member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SDIFF key1 [key2] 返回给定所有集合的差集
SREM key member1 [member2] 移除集合中一个或多个成员

在这里插入图片描述

1. SADD key member1[member2] 向集合添加一个或多个成员
在这里插入图片描述
2. SMEMBERS key 返回集合中的所有成员
在这里插入图片描述
3. SCARD key 获取集合的成员数
在这里插入图片描述
4. SINTER key1 [key2] 返回给定所有集合的交集
在这里插入图片描述
5. SUNION key1 [key2] 返回所有给定集合的并集
在这里插入图片描述
6. SDIFF key1 [key2] 返回给定所有集合的差集
在这里插入图片描述
7. SREM key member1 [member2] 移除集合中一个或多个成员
在这里插入图片描述

⑤:有序集合sorted set操作命令

  • Redis sorted set有序集合是string类型元素的集合,且不允许重复的成员.
  • 每个元素都会关联一个double类型的分数(score).
  • redis正是通过分数来为集合中的成员进行从小到大排序.
  • 有序集合的成员是唯一的,但分数却可以重复.

常用命令:

ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员

在这里插入图片描述

1. ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
在这里插入图片描述
2. ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
在这里插入图片描述
3. ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
在这里插入图片描述
4. ZREM key member [member ...] 移除有序集合中的一个或多个成员
在这里插入图片描述

⑥:Redis通用命令

  • 通用命令
KEYS pattern 查找所有符合给定模式(pattern)的key
EXISTS key 检查给定key是否存在
TYPE key 返回key所储存的值的类型
TTL key 返回给定key的剩余生存时间(TTL,time to live),以秒为单位
DEL key 该命令用于在key存在是删除key
1. KEYS pattern 查找所有符合给定模式(pattern)的key
在这里插入图片描述
2. EXISTS key 检查给定key是否存在
在这里插入图片描述
3. TYPE key 返回key所储存的值的类型
在这里插入图片描述
4. TTL key 返回给定key的剩余生存时间(TTL,time to live),以秒为单位
在这里插入图片描述
5. DEL key 该命令用于在key存在是删除key
在这里插入图片描述

四、在Java中操作Redis

①:介绍

在这里插入图片描述

②:jedis

在这里插入图片描述

01. 在Java中使用jedis操作Redis

  • 任意创建一个Java工程即可
  • 导入依赖
 <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.3</version>
</dependency>
1. 创建一个测试类
在这里插入图片描述
2. 测试
 @Test
public void JedisTest(){

// 1. 获取连接
Jedis jedis = new Jedis( "localhost", 6379);
// jedis.auth("密码"); // 连接密码
// 2. 执行操作
// 2.1 添加name key = name value = zhangsan
jedis.set("name","zhangsan");
String name = jedis.get("name");
System.out.println(name);
// 2.2 添加哈希hset key = hset field = age value = 23
jedis.hset("hset","age","23");
String age = jedis.hget("hset", "age");
System.out.println(age);
// 2.3 删除 name hset
String[] keys = {
"name","hset"};
long del = jedis.del(keys);
System.out.println(del);
// 3. 关闭连接
jedis.close();
}

在这里插入图片描述

3. 解决报错问题(添加以下两个依赖)
  • 原因:
    使用默认的slf4j打印日志,需要配合slf4j-nop.jar slf4j-simple.jar,slf4j-log4j12.jar,slf4j-jdk14.jar或logback-classic.jar中的其中一个jar包使用(只能是一个,多了就会有冲突).

  • 解决方法:
    在Maven工程的pom文件中,Add the following dependency configuration,项目就可以正常编译运行了.

 <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.0</version>
</dependency>
4. 再次测试
在这里插入图片描述

③: Spring Data Redis

01. 介绍

在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作

  • maven:坐标:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.0</version>
</dependency>

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:Zset类型数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

02. 创建SpringBoot工程

1. 创建一个springBoot工程
在这里插入图片描述
  • 导入依赖
 <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.0</version>
</dependency>
  • application.yml
spring:
application:
name: springBoot_04_redis
# Redis 相关配置
redis:
host: localhost
port: 6379
# password: root
database: 0 # 操作的是0号数据库
jedis:
# Redis 连接池配置
pool:
max-active: 8 # 最大连接数
max-wait: 1ms # 连接池最大阻塞等待时间
max-idle: 4 # The maximum space connection in the connection pool
min-idle: 0 # 连接池中的最小空闲连接
  • SpringBoot04RedisApplicationTests
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBoot04RedisApplicationTests {

@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {

}
}

03.测试

2. 测试
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBoot04RedisApplicationTests {

@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {

// 添加key和value
ValueOperations opsForValue = redisTemplate.opsForValue();
opsForValue.set("name","zhangsan");
String name = (String) opsForValue.get("name");
System.out.println(name);
}
}

在这里插入图片描述### 04. 解决序列化问题

3. 问题
在这里插入图片描述
4 解决方法一:(指定泛型)
在这里插入图片描述在这里插入图片描述
5. 解决方法二(配置RedisConfig)配置类
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){

RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
// 默认的key序列化器为: JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}

④:数据类型操作

01. 操作字符串类型

 @Autowired
private RedisTemplate redisTemplate;
/** * 操作String类型数据 */
@Test
void contextLoads() {

// 添加key和value
ValueOperations opsForValue = redisTemplate.opsForValue();
opsForValue.set("name2","xiaoming");
String name = (String) opsForValue.get("name2");
// 设置一个有效时间为60秒的key
opsForValue.set("age","23",60L, TimeUnit.SECONDS);
Object age = opsForValue.get("age");
// Determines whether a value still exists
opsForValue.setIfAbsent("age",23);
System.out.println("姓名: " + name + " 年龄: " +age);
}

02. 操作hash类型操作

 @Autowired
private RedisTemplate redisTemplate;
/** * 操作Hash类型数据 */
@Test
public void testHash(){

HashOperations hashOperations = redisTemplate.opsForHash();
// 存值
hashOperations.put("001","name","zhangsan");
hashOperations.put("001","age","23");
hashOperations.put("001","address","henan");
// 取值
Object name = hashOperations.get("001", "name");
System.out.println(name);
// 获取hashAll fields in the structure
Set keys = hashOperations.keys("001");
System.out.println("keys = " + keys);
// 获取hash结构中所有的值
List values = hashOperations.values("001");
System.out.println("values = " + values);
}

在这里插入图片描述

03. 操作List类型数据

 @Autowired
private RedisTemplate redisTemplate;
/** * 操作List类型数据 */
@Test
public void testList(){

ListOperations listOperations = redisTemplate.opsForList();
// 存值(一个值)
listOperations.leftPush("myList","a");
// 存值(多个值)
listOperations.leftPushAll("myList","b","c","d");
// 取值
List<String> myList = listOperations.range("myList", 0, -1);
for (String value : myList) {

System.out.print("value = " + value +" ");
}
System.out.println();
// 获取;列表长度 llen
int len = listOperations.size("myList").intValue();
for (int i = 0; i < len; i++) {

String value2 = (String) listOperations.rightPop("myList");
System.out.print("value2 = " + value2 +" ");
}
}

在这里插入图片描述

04. 操作set类型的数据

 @Autowired
private RedisTemplate redisTemplate;
/** * 操作set类型的数据 */
@Test
public void tetsSet(){

SetOperations setOperations = redisTemplate.opsForSet();
// 存储
setOperations.add("values","a", "a", "b", "b", "c", "d");
// 取值
Set<String> mySet = setOperations.members("values");
System.out.println("mySet = " + mySet);
// 删除成员
setOperations.remove("values","a","b");
// 取值
Set<String> mySet2 = setOperations.members("values");
System.out.println("mySet2 = " + mySet2);
}

在这里插入图片描述

05. 操作sorted set类型数据

 /** * 操作sorted set类型数据 */
@Test
public void testZSet(){

ZSetOperations zSetOperations = redisTemplate.opsForZSet();
// 存储 (有序 去重 Sort by score(从小到大))
zSetOperations.add("myZSet","a",1.0);
zSetOperations.add("myZSet","b",2.0);
zSetOperations.add("myZSet","c",3.0);
zSetOperations.add("myZSet","a",4.0);
// 取值
Set<String> myZSet = zSetOperations.range("myZSet", 0, -1);
System.out.println("myZSet = " + myZSet);
// 修改分数 (b + 10)
zSetOperations.incrementScore("myZSet","b",10.0);
// 取值
Set<String> myZSet2 = zSetOperations.range("myZSet", 0, -1);
System.out.println("myZSet2 = " + myZSet2);
// 删除
zSetOperations.remove("myZSet", "a","c");
// 取值
Set<String> myZSet3 = zSetOperations.range("myZSet", 0, -1);
System.out.println("myZSet3 = " + myZSet3);
}

在这里插入图片描述

06. 通用操作

 @Autowired
private RedisTemplate redisTemplate;
/** * 通用操作 针对不同的数据类型都可以操作 */
@Test
public void testPublic(){

// 1. 获取所有的key
Set<String> keys = redisTemplate.keys("*");
System.out.println("keys = " + keys);
// 2.判断某一个key是否存在
Boolean myZSet = redisTemplate.hasKey("myZSet");
System.out.println("myZSet = " + myZSet);
// 3. 删除指定key
Boolean myZSet1 = redisTemplate.delete("myZSet");
System.out.println("myZSet1 = " + myZSet1);
// 4.获取指定key对应的value的数据类型
DataType mySet = redisTemplate.type("mySet");
System.out.println("mySet.name() = " + mySet.name());
}

在这里插入图片描述

copyright:author[Happy Clover (● ̄(エ) ̄●)],Please bring the original link to reprint, thank you. https://en.javamana.com/2022/266/202209230926111913.html