Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)

前言:当我们需要对redis进行操作时,首先需要启动redis-server服务,再启动redis-cli客户端连接redis服务器对其进行操作,也可以直接用可视化操作工具连接redis进行操作。但如果我们需要用java程序来对redis进行操作时,我们应该怎么做呢?
这时,我们就可以用jedis对redis进行操作了,jedis是专门为java程序连接操作redis而准备的,就是一种连接操作redis的工具。

文章目录

    • 一。实例说明
    • 二。操作步骤(利用String存储对象)
    • 三。利用redis中的Hash类型来存储对象
    • 总结

一。实例说明

本文中这个例子主要模拟了redis的一个常用使用场景,把redis当成缓存来使用。查询数据时,我们首先从redis中寻找所需的数据,若redis存在该数据,就直接从redis中读取数据,返回给接口,不查询数据库;若redis中不存在该数据,就要查询数据库,从数据库中读取数据,返回给接口,再把数据放入redis中。这样下次查询同样的数据时,就能直接在redis中查询,而不用去查询数据库。
这样做的好处是在数据量大,并发量高的时候能有效的减轻数据库的压力,提高系统的性能,因为redis是基于内存的非关系型数据库,读取的速度非常快。


二。操作步骤(利用String存储对象)

1、第一步,在pom.xml文件中加入Jedis依赖:

        <dependency>
			<groupId>redis.clientsgroupId>
			<artifactId>jedisartifactId>
			<version>2.9.0version>
		dependency>

2、第二步,新建一个redis.properties配置文件,在配置文件中配置好redis属性:

#redis启动端口
redis.host=127.0.0.1
#redis连接ip
redis.port=6379
#redis密码
redis.password=123456
#redis最大连接数
redis.maxTotal=30
#redis控制一个pool可分配多少个jedis实例(最大空闲连接数)
redis.maxIdle=10

3、第三步,新建一个JedisUtils工具类,读取redis.properties配置文件,根据配置文件来返回一个jedis连接对象:

package cn.com.do1.common.util;

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

import java.util.ResourceBundle;

public class JedisUtils {
    //读取外部的redis配置文件
    private static ResourceBundle rb = ResourceBundle.getBundle("redis");
    //读取到redis启动端口
    private static int port = Integer.parseInt(rb.getString("redis.port"));
    //读取到redis连接ip
    private static String host = rb.getString("redis.host");
    //读取到redis密码
    private static String password = rb.getString("redis.password");
    //读取到redis最大连接数
    private static int maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
    //读取到redis控制一个pool可分配多少个jedis实例(最大空闲连接数)
    private static int maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));

    private static JedisPoolConfig jpc = new JedisPoolConfig();
    //根据配置配置redis
    private static JedisPool jp = new JedisPool(jpc,host,port);

    //返回一个jedis连接对象
    public static Jedis getJedis(){
        //提供jedis连接对象,连接从连接池获取
        Jedis jedis = jp.getResource();
        //设置连接密码
        jedis.auth(password);
        return  jedis;
    }
}

4、memberVo实体类如下:

package cn.com.do1.user.model;

import java.util.Date;

/**
 * 用户vo
 * @author : zhongkaisheng
 */
public class MemberVO {
    private Integer id;

    /*
    用户名
    */
    private String username;

    /*
    密码
   */
    private String password;

    /*
    手机号码
   */
    private String phone;

    /*
    电子邮箱
   */
    private String email;

    /*
    账户创建时间
   */
    private Date createTime;

    /*
    账户修改时间
    */
    private Date updateTime;

    /*
   积分
   */
    private Double integral;

    /*
    上次登录时间
    */
    private Date lastTime;

    /*
    金额
    */
    private String money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public Double getIntegral() {
        return integral;
    }

    public void setIntegral(Double integral) {
        this.integral = integral;
    }

    public Date getLastTime() {
        return lastTime;
    }

    public void setLastTime(Date lastTime) {
        this.lastTime = lastTime;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "MemberVO{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                ", integral=" + integral +
                ", lastTime=" + lastTime +
                ", money='" + money + '\'' +
                '}';
    }
}

5、第四步,控制器中模拟相关业务逻辑,在这里我们将对象转换成json字符串再用redis中的String类型来存储:

