前言:
Redis是一个开源的内存数据结构存储,支持丰富的数据类型,如字符串、哈希、列表、集合和有序集合,作为一个键值对数据库,Redis能提供毫秒级的响应时间,适合高并发应用场景。它还支持持久化,将内存数据定期保存到硬盘,保证数据安全,Redis不仅能在单服务器上处理大规模数据,还能通过分片和集群扩展至多个节点,满足不断增长的业务需求。总之,Redis是一个强大的内存数据库解决方案,适应现代应用程序对性能和灵活性的苛刻要求。接下来,我们将深入探讨Redis的特性和最佳实践。
Redis是什么
Redis是一个开源,将数据以key-value结构存储在内存中的一款非关系型数据库,Redis可以用来当做数据库(存储简单数据,例如:新闻的点赞量)缓存(秒杀的商品数量信息)
Redis特点
- 可以将数据存储在内存中,也可以将数据持久化到硬盘上
- 性能极高
- 丰富的数据结构存储数据
为什么使用Redis
大量用户连接数据库,数据库就会出现瓶颈(连接数量太多,IO时间),为了缓解关系型数据库压力,可以将一些数据暂时存储到redis中,甚至直接存储到redis中,从而实现对关系型数据库的保护.
安装Redis
第一步:创建redis配置文件和数据映射挂载卷
mkdir -p /opt/redis/conf ----->创建redis配置文件
mkdir -p /opt/redis/data ----->创建数据映射挂载卷
第二步:拉去镜像
docker pull redis:6.0
第三步:安装命令
docker run -d -p 6379:6379 \
--name redis \
--restart=always \
--privileged=true \
-v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis/data:/data \
redis:6.0
Redis数据结构
- String(字符串)
- Hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
注:Redis中的key(键)只能为String类型
String(字符串)
String是Redis最基本的类型,一个key对应一个value
String类型是二进制安全的,Redis的String可以包含任何数据.例如:jpg图片或者序列化对象
String类型是Redis最基本的数据类型,String类型的值最大能存储512MB
单值存储
单只存储:存一个具体的值,也可以存储一个Java中的对象,对象是被序列化成json格式的字符串
set key value 存储数据
get key 拿去数据
del key 删除数据
key* 查看所有数据
计数器
set news_views:1 0 设置文章访问量
incr news_views:1 文章访问量+1
decr news_views:1 文章访问量-1
get news_views:1 获得值
Hash(哈希)
Redis Hash是一个String类型的field和value的映射表,Hash特别适合用于存储对象
Hash存储的是字符串和字符串的映射,比如存储用户购物信息
hset key 属性 值 存储
hget key 属性 拿去
hdel key 属性 删除某个属性
hlen key 返回哈希表 key 中的属性的数量
hgetall key 返回key下所有属性值
List(列表)
有序集合 里面可以存储重复
lpush key val 从左边向集合添加元素
rpush key val 从右边向集合添加元素
lpop key 移除并返回key列表的头元素
lpop key 移除并返回key列表的尾元素
set(集合)
无序不重复集合
sadd key val 添加
srem key val 删除
smembers key 查看指定key下所有的值
scard key 查看key下元素数量
zset
有序不重复集合
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为 集合中的成员进行从小到大的排序。
zset 的成员是唯一的,但分数(score)却可以重复
zadd key 分数 值
zrem key 值
zscore key 值 返回值的分数
zcard key 查看key下元素数量
设置失效时间
有时候我们并不希望 redis 的 key 一直存在。例如缓存,验证码等数据,我们希 望它们能在一定时间内自动的被销毁。redis 提供了一些命令,能够让我们对 key 设置过期时间,并且让 key 过期之后被自动删除
PX 表示以毫秒为单位 EX,PX 不区分大小写
set name jim EX 30 设置失效时间为 30 秒
ttl 键 查看剩余时间(秒)
pttl 键 查看剩余时间(毫秒)
SpringBoot集成redis
- 使用官方提供的jedis类实现链接
- 使用Springboot对jedis的封装实现
- 管理连接redis对象,提供数据库连接池的功能
- 针对每一种的数据结构分别封装了不同的实现类
- 事务
- 提供了对键 值进行序列化,反序列化操作
搭建
第一步:添加 redis 依赖
<!--springBoot redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置连接redis
redis:
host: 192.168.65.128
port: 6379
password: 123
database: 0
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 5000ms # 连接超时时间(毫秒)
注入RedisTemplate并测试
public class redisTest {
@Autowired
RedisTemplate redisTemplate;
@RequestMapping(path = "/test1")
public void test1(){
/* System.out.println(redisTemplate.hasKey("")); //判断键是否存在
System.out.println(redisTemplate.delete("")); //删除键*/
//redisTemplate.setValueSerializer();对值指定序列化的方式
//redisTemplate.setKeySerializer();对键指定序列化的方式
//valueOperations提供
System.out.println("1");
ValueOperations valueOperations = redisTemplate.opsForValue();
// valueOperations.set("name","jim");
// System.out.println(redisTemplate.hasKey("name"));
Menu menu = new Menu();
menu.setId(1);
menu.setName("新闻联播");
menu.setType(1);
menu.setUrl("/news");
valueOperations.set("menu",menu);
}
}
注:我们存储数据必须经过处理,要不然数据存储为二进制形式,所以我们配置拦截器
拦截器
package com.kid.news.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
/**
* 序列化键,值
* @param connectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//序列化策略
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
StringRedisSerializer redisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer);//key 单一的字符串
redisTemplate.setHashKeySerializer(redisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value {}
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!
希望路飞的笑容可以治愈努力路途中的你我!
博主vx:Dreamkid05 --->欢迎大家和博主讨论问题