SpringBoot整合Redis[详细版]
目录
一、简介
什么是Redis
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
为什么要使用Redis
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:
- 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
- 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
- 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。
二、复习 常用Redis类型
主要是springBoot对Redis的整合,所以在介绍类型使用的时候只展示增删改查。
- string
- hash
- list
- set
- sorted_set
1、string类型
1.1、string类型的介绍
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整形的形式展示,可作为数字操作使用
1.2、string类型数据的基本操作
- 添加/修改数据
set key value
- 获取数据
get key
- 删除
del key
2、hash类型(常用)
2.1、hash类型的介绍
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。
需要的存储结构:一个存储空间保存多个键值对数据
hash类型:底层使用哈希表结构实现数据存储
2.2、hash类型的基本操作
- 添加/修改数据
hset key field value
eg:hset user name zhansgan
eg:hset user age 38
- 获取数据
hget key field
- 删除数据
hdel key field1 [field2] (可以删除多个field)
eg: hdel user name age
3、list类型
3.1、list类型的基本概念
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。
需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序。
list类型:保存多个数据,底层使用双向链表存储结构实现。
3.2、list类型的基本操作
- 添加/修改数据
lpush key value1 [value2] (从左到右存储)
eg:lpush name zhangsan lisi wangwu
rpush key value1 [value2] (从右往左存储)
eg:rpush name zhangsan lisi wangwu
- 获取数据
lrange key start stop 下标从几到几 -1表示最后一个
eg: lrange name 0 -1
- 获取并移除数据
lpop key
eg:lpop name (获取并移除第一个数据)
rpop key
eg:rpop name (获取并移除最后一个数据)
- 删除数据
lrem key count value (在一个key中从左边开始删除几个这样的值)
4、set类型
4.1、set类型的基本介绍
新的存储需求:存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保证大量的数据,高效的内部存储机制,便于查询。
set类型:与hash存储结构完全相同,仅存储键,不存储值,并且键是不允许重复的。
4.2、set类型数据的基本操作
- 添加数据
sadd key member1 [member2]
eg:sadd users zhansgan lisi
eg:sadd users wangwu
- 获取数据
smembers key
- 删除数据
srem key member1 [member2] (可以删除多个field)
eg: srem users zhangsan
5、sorted_set (zset)
5.1、sorted_set概念
新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
需要的存储结构:新的存储模型,可以保存可排序的数据
sorted_set类型:在se的存储结构基础上添加可排序字段
5.2、sorted_set基本操作
- 添加数据
zadd key scorel member1 [ scorel member2]
eg:sadd users 19 lisi
- 获取全部数据
zrange key start stop [WITHSCORES]
eg: zrange users 0 -1(从小到大获取数据的的属性)
eg: zrange users 0 -1 withscores(从小到大获取数据的编号和属性)
zrevrange key start stop [WITHSCORES]
eg: zrevrange users 0 -1(从大到小获取数据的的属性)
eg: zrevrange users 0 -1 withscores(从大到小获取数据的的属性和编号)
- 删除数据
zrem key member1 [member2]
eg: zrem users lisi
三、SpringBoot整合Redis
SpringBoot版本: 2.3.4.RELEASE
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
配置yaml
spring:
redis:
host: 自己的ip
port: 自己的端口号 默认 6379
#Redis使用的数据库
database: 0
#连接超时事件毫秒
timeout: 18000
lettuce:
pool:
#连接池最大连接数
max-active: 20
#最大阻塞等待时间
max-idle: 5
#连接池最小空闲连接
min-idle: 0
RedisTemplate模版序列化配置
在不使用序列化配置之前Java数据序列化底层使用的是默认序列化存入Redis中是解析过乱码的数据,存到Redis中可视化太低!使用之后可以显示中文
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
/**
* redis序列化的工具配置类,下面这个请一定开启配置
* 127.0.0.1:6379 keys *
* 1)"ord:102" 序列化过
* 2)"\xac\xed\x00\x05t\ord:102" 没有序列化过
* this.redisTemplate.opsForValue()//提供了操作String类型的所有方法
* this.redisTemplate.opsForList()//提供了操作List类型的所有方法
* this.redisTemplate.opsForSet()//提供了操作Set类型的所有方法
* this.redisTemplate.opsForHash()//提供了操作Hash类型的所有方法
* this.redisTemplate.opsForZSet()//提供了操作ZSet类型的所有方法
*
*
* @param lettuceConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
//设置key序列化方式String
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认的序列化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
下面图片就是上述代码,请忽略!
在SpringBoot中集成了两个模版一个是 RedisTemplate,另一个为 StringRedisTemplate
而虽然StringRedisTempate帮助我们做了序列化,但是存储数据的时候只能存储Sting类型的数据,而RedisTemplate可以存储Object类型,所以我们一个使用RedisTemplate比较多一些!
Redis的Demo案例
@SpringBootTest
public class RedisTest {
/**
* redis序列化的工具配置类,下面这个请一定开启配置
* 127.0.0.1:6379 keys *
* 1)"ord:102" 序列化过
* 2)"\xac\xed\x00\x05t\ord:102" 没有序列化过
* this.redisTemplate.opsForValue()//提供了操作String类型的所有方法
* this.redisTemplate.opsForList()//提供了操作List类型的所有方法
* this.redisTemplate.opsForSet()//提供了操作Set类型的所有方法
* this.redisTemplate.opsForHash()//提供了操作Hash类型的所有方法
* this.redisTemplate.opsForZSet()//提供了操作ZSet类型的所有方法
*
*
* @param lettuceConnectionFactory
* @return
*/
@Autowired
RedisTemplate redisTemplate;
@Test
public void test1(){
//boundhashOps也是操作redis的一种方法,但是是低版本操作。
//操作方式和opsForhash一样。根据个人喜好都可以
Object content = redisTemplate.boundHashOps("content").get("1");
System.out.println(content);
}
/**
存储string类型
*/
@Test
public void test2(){
/**
* redisTemplate.opsForValue()//提供了操作String类型的所有方法
*/
Object name ="dession";
redisTemplate.opsForValue().set("name",name);
//设置过期时间1天过期
redisTemplate.expire("name",1, TimeUnit.DAYS);
System.out.println(redisTemplate.opsForValue().get("name"));
// 结果为:dession
}
/**
存储Hash数据类型
*/
@Test
public void test3(){
//单个存储
redisTemplate.opsForHash().put("users","name","zhangsan");
//设置过期时间
redisTemplate.expire("users",1, TimeUnit.DAYS);
//多只存储
Map map = new HashMap();
map.put("age",12);
map.put("sex","男");
redisTemplate.opsForHash().putAll("users",map);
Object o = redisTemplate.opsForHash().get("users", "name");
System.out.println(o);
}
}
好啦,以上是我操作两个最最最常用的数据类型的方式来进行的案例讲解,还有其中还有很多方法不能一一列举出来,剩下的任务传递给你,认真探索一下redis的奥秘吧!
更多推荐
所有评论(0)