/**
     * redis 测试(利用String存储对象)
     * @param id
     * @return
     * @throws IOException
     */
    @RequestMapping("redisTest")
    @ResponseBody
    public Object redisTest(@RequestParam(required = false) Integer id) throws IOException {
        //初始化json对象
        JSONObject jsonData=new JSONObject();
        String s="";
        //存入redis的value
        String object="";
        //存入redis的key
        String key = "tb_member:id:"+id;
        MemberVO memberVO=new MemberVO();
        ObjectMapper objectMapper=new ObjectMapper();
        //得到jedis对象
        Jedis jedis=JedisUtils.getJedis();
        //如果redis中含有该key值
        if(jedis.get(key)!=null){
            s="查询的是缓存";
            //得到redis中key对应的value
            object=jedis.get(key);
            //将value中保存对象json字符串转换为对象
            memberVO=objectMapper.readValue(object,MemberVO.class);
        }
        //如果redis中不含该key值
        else{
            //根据id查找到该对象
            memberVO=memberService.getMbmberById(id);
            //将对象转换成json字符串
            object= JSONObject.toJSONString(memberVO);
            s="查询的是数据库";
            //插入redis中
            jedis.set(key,object);

        }
        //存入json对象中
        jsonData.put("s",s);
        jsonData.put("object",object);
        jsonData.put("memberVO",memberVO);
        //返回json
        return jsonData;
    }

6、第五步,使用Postman来对该接口进行调用:
Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)_第1张图片
7、第六步,打开redis可视化工具查看,该josn对象已经存入redis,类型为string:
Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)_第2张图片
8、再次调用接口时,直接从redis中拿数据,不访问数据库:
Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)_第3张图片


三。利用redis中的Hash类型来存储对象

1、控制器中相应接口代码如下所示:

 /**
     * redis 测试(利用hash存储对象)
     * @param id
     * @return
     */
    @RequestMapping("redisTest1")
    @ResponseBody
    public Object redisTest1(@RequestParam(required = false) Integer id) {
        //初始化json对象
        JSONObject jsonData=new JSONObject();
        String s="";
        //存入redis的value
        List<String> object=new ArrayList<>();
        //存入redis的key
        String key = "memberVO";
        MemberVO memberVO=new MemberVO();
        ObjectMapper objectMapper=new ObjectMapper();
        //得到jedis对象
        Jedis jedis=JedisUtils.getJedis();
        //如果redis中file为id对应的value不为空,说明redis存在该数据
        if(jedis.hget(key,"id")!=null){
            s="查询的是缓存";
            //根据redis中存储的数值给对象赋值
            memberVO.setId(Integer.parseInt(jedis.hget(key,"id")));
            memberVO.setUsername(jedis.hget(key,"username"));
            memberVO.setPassword(jedis.hget(key,"password"));
            memberVO.setPhone(jedis.hget(key,"phone"));
            memberVO.setMoney(jedis.hget(key,"money"));
            memberVO.setEmail(jedis.hget(key,"email"));
        }
        //如果redis中不含该key值
        else{
            //根据id查找到该对象
            memberVO=memberService.getMbmberById(id);
            s="查询的是数据库";
            //插入redis中
            jedis.hset(key,"id",String.valueOf(memberVO.getId()));
            jedis.hset(key,"username",memberVO.getUsername());
            jedis.hset(key,"password",memberVO.getPassword());
            jedis.hset(key,"phone",memberVO.getPhone());
            jedis.hset(key,"email",memberVO.getEmail());

        }
        //存入json对象中
        jsonData.put("s",s);
        jsonData.put("memberVO",memberVO);
        //返回json
        return jsonData;
    }

2、第一次调用该接口:
Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)_第4张图片
3、打开redis可视化工具查看,该对象已经存入redis,类型为hash:
Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)_第5张图片
4、再次调用接口时,直接从redis中拿数据,不访问数据库:
Redis学习笔记(四):Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别)_第6张图片

总结

redis用来存储对象常用的数据类型就是String和Hash。
String类似于java中的String,String存储的是对象转换后的json字符串,适合读操作,根据相应的key可以找出对应json字符串,就能拿到对象的所有属性,但是修改起来特别的麻烦,如果对象有30个属性,我只需要修改其中一个属性,也需要把其他属性重新赋值,然后set进redis中,一改全要改,多了许多不需要的操作,降低了性能。
而Hash存储对象就可以完美解决这个问题,Hash类似于java中的Map,你只需要知道需要修改对象属性的key和filed值,然后根据key和filed重新去hset一个新的值,就可以进行修改,不需要修改全部的属性,但是hash读起来会比较麻烦,需要一个个的去读取。两者都有明显的优缺点,可根据实际应用场景自行选择。

你可能感兴趣的:(redis)