java|SpringBoot整合Redis以及Redis缓存

【java|SpringBoot整合Redis以及Redis缓存】这里写自定义目录标题
NOSQL
1.NOSQL和RDBMS的区别

(1)RDBMS(关系型数据库) (2)NoSQL(非关系型数据库)

常见的NOSQL数据库类型
redis
什么是redis
为什么使用redis(整合项目中redis更多的是用于缓存数据)
2.安装redis
(1)下载redis (2)传输到linux中 (3)安装步骤

3.测试
(1)开启redis (2)使用redis客户端连接redis服务器 (3)redis.conf的配置文件 (4)redis图形化界面的客户端

Java springboot连接redis.—jedis
4.配置
(1)编写java代码主要作用到server层

5.redis作为缓存使用
(1)缓存的使用场景 (2)缓存的原理:

6.使用redis缓存
(1)server使用缓存,这里有两种方法 (2)基于spring的缓存注解

NOSQL
NOSQL(Not only sql):不仅是sql语句, 它是对所有非关系型数据库的一种统称。 除去关系型数据库之外的都是非关系数据库。
非关系型数据库是对关系型数据库的补充而不是代替,在企业的开发中,一般都是关系型、非关系型配合使用
NOSQL和RDBMS的区别
RDBMS(关系型数据库)
1.高度组织化结构化数据。 user—userid username age sex …
2.结构化查询语言(SQL) sql语句
3.数据和关系都存储在单独的表中。
4.数据操纵语言DML,数据定义语言DDL
5.严格的一致性. 事务
6.基于事务
NoSQL(非关系型数据库)
1.代表着不仅仅是SQL
2.没有声明性查询语言
3.键 - 值对存储。
4.最终一致性,而非ACID【原子,一致,隔离,持久】属性
5.非结构化和不可预知的数据 字符串 对象 队列 集合
6.高性能,高可用性和可伸缩性。 适合搭建集群。 mysql搭建集群。非常复杂。主从模式
常见的NOSQL数据库类型
Redis就属于非关系数据库。
Mongodb属于非关系数据库。----接近mysql数据库
redis
什么是redis
Redis是一种开放源代码(BSD许可)的内存中数据结构存储, 用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,地理空间索引和流。 Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。Redis是一个开源的使用ANSI C语言编写可基于内存亦可基于磁盘,Key-Value数据库。类似于map
为什么使用redis(整合项目中redis更多的是用于缓存数据)
1.Redis读取的速度是110000次/s,写的速度是81000次/s
2.原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
3.支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
4.持久化–磁盘,主从复制(集群)
5.官方不支持window系统,但是又第三方版本。 linux系统。
安装redis
下载redis
1.安装redis需要的环境。yum install -y gcc-c++
2.上官网下载redis源码安装包。
redis.tar.gz
java|SpringBoot整合Redis以及Redis缓存
文章图片

传输到linux中
java|SpringBoot整合Redis以及Redis缓存
文章图片

安装步骤
1.解压redis到/usr/local
2.进入redis目录并执行编译命令 make
3.执行安装命令 make install
4.需要选择时选择 yes
测试
开启redis
redis-server redis.conf
java|SpringBoot整合Redis以及Redis缓存
文章图片

使用redis客户端连接redis服务器
redis-cli -h redis服务器的ip -p redis服务器的端口号
本机默认端口号为6379
主机ip127.0.0.1
可以在redis.conf文件中更改
可以直接使用redis-cli 连接
java|SpringBoot整合Redis以及Redis缓存
文章图片

redis.conf的配置文件
daemonize yes # 默认的端口号。 port 6379 # 默认运行绑定的端口号~~~~~~~~~~~~~~~~~~~~~~~HTTP协议~~~~~~~~~~~~~~~~~ # bind 127.0.0.1 # 0.0.0.0 表示广播模式 意思是所有人都可以连接。127.0.0.1 bind 0.0.0.0

redis图形化界面的客户端
https://www.oschina.net/p/redisplus?hmsr=aladdin1e1

java|SpringBoot整合Redis以及Redis缓存
文章图片

Java springboot连接redis.—jedis
配置
(1)pom中加入依赖
"> redis.clients jedis 3.3.0

(2)在application中配置连接数据
server.port=8888 spring.datasource.druid.url=jdbc:mysql:///ssm_crud?serverTimezone=Asia/Shanghai spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.druid.username=root spring.datasource.druid.password=rootspring.redis.cluster.nodes=192.168.213.188:8001,192.168.213.188:8002,192.168.213.188:8003,192.168.213.188:8004,192.168.213.188:8005,192.168.213.188:8006 #连接redis----------------------------------------------#连接哨兵集群----------------------- spring.redis.sentinel.master=mymaster #哨兵的名字 spring.redis.sentinel.nodes=192.168.213.188:26379#哨兵端口 #spring.redis.host=192.168.213.188#IP #spring.redis.port=6379#端口 #spring.redis.jedis.pool.max-active=20#redis连接池多大连接对象个数 #spring.redis.jedis.pool.max-idle=8#redis连接池最大有多少个空闲 #spring.redis.jedis.pool.min-idle=0#redis连接池最小有多少个空闲 #spring.redis.jedis.pool.max-wait=20000#如果没有响应等待的时间 #连接去中心化集群----------- # 列出所有的节点。 如果当时你分配槽的时候127.0.0.1那么就无法连接。 #spring.redis.cluster.nodes=192.168.213.188:8001,192.168.213.188:8002,192.168.213.188:8003,192.168.213.188:8004,192.168.213.188:8005,192.168.213.188:8006

