目录
- 引出
- MySQL数据库:慢
- Redis是啥?
- 问题:redis是单线程的,为什么会非常快?
- 安装Redis的docker
- 1.搜索docker search redis
- 2.拉取docker pull redis
- 3.运行容器
- 4.进入容器-->进入redis
- redis的基本数据类型
- 字符串(string)
- 列表(list)
- 集合(set)
- 有序集合(sorted set)
- 哈希表(hash)【重要】
- redis常用命令
- springBoot整合redis
- 1.添加依赖的包
- 2.配置redis
- 3.初步使用StringRedisTemplate
- 总结
引出
1.MySQL数据库为啥慢?IO密集型;
2.Redis是啥,内存数据库,快;
3.安装Redis的docker,搜索,拉取,运行,进入;
4.Redis的基本数据类型,字符串,哈希表Hash;
5.Redis的常用命令,设置有效时间,expire uuid 10;
6.SpringBoot整合Redis的方式,StringRedisTemplate;
MySQL数据库:慢
IO密集型操作
Redis是啥?
官网:
https://redis.io/docs/about/
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
问题:redis是单线程的,为什么会非常快?
安装Redis的docker
1.搜索docker search redis
[root@192 ~]# docker search redis
2.拉取docker pull redis
[root@192 ~]# docker pull redis
3.运行容器
[root@192 ~]# docker run -itd --name=redis_6379 -p 6379:6379 redis
4.进入容器–>进入redis
docker exec -it redis_6379 bash
redis-cli
redis的基本数据类型
字符串(string)
序列 | 命令 | 描述 |
---|---|---|
1 | set key value | 设置指定 key 的值 |
2 | get key | 获取指定 key 的值。 |
3 | mget key1 key2 … keyn | 获取所有(一个或多个)给定 key 的值。 |
4 | setnx key value | 只有在 key 不存在时设置 key 的值。 |
5 | strlen key | 返回 key 所储存的字符串值的长度。 |
6 | incr key | 将 key 中储存的数字值增一。 |
7 | decr key | 将 key 中储存的数字值减一。 |
[root@localhost ~]# docker ps |grep redis
5d04e3abf91f redis "docker-entrypoint..." 7 days ago Up 3 days 0.0.0.0:6379->6379/tcp redis_6379
[root@localhost ~]# docker exec -it redis_6379 bash
root@5d04e3abf91f:/data# redis-cli
127.0.0.1:6379> keys *
1) "dress"
2) "tom_bank"
3) "weather"
4) "username"
5) "goods"
6) "mycar"
7) "book"
127.0.0.1:6379> setnx fruits apple
(integer) 1
127.0.0.1:6379> get fruits
"apple"
127.0.0.1:6379>
列表(list)
可以重复
序列 | 命令 | 描述 |
---|---|---|
1 | llen key | 获取列表长度 |
2 | lpush key value1… value2 | 将一个或多个值插入到列表头部 |
3 | lpop key | 移出并获取列表的第一个元素 |
4 | lrange key start stop | 获取列表指定范围内的元素 |
5 | lrem key count value | 移除列表元素 |
6 | rpush key value1… value2 | 尾部添加 |
7 | rpop key [count] | 尾部移除[count]元素 |
127.0.0.1:6379> lpush fruits apple peach
(integer) 2
127.0.0.1:6379> lrange fruits 0 3
1) "peach"
2) "apple"
127.0.0.1:6379> rpush fruits orange
(integer) 3
127.0.0.1:6379> lrange fruits 0 3
1) "peach"
2) "apple"
3) "orange"
127.0.0.1:6379>
集合(set)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
序列 | 命令 | 描述 |
---|---|---|
1 | sadd key member1… member2 | 向集合添加一个或多个成员 |
2 | scard key | 获取集合的成员数 |
3 | smemebers key | 返回集合中的所有成员 |
4 | sismember key member | 判断member元素是否是集合key的成员 |
5 | spop key | 移除并返回集合中的一个随机元素 |
127.0.0.1:6379> sadd fruits apple apple orange
(integer) 2
127.0.0.1:6379> smembers fruits
1) "orange"
2) "apple"
127.0.0.1:6379>
有序集合(sorted set)
序列 | 命令 | 描述 |
---|---|---|
1 | zadd key score1 member1… score2 member2 | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 | zcard key | 获取集合的成员数 |
3 | zcount key min max | 计算在有序集合中指定区间分数的成员数 |
4 | zrangebylenx key min max[limit offset count] | 通过字典区间返回有序集合的成员 |
5 | zrem key member1 member2 | 移除有序集合中的一个或多个成员 |
6 | ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
7 | zscore key member | 返回有序集中,成员的分数值 |
127.0.0.1:6379> zadd stu 3 peter 8 shirley
(integer) 2
127.0.0.1:6379> zrange stu 0 10
1) "peter"
2) "shirley"
127.0.0.1:6379> zadd stu 6 mary
(integer) 1
127.0.0.1:6379> zrange stu 0 10
1) "peter"
2) "mary"
3) "shirley"
127.0.0.1:6379>
哈希表(hash)【重要】
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
序列 | 命令 | 描述 |
---|---|---|
1 | hdel key field1 field2… fieldn | 删除一个或多个哈希表字段 |
2 | hexists key field | 查看哈希表 key 中,指定的字段是否存在 |
3 | hget key field | 获取存储在哈希表中指定字段的值 |
4 | hgetall key | 获取在哈希表中指定 key 的所有字段和值 |
5 | hincrby key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |
6 | hkeys key | 获取所有哈希表中的字段(field) |
7 | hlen key | 获取哈希表中字段的数量 |
8 | hmget key field1 field2 | 获取所有给定字段的值 |
9 | hset key field value | 将哈希表 key 中的字段 field 的值设为 value 。 |
10 | hsetnx key field value | 只有在字段 field 不存在时,设置哈希表字段的值。 |
11 | hvals key | 获取哈希表中所有值 |
127.0.0.1:6379> hset stu name wm grand 4
(integer) 2
127.0.0.1:6379> hget stu name
"wm"
127.0.0.1:6379>
判断某个查看哈希表 key 中,指定的字段是否存在
127.0.0.1:6379> hexists book amount
(integer) 1
127.0.0.1:6379> hexists book amount123
(integer) 0
127.0.0.1:6379>
获取字段的值,进行减一操作
127.0.0.1:6379> hget book amount
"3"
127.0.0.1:6379> hincrby book amount -1
(integer) 2
127.0.0.1:6379> hget book amount
"2"
127.0.0.1:6379>
redis常用命令
序列 | 命令 | 描述 |
---|---|---|
1 | del key | 删除 key |
2 | exists key | 检查给定 key 是否存在。 |
3 | expire key seconds | 为给定 key 设置过期时间。 |
4 | pexpire key millisenconds | key 的过期时间以毫秒计。 |
5 | keys pattern | 查找所有符合给定模式( pattern)的 key 。(*) |
6 | ttl key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
7 | type key | 返回 key 所储存的值的类型。 |
127.0.0.1:6379> set uuid pet
OK
127.0.0.1:6379> expire uuid 10
(integer) 1
127.0.0.1:6379> get uuid
"pet"
127.0.0.1:6379> get uuid
(nil)
127.0.0.1:6379>
可以用在验证码中,10s后过期,失效
springBoot整合redis
1.添加依赖的包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianju</groupId>
<artifactId>springboot_redis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 起步依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis的包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
</project>
2.配置redis
spring:
redis:
host: 192.168.111.130
port: 6379
database: 0 # 可以不设置,默认是0
完整的redis配置
## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器连接端口
spring.redis.port=6379
## Redis 数据库索引(默认为 0)
spring.redis.database=0
## 以下非必须,有默认值
## Redis 服务器连接密码(默认为空)
spring.redis.password=
## 连接池最大连接数(使用负值表示没有限制)默认 8
spring.redis.lettuce.pool.max-active=8
## 连接池最大阻塞等待时间(使用负值表示没有限制)默认 -1
spring.redis.lettuce.pool.max-wait=-1
## 连接池中的最大空闲连接 默认 8
spring.redis.lett uce.pool.max-idle=8
## 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
3.初步使用StringRedisTemplate
package com.tianju.springboot.service.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.concurrent.TimeUnit;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RedisDemoTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void redisString(){
stringRedisTemplate.opsForValue().set("peter", "pet");
//判断键是否存在
boolean exists = Boolean.TRUE.equals(stringRedisTemplate.hasKey("peter"));
System.out.println(exists);
// 取出
String value = stringRedisTemplate.opsForValue().get("peter");
System.out.println(value);
}
}
总结
1.MySQL数据库为啥慢?IO密集型;
2.Redis是啥,内存数据库,快;
3.安装Redis的docker,搜索,拉取,运行,进入;
4.Redis的基本数据类型,字符串,哈希表Hash;
5.Redis的常用命令,设置有效时间,expire uuid 10;
6.SpringBoot整合Redis的方式,StringRedisTemplate;