ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

spring整合redis和开启redis缓存

2021-04-15 21:03:06  阅读:248  来源: 互联网

标签:deptId 缓存 spring redis 192.168 dept


这里写自定义目录标题

NOSQL

NOSQL(Not only sql):不仅是sql语句, 它是对所有非关系型数据库的一种统称。 除去关系型数据库之外的都是非关系数据库。
非关系型数据库是对关系型数据库的补充而不是代替,在企业的开发中,一般都是关系型、非关系型配合使用

NOSQL和RDBMS的区别

RDBMS(关系型数据库)

  • 高度组织化结构化数据。 user—userid username age sex …
  • 结构化查询语言(SQL) sql语句
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言DML,数据定义语言DDL
  • 严格的一致性. 事务
  • 基于事务

NoSQL(非关系型数据库)

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 键 - 值对存储。
  • 最终一致性,而非ACID【原子,一致,隔离,持久】属性
  • 非结构化和不可预知的数据 字符串 对象 队列 集合
  • 高性能,高可用性和可伸缩性。 适合搭建集群。 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
在这里插入图片描述

传输到linux中

在这里插入图片描述

安装步骤

  1. 解压redis到/usr/local
  2. 进入redis目录并执行编译命令 make
  3. 执行安装命令 make install
    4.需要选择时选择 yes

测试

开启redis

redis-server redis.conf

在这里插入图片描述

使用redis客户端连接redis服务器

redis-cli -h redis服务器的ip -p redis服务器的端口号
本机默认端口号为6379
主机ip127.0.0.1
可以在redis.conf文件中更改
可以直接使用redis-cli 连接

在这里插入图片描述

redis.conf的配置文件

# 表示启动redis服务器时 后台启动。
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.—jedis

配置

(1)pom中加入依赖

 <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>
   </dependencies>

(2)在application中配置连接数据

#druid配置数据源----------------------
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=root

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
#连接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层

在这里插入图片描述测试redis应用

 @Test
    public void testString(){
        ValueOperations<String, String> forValue = redisTemplate.opsForValue();//操作字符串类型
        forValue.set("k1","v1");
        System.out.println(forValue.get("k1"));

        Map<String,String> map=new HashMap<>();
        map.put("k9","v9");
        map.put("k10","v10");
        forValue.multiSet(map);

        List<String> keys=new ArrayList<>();
        keys.add("k1");
        keys.add("k2");
        keys.add("k4");
        List<String> strings = forValue.multiGet(keys);
        System.out.println(strings);

        System.out.println(forValue.setIfAbsent("k2", "v2"));

    }

redis作为缓存使用

缓存的使用场景

1.为什么使用缓存?
减少关系型数据库的访问频率减轻负荷。 提高数据的访问率。

2.什么样的数据适合放入缓存?
1.热点数据。 2. 修改频率比较低。3.安全系数低的。

缓存的原理:

在这里插入图片描述

使用redis缓存

(1)搭建一个springboot+mp的工程
(2)引入redis相关的依赖
(3)配置redis
(4)service代码
前三步我们已经完成,这里我们就直接写server层代码了

server使用缓存,这里有两种方法

(1)手动配置,主要写出来便于理解

@Service
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的缓存注解

(1)在主启动上开启缓存注解

@SpringBootApplication
@EnableCaching //开启缓存的注解
public class SpringbootRedis02Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRedis02Application.class, args);
    }

}

(2)编写server代码

@Service
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;
    }
}

标签:deptId,缓存,spring,redis,192.168,dept
来源: https://blog.csdn.net/weixin_56320090/article/details/115736626

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有