Redis缓存实战教程_redis 缓存数据 实战_南宫乘风的博客-程序员资料

技术标签: Java  

目录

 

Redis缓存

使用缓存Redis解决首页并发问题

1、缓存使用的简单设计

2、Redis的整合步骤

A 将Redis整合到项目中(Redis+Spring)

B 设计一个数据存储策越

3、Redis的整合过程

 

1、引入pom依赖信息(将本工程所有的Redis统一放入service-util里)

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

3、写一个spring整合Redis的配置类

4、每隔引用工程引入service-util后,单独配置只能的redis的配置文件

 

代码

查询结果

查看Redis数据库的数据

 


Redis缓存

重点要讲的是另外一个层面:尽量避免直接查询数据库。

解决办法就是:缓存

缓存可以理解是数据库的一道保护伞,任何请求只要能在缓存中命中,都不会直接访问数据库。而缓存的处理性能是数据库10-100倍。

使用缓存Redis解决首页并发问题

  1. 用户第一次请求到redis
  2. 如果redis没有数据,redis会请求mysql
  3. mysql会把数据返回给用户,同时会传到redis上
  4. 第二次用户访问时,redis有数据,就不需要访问mysql。节省时间,降低消耗

 

 

1、缓存使用的简单设计

  1. 连接缓存
  2. 查询缓存
  3. 如果缓存没有,查询mysql
  4. mysql查询结果存入redis

 

2、Redis的整合步骤

 

A 将Redis整合到项目中(Redis+Spring)

 

B 设计一个数据存储策越

 

企业中的存储策越(核心是:如何设计k)

数据对象名:数据对象id:对象属性

User:123:password 用户ID为123的密码

User:123:userename 用户ID为123的名字

 

3、Redis的整合过程

 

1、引入pom依赖信息(将本工程所有的Redis统一放入service-util里)

 

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

创建两个类RedisConfig和RedisUtil

RedisConfig负责在spring容器启动时自动注入,而RedisUtil就是被注入的工具类以供其他模块调用。

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

RedisUtil

public class RedisUtil {

    private  JedisPool jedisPool;

