系列文章目录
第一章java基础-基础
第二章 java基础-面向对象
第三章 java基础-API
第四章 java基础-mysql jdbc
第五章 java基础-springboot
第六章 java基础-mybatis mybatisplus
第七章 java基础-SPRING MVC
第八章 java基础-html css js vue
第九章 java基础-nginx
第十章 java基础-微服务
第十一章 java基础-SSO
第十二章 java基础-中间件-linux
第十二章 java基础-中间件-docker
第十二章 java基础-中间件-redis
第十二章 java基础-中间件-RabbitMQ
第十二章 java基础-中间件-ElasticSearch
第十二章 java基础-中间件-Quartz定时任务
目录
前言
Redis诞生于2009年,全称Remote Dictionary Server远程词典服务器,是一个基于内存的键值型的NoSQL数据库。
redis是为了解决读取数据库慢的问题的。是一种非结构化数据。
一、redis简介
特征
-
键值型,value支持多种不同数据结构,功能丰富
-
单线程,每个命令都具备原子性
-
低延迟,速度快(基于内存,IO多路复用,良好的编码)
-
支持数据持久化(数据落地)
-
支持主从集群、分片集群
-
支持多语言客户端
数据结构
二、安装并启动redis
2.1在docker里安装redis
dokcer pull redislabs/rebloom:latest
docker run --name redis -d -p 6379:6379 redislabs/rebloom:latest
2.2 进入redis容器
docker exec -it redis bash
2.3 启动redis客户端
redis-cli
三、redis可视化工具
我们可以使用 Another-Redis-Desktop-Manager 进行redis管理
支持16个数据库
四、redis命令
通用指令是部分数据类型的,都可以使用的指令,常见的有:
-
KEYS:查看符合模板的所有key,*是所有的,?匹配一个
-
DEL:删除一个指定的key
-
EXISTS:判断key是否存在
-
EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
-
TTL:查看一个KEY的剩余有效期
-
TYPE:查看指定key类型
-
SELECT: 切换数据库,默认有16个,下标为0~15
-
CONFIG:配置参数设置(set)以及查看(get)
-
FLUSHDB: 清空当前数据库中的key
-
FLUSHALL:清空所有数据库中的key
-
MULTI:开启事务
-
EXEC:执行事务,相当于提交事务
-
DISCARD:回滚事务
通过help [command] 可以查看一个命令的具体用法
KEY是string类型 值可以多种类型,常见 string list hash等
String类型
key-value
string-string
命令 | 说明 | 案例 |
---|---|---|
set | 添加key-value | set username admin |
get | 根据key获取数据 | get username |
strlen | 根据key获取对应value的长度 | strlen key |
exists | 判断key是否存在 | exists username 返回1存在,0不存在 |
del | 删除Redis中的key | del username |
keys | 用于查询符合条件的key | keys * 查询Redis中全部的key keys n?me 使用占位符获取数据 keys nam* 获取nam开头的数据 |
mset | 添加多个key-value | mset k1 v1 k2 v2 k3 v3 |
mget | 获取多个key的值 | mget k1 k2 |
append | 对某个key的值进行追加value内容 | append key value |
type | 检查某个key的类型 | type key |
select | 切换Redis数据库 | select 0~15 Redis中共有16个数据库 |
flushdb | 清空单个数据库 | flushdb |
flushall | 清空全部数据库 | flushall |
incr | 自动加1 | incr key |
decr | 自动减1 | decr key |
incrby | 指定数值加 | incrby key 10 |
decrby | 指定数值减 | decrby key 10 |
expire | 指定key的有效时间 单位是秒 | expire key 20 指定的key 20秒后失效 |
pexpire | 指定key的有效时间 单位是毫秒 | pexpire key 2000 指定的key 2000毫秒后失效 |
ttl | 检查key的剩余存活时间 | ttl key |
persist | 撤销key的失效时间 | persist key |
incrby(对整数进行操作、如果不是就报错)
-
假设你有一个键名为
counter
的键,其当前值为 10。如果你执行INCRBY counter 5
,则counter
的值将变为 15。 -
如果
counter
这个键原本不存在,执行INCRBY counter 5
后,它的值将被初始化为 0,然后再增加 5,所以最终的值会是 5
五、redis事务
redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚。
命令 | 说明 | 案例 |
---|---|---|
multi | 标记一个事务开始 | 127.0.0.1:6379> multi OK |
exec | 执行所有multi之后发的命令 | 127.0.0.1:6379> exec OK |
discard | 丢弃所有multi之后发的命令 | 127.0.0.1:6379> discard OK |
六、Jedis客户端
引入
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>compile</scope>
</dependency>
测试
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
public class RedisTest {
// 初始化redis对象
private Jedis jedis ;
@BeforeEach
public void setUp(){
// 连接redis容器
jedis = new Jedis("192.168.144.160",6379);
}
@Test
void testString(){
String result = jedis.set("name1", "122");
System.out.println(result);
String name = jedis.get("name1");
System.out.println(name);
}
}
释放资源
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
七、SpringDataRedis
SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单:
依赖
<!--spring-data-redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Jackson依赖:序列化-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
配置文件
spring:
redis:
host: 196.168.144.160
port: 6379
测试
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
void testString() {
// 写入一条String数据
redisTemplate.opsForValue().set("name", "虎哥");
// 获取string数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
序列化工具
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
// 设置Key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}
八、redis进阶
总结
jedis的目的是为了解决不经常变化的数据读取问题。已经广泛应用。说说大家的使用情形和问题。