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依赖:
redis.clients jedis 2.9.0

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); returnjedis; } }

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 + '\'' + '}'; } }

【Redis学习笔记(四)(Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别))】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=https://www.it610.com/article/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类型存储对象的区别))
文章图片

7、第六步,打开redis可视化工具查看,该josn对象已经存入redis,类型为string:
Redis学习笔记(四)(Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别))
文章图片

8、再次调用接口时,直接从redis中拿数据,不访问数据库:
Redis学习笔记(四)(Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别))
文章图片

三。利用redis中的Hash类型来存储对象 1、控制器中相应接口代码如下所示:
/** * redis 测试(利用hash存储对象) * @param id * @return */ @RequestMapping("redisTest1") @ResponseBody public Object redisTest1(@RequestParam(required = false) Integer id) { //初始化json对象 JSONObject jsonData=https://www.it610.com/article/new JSONObject(); String s=""; //存入redis的value List> 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类型存储对象的区别))
文章图片

3、打开redis可视化工具查看,该对象已经存入redis,类型为hash:
Redis学习笔记(四)(Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别))
文章图片

4、再次调用接口时,直接从redis中拿数据,不访问数据库:
Redis学习笔记(四)(Java利用Jedis连接Redis实例(使用String类型与Hash类型存储对象的区别))
文章图片

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

    推荐阅读