redis缓存不经常发生变化的数据-------从数据库中获得下拉列表的省份数据

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis缓存不经常发生变化的数据-------从数据库中获得下拉列表的省份数据

案例需求:

       1. 提供index.html页面,页面中有一个省份 下拉列表

        2. 当 页面加载完成后 发送ajax请求,加载所有省份

        3. 注意:使用redis缓存省份数据


使用redis缓存一些不经常发生变化的数据。


redis是一个非关系型数据库,工作在内存中也就是缓存中,它的持久化需要修改配置文件,否则一旦你的redis服务器关闭数据就无法保存

但做一个需求,发现如果数据的值变化那怎么实现缓存呢????

发现redis时要注意一下几个点

1.redis使用时必须将redis的服务器打开
2
.redis实现缓存只是在你项目跑起来时可以更加快速访问,一但你的服务器关闭,那么数据也没有保存,下次还是要先在mysql中获得数据后存到redis中来实现一个缓存****


.redis实现缓存只是在你项目跑起来时可以更加快速访问,一但你的服务器关闭,那么数据也没有保存,下次还是要先在mysql中获得数据后存到redis中来实现一个缓存**


3,本项目中是把所有数据封装成一个string,然后赋值给key值这样不会出现值得变化


1.首先是省份的前端页面pro.jsp


<%--
  Created by IntelliJ IDEA.
  User: My
  Date: 2021/1/19
  Time: 22:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
    //设置下拉列表里面的内容
    //首先用的的一般是Jquery的get方法
    $(function () {
        //异步ajax获取数据库中的省份的数据,天在里面
        //用jquery的get方法
        $.get("proservlet",{},function (data) {
            //执行回调函数
            //获取下拉列表
            var pro = $("#pro");
            //设置里面的内容
            //遍历数组
            $(data).each(function () {
                //json数据
                //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
                //3.创建<option>
                var option = "<option name='"+this.id+"'>"+this.name+"</option>";
                //4.调用select的append追加option
                pro.append(option);
            });
        });
    });
</script>
<body>
    <select id="pro">
        <option>----请选择省份---</option>
    </select>
</body>
</html>

2.是省份的servlet-----------proservlet.java


package web.servlet;
import service.Impl.serviceimpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/proservlet")
public class proservlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        //不用redis缓存的代码
        //调用service方法来查询数据
        serviceimpl service = new serviceimpl();
        List<Province> provinceList = service.select();
        //System.out.println(provinceList);
        //list转化成json
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(provinceList);
        // String json = mapper.writeValueAsString(provinceList);
        System.out.println(json);
        //通过resp返回
        //设置返回类型为json类型
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().write(json);
        */
        //用redis的代码
        serviceimpl service = new serviceimpl();
        //返回的直接是
        String useredis = service.useredis();
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().write(useredis);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

3.是service层的实现类-----------serviceimpl.java


package service.Impl;
import Dao.Impl.Daoimpl;
import Dao.ProvinceDao;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import domain.Province;
import domain.User;
import redis.clients.jedis.Jedis;
import service.Userservice;
import util.jedispoolutils;
import java.util.List;
public class serviceimpl implements Userservice {
    private ProvinceDao provinceDao =new Daoimpl();
    //调用dao层的方法
    @Override
    public User register(String username) {
        return null;
    }
    //调用dao层的方法
    @Override
    public List<Province> select() {
        return provinceDao.findAllpro();
    }
    @Override
    public String useredis() {
        //用redis缓存来处置
        //通过jedis连接池来连接redis
        Jedis jedis = jedispoolutils.getJedis();
        String province = jedis.get("province");
        //如果缓存中,没有数据,就从mysql中获取
        if(province==null||province.length()==0){
            //从dao层获得
            System.out.println("redis中没有数据----查询数据库-------");
            //将list序列化为json
            List<Province> provinceList = provinceDao.findAllpro();
            ObjectMapper mapper = new ObjectMapper();
            try {
                province = mapper.writeValueAsString(provinceList);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //再把数据存入redis中
            jedis.set("province",province);
            jedis.close();
        }else {
            System.out.println("redis中有数据,查询缓存");
        }
        return province;
    }
}

4.dao层的实现类-------------------Daoimpl.java


package Dao.Impl;
import Dao.ProvinceDao;
import domain.Province;
import domain.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import util.JDBCUtils;
import java.util.List;
public class Daoimpl implements ProvinceDao {
    //用redis数据库连接
    //用redis连接池连接
    //导入jar包
    //通过连接池工具类获取jedis
  //  Jedis jedis = jedispoolutils.getJedis();
    //声明成员变量template
    //1.创建JdbcTemplate对象来连接数据库
    private JdbcTemplate template= new  JdbcTemplate(JDBCUtils.getDataSource());
    //编写查询所有语句
    @Override
    public User finduserbyname(String username) {
        return null;
    }
    @Override
    public List<Province> findAllpro() {
        //1.定义sql
        String sql = "select * from province ";
        //2.执行sql
        List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
        return list;
    }
    /*
    //关闭连接
     //   jedis.close();
    public User finduserbyname(String username){
        //先设置数据库中username==tom
        //或者用命令的方式来设置也可以
      //  jedis.set("username","tom");
        String name = jedis.get("username");
        if(name!=null) {
            User user = new User();
            user.setUsername(name);
            return user;
        }
        else
        {
            return null;
        }
    }*/
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
18天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
10天前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
44 16
|
9天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
11天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
10天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
46 14
|
19天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
102 22
|
10天前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
39 13
|
10天前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
34 11
|
10天前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
|
10天前
|
存储 监控 NoSQL
【赵渝强老师】Redis的RDB数据持久化
Redis 是内存数据库,提供数据持久化功能以防止服务器进程退出导致数据丢失。Redis 支持 RDB 和 AOF 两种持久化方式,其中 RDB 是默认的持久化方式。RDB 通过在指定时间间隔内将内存中的数据快照写入磁盘,确保数据的安全性和恢复能力。RDB 持久化机制包括创建子进程、将数据写入临时文件并替换旧文件等步骤。优点包括适合大规模数据恢复和低数据完整性要求的场景,但也有数据完整性和一致性较低及备份时占用内存的缺点。