目录
- Jedis的基本使用
- Jedis常用api
- 操作key相关api
- 操作String相关api
- 操作List相关api
- 操作Set相关api
- 操作ZSet相关api
- 操作Hash相关api
- Jedis连接池的基本概念
- JedisPool的基本使用
- Jedis连接池工具类
- Demo
Jedis的基本使用
跳转到目录
-
Redis
不仅是使用命令
来操作,现在基本上主流的语言
都有客户端
支持,比如Java
、C、C#、C++、php、Node.js、Go等。 在官方网站里列一些Java的客户端
,有Jedis
、Redisson
、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis
,Jedis同样也是托管在github上,地址: https://github.com/xetorthio/jedis
1、引入依赖
<!--引入jedis连接依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2、创建jedis对象
public static void main(String[] args) {
//1.创建jedis对象
Jedis jedis = new Jedis("192.168.40.4", 6379);//1.redis服务必须关闭防火墙 2.redis服务必须开启远程连接
jedis.select(0);//选择操作的库默认0号库
//2.执行相关操作
//....
//3.释放资源
jedis.close();
}
Jedis常用API
跳转到目录
方法 | 解释 |
new Jedis(host, port) | 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口 |
set(key,value) | 设置字符串类型的数据 |
get(key) | 获得字符串类型的数据 |
hset(key,field,value) | 设置哈希类型的数据 |
hget(key,field) | 获得哈希类型的数据 |
lpush(key,values) | 设置列表类型的数据 |
lpop(key) | 列表左面弹栈 |
rpop(key) | 列表右面弹栈 |
del(key) | 删除指定的key |
操作key相关api
跳转到目录
public class TestKey {
private Jedis jedis;
@Before
public void before(){
this.jedis = new Jedis("192.168.202.205", 7000);
}
@After
public void after(){
jedis.close();
}
//测试key相关
@Test
public void testKeys(){
//删除一个key
jedis.del("name");
//删除多个key
//jedis.del("name","age");
//判断一个key是否存在exits
Boolean name = jedis.exists("name");
System.out.println(name);
//设置一个key超时时间 expire pexpire
//Long age = jedis.expire("age", 100);
//System.out.println(age);
//获取一个key超时时间 ttl
Long age1 = jedis.ttl("newage");
System.out.println(age1);
//随机获取一个key
String s = jedis.randomKey();
//修改key名称
// jedis.rename("age","newage");
//查看可以对应值的类型
String name1 = jedis.type("name");
System.out.println(name1);
String maps = jedis.type("maps");
System.out.println(maps);
}
}
操作String相关api
跳转到目录
public class TestString {
private Jedis jedis;
@Before
public void before(){
this.jedis = new Jedis("192.168.202.205", 7000);
}
@After
public void after(){
jedis.close();
}
//测试String相关
@Test
public void testString(){
//set
jedis.set("name","小陈");
//get
String s = jedis.get("name");
System.out.println(s);
//mset
jedis.mset("content","好人","address","海淀区");
//mget
List<String> mget = jedis.mget("name", "content", "address");
mget.forEach(v-> System.out.println("v = " + v));
//getset
String set = jedis.getSet("name", "小明");
System.out.println(set);
//............
}
}
操作List相关api
跳转到目录
public class TestList {
private Jedis jedis;
@Before
public void before(){
this.jedis = new Jedis("192.168.202.205", 7000);
}
@After
public void after(){
jedis.close();
}
//测试List相关
@Test
public void testList(){
//lpush
jedis.lpush("names1","张三","王五","赵柳","win7");
//rpush
jedis.rpush("names1","xiaomingming");
//lrange
List<String> names1 = jedis.lrange("names1", 0, -1);
names1.forEach(name-> System.out.println("name = " + name));
//lpop rpop
String names11 = jedis.lpop("names1");
System.out.println(names11);
//llen
jedis.linsert("lists", BinaryClient.LIST_POSITION.BEFORE,"xiaohei","xiaobai");
}
}
操作Set相关api
跳转到目录
public class TestSet {
private Jedis jedis;
@Before
public void before(){
this.jedis = new Jedis("192.168.202.205", 7000);
}
@After
public void after(){
jedis.close();
}
//测试SET相关
@Test
public void testSet(){
//sadd
jedis.sadd("names","zhangsan","lisi");
//smembers
jedis.smembers("names");
//sismember
jedis.sismember("names","xiaochen");
//...
}
}
操作Zset相关api
跳转到目录
public class TestZSet {
private Jedis jedis;
@Before
public void before(){
this.jedis = new Jedis("192.168.202.205", 7000);
}
@After
public void after(){
jedis.close();
}
//测试ZSET相关
@Test
public void testZset(){
//zadd
jedis.zadd("names",10,"张三");
//zrange
jedis.zrange("names",0,-1);
//zcard
jedis.zcard("names");
//zrangeByScore
jedis.zrangeByScore("names","0","100",0,5);
//..
}
}
操作Hash相关api
跳转到目录
public class TestHash {
private Jedis jedis;
@Before
public void before(){
this.jedis = new Jedis("192.168.202.205", 7000);
}
@After
public void after(){
jedis.close();
}
//测试HASH相关
@Test
public void testHash(){
//hset
jedis.hset("maps","name","zhangsan");
//hget
jedis.hget("maps","name");
//hgetall
jedis.hgetAll("mps");
//hkeys
jedis.hkeys("maps");
//hvals
jedis.hvals("maps");
//....
}
}
Jedis连接池的基本概念
跳转到目录
-
jedis连接资源
的创建
与销毁
是很消耗程序性能
,所以jedis为我们提供了jedis的池化技术
,jedisPool
在创建时初始化一些连接资源存储到连接池中,使用jedis连接资源时不需要创建,而是从连接池中获取一个资源进行redis
的操作,使用完毕后,不需要销毁该jedis连接资源,而是将该资源归还给连接池,供其他请求使用。
JedisPool的基本使用
跳转到目录
/**
* 候选版本: release candidate稳定候选版
* @author guizy
*/
public class RedisUtilRC {
private static JedisPool pool = null;
static {
//1. 配置连接池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
// 初始化
poolConfig.setMinIdle(10);
// 最大空闲
poolConfig.setMaxIdle(5);
// 最多有多少个
poolConfig.setMaxWaitMillis(100);
//2. 获取连接(使用连接池)
pool = new JedisPool(poolConfig, "localhost", 6379);
}
public static Jedis getConnecttion(){
// 从连接池中获取
Jedis connection = pool.getResource();
return connection;
}
public static void closePool(){
pool.close();
}
public static void main(String[] args) {
/* //1. 配置连接池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
// 初始化
poolConfig.setMinIdle(10);
// 最大空闲
poolConfig.setMaxIdle(5);
// 最多有多少个
poolConfig.setMaxWaitMillis(100);
//2. 获取连接(使用连接池)
JedisPool pool = new JedisPool(poolConfig, "localhost", 6379);
// 从连接池中获取
Jedis connection = pool.getResource();
//3. 操作方法
String str = connection.get("test");
System.out.println(str);
//4. 归还给连接池
connection.close();*/
}
}
Jedis连接池工具类
跳转到目录
/**
* 候选版本: release candidate稳定候选版
*
* @author ZYGui
*/
public class RedisUtil2 {
private static JedisPool pool = null;
static {
//1. 配置连接池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
/*
除了 properties来读取配置文件往外
在Java.util包 resourceBundle就是用来解析properties
*/
// 读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("redis");
int minIdle = Integer.parseInt(rb.getString("redis.minIdle"));
int maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
int maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
int maxWaitMillis = Integer.parseInt(rb.getString("redis.maxWaitMillis"));
String host = rb.getString("redis.host");
int port = Integer.parseInt(rb.getString("redis.port"));
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setMaxTotal(maxTotal);
pool = new JedisPool(poolConfig, host, port);
/*
Properties properties = new Properties();
try {
properties.load(RedisUtil.class.getClassLoader().getResourceAsStream("redis.properties"));
int minIdle = Integer.parseInt(properties.getProperty("redis.minIdle"));
int maxIdle = Integer.parseInt(properties.getProperty("redis.maxIdle"));
int maxTotal = Integer.parseInt(properties.getProperty("redis.maxTotal"));
int maxWaitMillis = Integer.parseInt(properties.getProperty("redis.maxWaitMillis"));
String host = properties.getProperty("redis.host");
int port = Integer.parseInt(properties.getProperty("redis.port"));
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setMaxTotal(maxTotal);
pool = new JedisPool(poolConfig, host, port);
} catch (Exception e){
}
*/
}
public static Jedis getConnecttion() {
// 从连接池中获取
Jedis connection = pool.getResource();
return connection;
}
public static void closePool() {
pool.close();
}
public static void main(String[] args) {
Jedis connection = getConnecttion();
String str = connection.get("test");
System.out.println(str);
connection.close();
}
}
Demo
跳转到目录
- 案例需求:
- 提供index.html页面,页面中有一个省份下拉列表
- 当页面加载完成后发送
ajax
请求,加载所有省份
- 注意:使用
redis缓存一些不经常发生变化的数据
。
- 数据库的数据一旦发生
改变
,则需要更新缓存
。 - 数据库的表执行
增删改
的相关操作,需要将redis缓存数据清除
,再次存入
- 在
service
对应的增删改
方法中,将redis数据删除
。(因为不删除,数据仍然是redis缓存中的)
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.js"></script>
<script>
$(function () {
/*
* 注意: 当在Servlet中 设置 response.setContentType("application/json;charset=utf-8");
* 不 需要将 JSON字符串 转为 JSON对象
* var JsonObj = JSON.parse(data);
* */
//发送ajax请求,加载所有省份数据
$.get("http://localhost:8080/redis/provinceServlet",{},function (data) {
//[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
//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);
});
});
/*
* 注意: 当在Servlet中 设置 response.setContentType("text/html;charset=utf-8");
* 下面两种方式都需要将 JSON字符串 转为 JSON对象
* var JsonObj = JSON.parse(data);
* */
//发送ajax请求,加载所有省份数据
// $.get("http://localhost:8080/redis/provinceServlet",{},function (data) {
// //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
//
// //1.获取select
// var province = $("#province");
// var JsonObj = JSON.parse(data);
// //2.遍历json数组
// $(JsonObj).each(function () {
// //3.创建<option>
// var option = "<option name='"+this.id+"'>"+this.name+"</option>";
//
// //4.调用select的append追加option
// province.append(option);
// });
//
// });
// $.ajax({
// url: "http://localhost:8080/redis/provinceServlet",
// type: "get",
// success:function (data) {
// var jsonObj = JSON.parse(data);
// for (pro of jsonObj) {
// alert(pro.id);
// //3.创建<option>
// var option = "<option name='"+pro.id+"'>"+pro.name+"</option>";
// //4.调用select的append追加option
// $("#province").append(option);
// }
// }
// })
});
</script>
</head>
<body>
<select id="province">
<option>--请选择省份--</option>
</select>
</body>
</html>
- domain
package com.sunny.domain;
public class Province {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- Dao
public class ProvinceDaoImpl implements ProvinceDao {
//1. 声明成员变量
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Province> findAll() {
// 定义sql
String sql = "SELECT * FROM province";
// 执行
return template.query(sql, new BeanPropertyRowMapper<>(Province.class));
}
}
- Service
public class ProvinceServiceImpl implements ProvinceService {
private ProvinceDao dao = new ProvinceDaoImpl();
@Override
public List<Province> findAll() {
return dao.findAll();
}
/**
* 使用redis缓存
* @return
*/
@Override
public String findAllJson() {
//1. 先从redis中查询数据
//1.1 获取redis客户端连接
Jedis jedis = RedisUtil.getConnecttion();
String province_json = jedis.get("province");
//2. 判断province_json是否为null
if (province_json == null || province_json.length() == 0){
// redis中没有数据
System.out.println("redis中没有数据, 查询数据库...");
//2.1 从数据库中查询
List<Province> ps = dao.findAll();
//2.2 将list序列化为json
ObjectMapper mapper = new ObjectMapper();
try {
province_json = mapper.writeValueAsString(ps);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//2.3 将json数据存入redis
jedis.set("province", province_json);
//归还连接
jedis.close();
} else {
System.out.println("redis中有数据, 查询缓存...");
}
return province_json;
}
}
- Servlet
@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json;charset=utf-8");
request.setCharacterEncoding("utf-8");
//1. 调用Service查询
// ProvinceService service = new ProvinceServiceImpl();
// List<Province> list = service.findAll();
//2. 序列化List为JSON
// ObjectMapper mapper = new ObjectMapper();
// String json = mapper.writeValueAsString(list);
// System.out.println(json); //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,
// "name":"陕西"}]
// 添加缓存的调用
ProvinceService service = new ProvinceServiceImpl();
String json = service.findAllJson();
System.out.println(json);
//3. 响应结果
response.getWriter().write(json);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}