    public void initPool(String host,int port ,int database){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(200);
        poolConfig.setMaxIdle(30);
        poolConfig.setBlockWhenExhausted(true);
        poolConfig.setMaxWaitMillis(10*1000);
        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的容器中

RedisConfig

 

@Configuration
public class RedisConfig {

    //读取配置文件中的redis的ip地址
    @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
    public RedisUtil getRedisUtil(){
        if(host.equals("disabled")){
            return null;
        }
        RedisUtil redisUtil=new RedisUtil();
        redisUtil.initPool(host,port,database);
        return redisUtil;
    }

}

4、每隔引用工程引入service-util后,单独配置只能的redis的配置文件

 

Service-util的配置文件没有作用

同时,任何模块想要调用redis都必须在application.properties配置,否则不会进行注入

#Redis配置
//读取配置文件中的redis的ip地址
spring.redis.host=192.168.1.111
#Redis端口号
spring.redis.port=6379
#数据库
spring.redis.database=0

代码

这是从数据库调用mysql,查询数据

 /**
     * 从数据库调用
     *
     * @param skuId
     * @return
     */
    public PmsSkuInfo getSkuByIdFromDb(String skuId) {
        //sku的商品对象
        PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();
        pmsSkuInfo.setId(skuId);
        PmsSkuInfo skuInfo = pmsSkuInfoMapper.selectOne(pmsSkuInfo);

        try {
            //sku的图片集合
            PmsSkuImage pmsSkuImage = new PmsSkuImage();
            List<PmsSkuImage> pmsSkuImages = pmsSkuImageMapper.select(pmsSkuImage);
            skuInfo.setSkuImageList(pmsSkuImages);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return skuInfo;

    }

这个是Redis的代码,判断redis中是否有数据,

如果没有,就调用上面的代码,查询mysql数据库。返回结果,在写入redis数据库中。

如果有,直接调用redis数据库中的数据。

/**
     * 商品详细图
     * 主要是item前端的东西,调用此处的服务,方便
     * 使用Redis缓存,解决高并发
     *
     * @param skuId
     * @return
     */
    @Override
    public PmsSkuInfo getSkuById(String skuId) {

        PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();

        //链接缓存
        Jedis jedis = redisUtil.getJedis();

        //查询缓存
        String skuKey = "sky:" + skuId + ":info";
        String skuJson = jedis.get("skuKey");
        //可以吧json的字符串转换成jav的对象类
        if (StringUtils.isNotBlank(skuJson)) {// if (skuJson!=null&&!skuJson.equals(""))
            pmsSkuInfo = JSON.parseObject(skuJson, PmsSkuInfo.class);
        } else {
            //如果缓存没有,查询mysql
            pmsSkuInfo = getSkuByIdFromDb(skuId);

            if (pmsSkuInfo != null) {
                //mysql查询结果存入redis
                jedis.set("sku" + skuId + ":info", JSON.toJSONString(pmsSkuInfo));
            }
        }


        jedis.close();

        return pmsSkuInfo;
    }

查询结果

 

查看Redis数据库的数据

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/heian_99/article/details/102776037

智能推荐

mysql-8.0.16安装笔记_我是何平的博客-程序员资料

文章目录1 网站资源2 前言3 Windows安装3.1免安装版本安装步骤1:点击 [windows 免安装版:https://dev.mysql.com/downloads/mysql/](https://dev.mysql.com/downloads/mysql/)步骤2:下载压缩包步骤3:解压 mysql-8.0.16-winx64.zip,放在 D:\Program Files\mysql...

瞬间高逼格!这 6 种 Python 进度条真的绝了!_我爱Python数据挖掘的博客-程序员资料

嗨!朋友,我是沐沐欢迎你来到学习python的宝藏基地~~长按下方二维码可以添加我为好友哦相信大家对进度条一定不陌生了,比如在我们安装python库的时候可以看到下载的进度,此外在下载文件时也可以看到类似的进度条,比如下图这种:应用场景:下载文件、任务计时等今天辰哥就给大家分享Python的6种不同的实现实时显示处理进度的方式,文中每一种方式都附带一个案例,并提供官方文档,供大家学习,自定义去修改。第1种:普通进度条利用打印功能print进行实时刷新显示for&nbsp;i&nbsp;in&nbsp;ran

Sublimerge 3手动安装简明教程_sublimerge下载_willing·Lin的博客-程序员资料

1、下载地址:https://www.sublimerge.com/sm3/docs/quick-start.html#installation2、将下载的文件放在Sublime Text 3安装目录下:..\Sublime Text 3\Packages\3、重启Sublime Text 3,鼠标右键菜单栏有Sublimerge选项。...

JUnit设计模式分析_xiaoqiang的博客-程序员资料

http://www.uml.org.cn/sjms/200442724.htm这篇文章由grid liu发表在grid liu在IT先锋中担任资深顾问,负责J2EE技术的顾问咨询和培训工作。摘要  JUnit是一个优秀的Java单元测试框架,由两位世界级软件大师Erich Gamma 和 Kent Beck共同开发完成。本文将向读者介绍

微信小程序项目开发实践_不要在定义于 app() 内的函数中_万少博的博客-程序员资料

最近更新时间:2017年7月5日17:25:46    现在的前端工程师职责越来越重要,很多新的技术都是从前端领域分离出来,微信小程序就是一个很好的前端技术的实践。开发微信小程序前,总觉得神秘面纱不可及,但经过前端团队一个月辛苦奋战,微信小程序从此不再陌生,而变得熟悉和可控。现在,小程序终于上线了,我也终于有时间来分享一下开发过程中遇到的问题。0、开发过程中需要遵守的两

微信小程序api视频课程-界面-交互-wx.showActionSheet操作菜单的使用_黄菊华老师的博客-程序员资料

效果图wxml代码wx.showActionSheet(Object object) 显示操作菜单&lt;button bindtap="cd01"&gt;操作菜单01&lt;/button&gt;&lt;button bindtap="cd02"&gt;操作菜单02&lt;/button&gt;js代码 /** * 页面的初始数据 */ data: { ...

随便推点

修改服务器的时区为gmt,将GMT转换为服务器本地时区C#_人工降雨的博客-程序员资料

我正在尝试将我从ebay API获得的GMT时间转换为特定时区,具体取决于我的应用程序托管位置,以便我可以转换并获取正确的日期(因为它们实际上在ebay以及交易)。我试图这样做的方式:DateTime convertedDate = DateTime.SpecifyKind(DateTime.Parse(doc2.GetElementsByTagName("CreatedTime").Item(i...

at&nbsp;new&nbsp;of&nbsp;/&nbsp;at&nbsp;end&nbsp;of_weixin_30457065的博客-程序员资料

如果有abcd,at end of B,是对B以及B之前的字段进行判断不是仅仅对b进行判断,而且如果at end of b,就会对b后面的数据清空初始化,所以在at end of 前用 另一个工作区接收一下,一定注意,是B之前的所有字段进行判断at new也一样例子:REPORTzlm_at_end_of.TYPES:BEGINOFty_it...

精于型 悍于心!Tengine-Lite以开源致敬AIoT_人工智能与算法学习的博客-程序员资料

OPEN AI LAB(开放智能)于7月6日正式开源拥有自主知识产权的全新下一代AI端侧推理框架Tengine-Lite。作为Tengine整体软件架构重构的全新下一代产品,Tengin...

群晖 php,群晖NAS安装配置typecho博客教程_白夜月汐的博客-程序员资料

前言本文将详解如何在群晖NAS中利用Web Station安装配置typecho博客.Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴。Typecho基于PHP5开发,支持多种数据库,是一款内核强健﹑扩展方便﹑体验友好﹑运行流畅的轻量级开源博客程序。选用Typecho,搭建独一无二个人网络日志发布平台,享受创作的快乐。Typecho官方网站本文为Stille原创文章.经实...

bzoj4029 [HEOI2015]定价_wanherun的博客-程序员资料

一道简单题题目朴素的想一想,直接枚举[l,r]就好了,当然会T。那就优化一下呗。考虑一个数的荒谬值,发现大概只与长度有关,我们每次就不加1,0前面的那一个数加1,语文不好233。举个栗子:1234500之后就成了1234600,这样就很快了(貌似有更快做法)。没有代码

技术分享 | MySQL:max_allowed_packet 影响了什么?-程序员资料

max_allowed_packet 表示 MySQL Server 或者客户端接收的 packet 的最大大小,packet 即数据包,MySQL Server 和客户端上都有这个限制。每个数据包,都由包头、包体两部分组成,包头由 3 字节的包体长度、1 字节的包编号组成。3 字节最多能够表示 2 ^ 24 = 16777216 字节(16 M),也就是说,一个数据包的包体长度必须小于等于 16M 。如果要发送超过 16M 的数据怎么办?当要发送大于 16M 的数据时,会把数据拆分成多个 16M 的数据包

推荐文章

热门文章

相关标签