前言:当我们需要对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来对该接口进行调用:
文章图片
7、第六步,打开redis可视化工具查看,该josn对象已经存入redis,类型为string:
文章图片
8、再次调用接口时,直接从redis中拿数据,不访问数据库:
文章图片
三。利用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、第一次调用该接口:
文章图片
3、打开redis可视化工具查看,该对象已经存入redis,类型为hash:
文章图片
4、再次调用接口时,直接从redis中拿数据,不访问数据库:
文章图片
总结 redis用来存储对象常用的数据类型就是String和Hash。
String类似于java中的String,String存储的是对象转换后的json字符串,适合读操作,根据相应的key可以找出对应json字符串,就能拿到对象的所有属性,但是修改起来特别的麻烦,如果对象有30个属性,我只需要修改其中一个属性,也需要把其他属性重新赋值,然后set进redis中,一改全要改,多了许多不需要的操作,降低了性能。
而Hash存储对象就可以完美解决这个问题,Hash类似于java中的Map,你只需要知道需要修改对象属性的key和filed值,然后根据key和filed重新去hset一个新的值,就可以进行修改,不需要修改全部的属性,但是hash读起来会比较麻烦,需要一个个的去读取。两者都有明显的优缺点,可根据实际应用场景自行选择。
推荐阅读
- Redis|redis原理之布隆过滤器(Bloom Filter)
- redis安装与基本使用
- java|图解四种 IO 模型
- Redis|Redis性能解析--Redis为什么那么快()
- java|你跳一次涨多少(今天见识到跳槽天花板!!)
- java|送你一份大厂都这么解决Redis缓存问题,面试官必问!
- (免费领取红包封面)【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
- redis优化(bigkey、hotkey)
- redis高可用(主从、哨兵、集群)
- 【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知