#日志显示
logging.level.com.ykq.dao=debug
配置完成开始写Java代码

编写java代码主要作用到server层
java|SpringBoot整合Redis以及Redis缓存
文章图片

测试redis应用
public void testString(){ ValueOperations forValue = https://www.it610.com/article/redisTemplate.opsForValue(); //操作字符串类型 forValue.set("k1","v1"); System.out.println(forValue.get("k1")); Map map=new HashMap<>(); map.put("k9","v9"); map.put("k10","v10"); forValue.multiSet(map); List keys=new ArrayList<>(); keys.add("k1"); keys.add("k2"); keys.add("k4"); List strings = forValue.multiGet(keys); System.out.println(strings); System.out.println(forValue.setIfAbsent("k2", "v2")); }

redis作为缓存使用
缓存的使用场景
1.为什么使用缓存?
减少关系型数据库的访问频率减轻负荷。 提高数据的访问率。
2.什么样的数据适合放入缓存?
1.热点数据。 2. 修改频率比较低。3.安全系数低的。
缓存的原理:
java|SpringBoot整合Redis以及Redis缓存
文章图片

使用redis缓存
(1)搭建一个springboot+mp的工程
(2)引入redis相关的依赖
(3)配置redis
(4)service代码
前三步我们已经完成,这里我们就直接写server层代码了
server使用缓存,这里有两种方法
(1)手动配置,主要写出来便于理解
public class DeptService {@Resource private DeptDao deptDao; //注入RedisTemplate类使用redis @Autowired private RedisTemplate redisTemplate; //查找 先查缓存,缓存没有查数据库,查过后存入缓存 public Dept findById(Integer deptId){ //1.从缓存中查询该数据 Object o = redisTemplate.opsForValue().get("findById::" + deptId); if(o!=null){//表示从缓存中获取该数据 return (Dept) o; } Dept dept = deptDao.selectById(deptId); redisTemplate.opsForValue().set("findById::"+deptId,dept); //把查询的结果放入缓存 return dept; }//删除,先删除缓存,再删除数据库 public int delete(Integer deptId){ redisTemplate.delete("findById::"+deptId); //删除缓存 int i = deptDao.deleteById(deptId); return i; } //修改 先删除缓存,再修改数据库的数据,返回的数据存入缓存 public int update(Dept dept){ redisTemplate.delete("findById::"+dept.getDeptId()); //删除缓存 int i = deptDao.updateById(dept); redisTemplate.opsForValue().set("findById::"+dept.getDeptId(),dept); return i; } }

上面这些代码每次都要写很多与业务无关的一些非业务代码!
所以 所以 所以 java提供了注解来帮我们操作**
基于spring的缓存注解
在方法上加入@Cacheable等注解
在主启动类开启缓存注解@EnableCaching
java|SpringBoot整合Redis以及Redis缓存
文章图片

(1)在主启动上开启缓存注解
@EnableCaching //开启缓存的注解 public class SpringbootRedis02Application {public static void main(String[] args) { SpringApplication.run(SpringbootRedis02Application.class, args); }}

(2)定义注解的序列化
@Configuration public class RedisConfig extends CachingConfigurerSupport { //比如验证码 @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); RedisSerializer redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; }@Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化 .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }

(4)编写server代码
public class DeptService {@Resource private DeptDao deptDao; //该注解作用:会先查询缓存,如果缓存存在,则不会执行代码块。 如果缓存中不存在则执行该方法,并把该方法的返回值存放到redis中 @Cacheable(cacheNames = "findById",key = "#deptId")//缓存的key值 为findById::deptId cacheNames的值+key的值 public Dept findById(Integer deptId){ System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Dept dept = deptDao.selectById(deptId); return dept; }//数据库和缓存同步问题! // beforeInvocation:是否在方法执行前就清空,缺省为 false, // 如果指定为 true,则在方法还没有执行的时候就清空缓存。缺省情况下,如果方法执行抛出异常,则不会清空缓存。 @CacheEvict(cacheNames = "findById",key = "#deptId") public int delete(Integer deptId){ int i = deptDao.deleteById(deptId); return i; }//这个注解是必须执行方法体,而且会把方法体执行的结果放入到缓存中。 如果发生异常则不操作缓存。 @CachePut(cacheNames = "findById",key = "#dept.deptId") public Dept update(Dept dept){ int i = deptDao.updateById(dept); return dept; } }

    推荐阅读