如何使用redis作为缓存,增强用户访问数据的用户体验

/**完成步骤          1、创建关系型数据库mysql的Provice库,同时启动nosql系列的redis数据库         2、创建项目,导入相关的jar包         3、创建jedis/utils/domain/dao/service/web项目框架包         4、书写相关代码*///页面<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <script src="js/jquery-3.3.1.min.js"></script>    <script>       $(function () {           //发送ajax请求           $.get("provinceServlet",{},function (data) {               //1、获取select               var province=$("#province");               //2、遍历json数组               $(data).each(function () {                   //3、创建option                  var option ="<option name =‘"+this.id+"‘>"+this.name+"</option>";                   //4、调用select的append追加option                   province.append(option);               });           });       });    </script></head><body>      <select name="province" id="province">          <option>--请选择省份--</option>      </select></body></html>

//Web层代码实现
package cn.hope.web.servlet;

import cn.hope.domain.Province;import cn.hope.service.ProvinceService;import cn.hope.service.impl.ProvinceServiceImpl;import com.fasterxml.jackson.databind.ObjectMapper;

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;import java.util.List;

/** * @author newcityman * @date 2019/9/20 - 23:57 */@WebServlet("/provinceServlet")public class ProvinceServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {      /*  //1、调用service查询        ProvinceService service = new ProvinceServiceImpl();        List<Province> provinces = service.findAll();        //2、序列化list为json数据        ObjectMapper mapper = new ObjectMapper();        String json = mapper.writeValueAsString(provinces);*///        System.out.println(json);        //1、调用service查询        ProvinceService service = new ProvinceServiceImpl();        String json = service.findAllJson();        //3、响应结果        response.setContentType("application/json;charset=utf-8");        response.getWriter().write(json);    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        this.doPost(request, response);    }}

//service层
package cn.hope.service.impl;

import cn.hope.dao.ProvinceDao;import cn.hope.dao.impl.ProvinceDaoImpl;import cn.hope.domain.Province;import cn.hope.jedis.utils.JedisPoolUtils;import cn.hope.service.ProvinceService;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;

import java.util.List;

/** * @author newcityman * @date 2019/9/20 - 23:50 */public class ProvinceServiceImpl implements ProvinceService {    //申明dao    private ProvinceDao dao = new ProvinceDaoImpl();    @Override    public List<Province> findAll() {        return dao.findAll();    }

    @Override    public String findAllJson() {        //1、通过工具类获取redis连接        Jedis jedis = JedisPoolUtils.getJedis();        //2、获取redis中province的值        String province_json = jedis.get("province");        //3、判断province_json值是否为null        if(province_json == null || province_json.length()<=0){            //4、说明redis中没有province的数据,需要从数据库中查找数据            List<Province> ps = dao.findAll();            ObjectMapper mapper = new ObjectMapper();            try {               province_json = mapper.writeValueAsString(ps);            } catch (JsonProcessingException e) {                e.printStackTrace();            }            System.out.println("第一次访问redis,数据来之数据库。。。。");            jedis.set("province",province_json);            //释放jedis,回归连接池            jedis.close();        }else {            System.out.println("数据来之redis缓存。。。。");        }        return province_json;    }}
//dao层
package cn.hope.dao.impl;

import cn.hope.dao.ProvinceDao;import cn.hope.domain.Province;import cn.hope.utils.JDBCUtils;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

/** * @author newcityman * @date 2019/9/20 - 23:29 */public class ProvinceDaoImpl implements ProvinceDao {    //1、声明成员变量JdbcTemplate    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());    @Override    public List<Province> findAll() {        //1、定义sql语句        String sql = "select * from province";        //2、执行sql        List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));        System.out.println(list);        return list;    }}

//Jedis工具包
package cn.hope.jedis.utils;

import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;import java.io.InputStream;import java.util.Properties;

/** * @author newcityman * @date 2019/9/20 - 0:33 * JedisPool工具类 * 加载配置文件,配置连接池的连接池 * 提供获取连接的方法 */public class JedisPoolUtils {    private static JedisPool jedisPool;    static {        //读取配置文件        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");        //创建Properties对象        Properties prop = new Properties();        try {            prop.load(is);        } catch (IOException e) {            e.printStackTrace();        }        //获取数据,设置到JedisPoolConfig()中        JedisPoolConfig config = new JedisPoolConfig();        config.setMaxIdle(Integer.parseInt( prop.getProperty("maxTotal")));        config.setMaxTotal(Integer.parseInt(prop.getProperty("maxIdle")));        jedisPool=new JedisPool(config,prop.getProperty("host"),Integer.parseInt(prop.getProperty("port")));    }

    /**     * 获取连接方法     * @return     */    public  static Jedis getJedis(){        return jedisPool.getResource();    }}

//JDBCUtils工具包
package cn.hope.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;

/** * JDBC工具类 使用Durid连接池 */public class JDBCUtils {

    private static DataSource ds ;

    static {

        try {            //1.加载配置文件            Properties pro = new Properties();            //使用ClassLoader加载配置文件,获取字节输入流            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");            pro.load(is);

            //2.初始化连接池对象            ds = DruidDataSourceFactory.createDataSource(pro);

        } catch (IOException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }    }

    /**     * 获取连接池对象     */    public static DataSource getDataSource(){        return ds;    }

    /**     * 获取连接Connection对象     */    public static Connection getConnection() throws SQLException {        return  ds.getConnection();    }}
 
 

原文地址:https://www.cnblogs.com/newcityboy/p/11565158.html

时间: 2024-12-11 07:18:48

如何使用redis作为缓存,增强用户访问数据的用户体验的相关文章

Samba服务(匿名用户访问、本地用户访问、虚拟用户访问)

Samba是一个实现不同操作系统(Windows.Linux.UNIX)之间文件共享和打印机共享的一种SMB协议的免费软件.SMB协议是客户机/服务器协议,客户机通过该协议可以访问服务器上的共享文件及打印机共享资源.它主要应用于局域网上,也可以通过设置"NetBIOS over TCP/IP"同互联网中的电脑分享资源. SMB协议:TCP 139端口 CIFS协议:TCP 445端口 重要配置文件: /etc/samba/smb.conf: SAMBA的主配置文件,内有丰富的说明,也可

Redis等缓存数据库为什么访问会比较快?

首先,我们知道,mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在用的最多的 memcached(简称mc).首先,用户访问mc,如果未命中,就去访问mysql,之后像内存和硬盘一样,把数据复制到mc一部分redis和mc都是缓存,并且都是驻留在内存中运行的,这大大提升了高数据量web访问的访问速度.然而mc只是提供了简单的数据结构,比如 string存储:redis却提供了大量的数据结构,比如string.list.set.hash

【java】服务器端获取用户访问的URL/用户IP/PC还是移动端

@RequestMapping(value="/test") @ResponseBody public void test1(HttpServletRequest request,Questionnaire quest,String questOptions){ String ipAddress = null; if (request.getHeader("x-forwarded-for") == null) { ipAddress = request.getRem

Emq 限制匿名用户访问,开启用户密码认证

问题: 刚搭建的emq服务默认是开启匿名用户访问的,这样的环境非常不安全,只要知道ip地址就可以连接,所以强烈建议开启用户认证,设置密码! 解决过程 1.修改配置文件 vim /etc/emqx/emqx.conf修改true为falseallow_anonymous = false 2.重启服务 systemctl stop emqxsystemctl start emqx 3.导入插件模块 cd /usr/lib/emqx/binsh emqx_ctl plugins load emqx_a

基于用户行为数据为用户推荐商品

1.用户行为数据 用户行为数据在网站中最简单的存在形式就是日志,用户行为就是指用户在系统中进行的各种操作,比如用户在电商网站中进行的浏览.点击.搜索.购买.收藏等行为.我们可以通过分析这些数据来推测用户喜爱哪种商品,从而为用户推荐他们更偏爱的商品. 2.用户行为分类 根据反馈的明确性来说,用户行为在个性化推荐系统中一般分两种:①显性反馈行为:明确表示用户对商品喜恶的行为,比如评价.收藏等:②隐性反馈行为:不能明确表示用户喜恶的行为,比如浏览页面等. 根据反馈的方向来说,用户行为数据可以分为:①正

oracle分配权限:一个用户访问另一个用户的表

相当于alias(别名),比如把user1.table1在user2中建一个同义词table1 create synonym table1 for user1.table1; 这样当你在user2中查select * from table1时就相当于查select * from user1.table1; //批量生成创建同义词select 'create synonym '||object_name||' for jys.'||object_name||';' from dba_objects

推荐系统实践(项亮)— 第2章 利用用户行为数据

2.1 用户行为数据简介 用户行为数据可分为显性反馈行为和隐性反馈行为: 用户数据的统一表示: 2.2 用户行为分析 在设计推荐算法之前需要对用户行为数据进行分析,了解数据中蕴含的一般规律可以对算法的设计起到指导作用. 用户活跃度和物品流行度 均近似符合长尾分布:e.g. 物品流行度定义:对用户产生过行为的总数:e.g. 用户活跃度定义:对物品产生过行为的总数 活跃度和流行度的关系:一般新用户倾向于浏览热门的物品,因为他们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品(

推荐系统之--- 利用用户行为数据

一.用户行为数据 一个用户行为表示为6部分,即产生行为的用户和行为的对象.行为的种类.产生行为的上下文.行为的内容和权重.用户行为的统一表示如下: user id 产生行为的用户的唯一标识item id 产生行为的对象的唯一标识behavior type 行为的种类(比如是购买还是浏览)context 产生行为的上下文,包括时间和地点等behavior weight 行为的权重(如果是观看视频的行为,那么这个权重可以是观看时长:如果是打分行为,这个权重可以是分数)behavior content

Ehcache/Redis/Tair缓存性能对比[转载]

FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置如下: 64位5核CPU, E5620 @ 2.40GHz,内存8G CDN端缓存 由 于计数器的价值并不在,具体的值是多少,尤其是对一些大访问量的商品来说个位或者十位的数据并没有什么意义,所以对这些热门商品的计数器访问可以采用定时 更新的办法,可以将计数器的值直接缓存在CDN上或者后端Nginx的