安装redis并整合到spring当中

一、为什么要加入缓存redis

1、首先用户请求redis缓存服务器数据,如果查询不到。
2、则去MySQL数据库查询,查询到了就返回给用户。
3、并且把数据同步到redis缓存服务器!
在这里插入图片描述

二、在Linux系统中安装redis

一、首先在我的虚拟机的Linux系统中安装redis服务器

(1)tar -zxvf redis-3.0.4.tar.gz解压redis压缩包到目录/opt
(2)cd redis-3.0.4
(3)make
(4)cd src
(5)make install
(6)cd ..返回上一级
(7)vi reids.conf
在bind 127.0.0.1这里加入bind 自己Linux的ip地址
将 daemonize no 改成 yes
保存退出
(8)redis-server redis.conf启动服务器就可以了!

二、设置开机自启:

#cd redis-3.0.4
 
#mkdir /etc/redis
 
#cp redis.conf /etc/redis/6379.conf
 
#cp utils/redis_init_script /etc/init.d/redis
 
#chmod 777 /etc/init.d/redis

#vi /etc/init.d/redis

在脚本上方加入这个:#chkconfig: 2345 80 90
在这里插入图片描述
chkconfig --add redis加入服务
service redis start开启服务

重启测试成功!!!

三、在spring框架中引入客户端jedis,用于连接redis:

1、redis使用,代码实现基本步骤:
//链接缓存
//查询缓存
//如果缓存没有,查询MySQL
//MySQL查询结果存入redis

2、redis的整合步骤
(1)将redis整合到项目中(redis+spring)
专业的整合,spring工厂式架构整合,在spring放一个redis工厂单例,跟随spring启动同时启动!而不是现用现连。在工厂里放一个池子,在池子里放好redis连接和jdbc连接等一样
在这里插入图片描述
注意!!!!!!!!!!!!!!!!!!!!!!!!!!!:
第一步:首先要对redis进行封装,封装成工厂初始化连接池对象。(redis工厂类)
第二步:创建Config类,把redis工厂类整合到spring容器里
其他的技术要整合到spring基本都这两步套路整合!

(2)设计数据存储策略(集合方式、字符串方式、key和value结构、map哈希结构、一个表一个表对应的存储、java封装好的对象)
企业中的存储策略(核心就是,如何设计key)
数据对象名:对象id:对象属性
例如:
User:123:username 存储id为123的user的名字
User:100:password 存储id为100的user的密码

现在我们的项目的sku商品的详情页面
需要存储:
Sku:120:info 存储id为120的sku商品的info基本信息

3、redis整合过程:
(1)先引入pom依赖,本电商工程所有的redis统一放入gmall-service-util模块中

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

(2)写一个redis工具类(用来将redis的池 初始化 到spring容器中

public class RedisUtil {
    private JedisPool jedisPool;
    //初始化连接池
    public void initPool(String host,int port ,int database){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(200);  //最大连接数为200
        poolConfig.setMaxIdle(30);
        poolConfig.setBlockWhenExhausted(true);
        poolConfig.setMaxWaitMillis(10*1000);  //延迟时间是10秒
        poolConfig.setTestOnBorrow(true);
        jedisPool=new JedisPool(poolConfig,host,port,20*1000);
    }
    public Jedis getJedis(){
        Jedis jedis = jedisPool.getResource(); //从连接池返回一个链接给调用者
        return jedis;
    }
}

(3)写一个spring整合redis的配置类(将redis连接池 创建到 spring容器中

@Configuration  //相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)
public class RedisConfig {
    //读取配置文件中的redis的ip地址,其他哪个模块要使用redis,在properties文件配置以下三个属性即可!
    @Value("${spring.redis.host:disabled}")
    private String host;
    @Value("${spring.redis.port:0}")
    private int port;
    @Value("${spring.redis.database:0}")
    private int database;
    @Bean   //这个注解,是把return的redisUtil结果创建到spring容器中!!!
    public RedisUtil getRedisUtil(){
        if(host.equals("disabled")){
            return null;
        }
        RedisUtil redisUtil=new RedisUtil();
        redisUtil.initPool(host,port,database);  //初始化链接池属性,接收ip地址、端口、redis数据库
        return redisUtil;
    }
}

(4)在其他模块要引入redis缓存,则在它的properties文件加入以下redis属性

# redis链接地址
spring.redis.host=172.25.0.11

# redis端口号
spring.redis.port=6379

# redis数据库
spring.redis.database=0

记得在要Linux系统开放6379这个端口:

firewall-cmd --permanent --add-port=6379/tcp
firewall-cmd --reload

(5)在gmall-manage-service模块测试一下:

@SpringBootTest
@RunWith(SpringRunner.class)
public class GmallManageServiceApplicationTests {


    @Autowired
    RedisUtil redisUtil;

    @Test
    public void contextLoads() {
        Jedis jedis = redisUtil.getJedis();

        System.out.println(jedis+"!!!!!!!!!!!!!");
    }

}

这里有个坑:在我的gmall-manage-service模块的启动类,无法扫描到gmall-service-util模块的redisUtil。原因就是:该启动类的路径在com.atguigu.gmall.manage下,而redisUtil类、RedisConfig类在路径com.atguigu.gmall.util,所以导致启动类无法扫描到这个redisUtil,没有初始化spring容器中,测试继续调它的方法,直接报空值异常!
在这里插入图片描述
在这里插入图片描述
解决,把这个启动类从manage包拉到gmall包下,这样这个启动类就有权利扫描工具类了
在这里插入图片描述
再运行测试一下,成功打印内存指针地址:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值