使用 Jedis 连接操作 Redis
使用 Jedis 连接操作 Redis
Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。 Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
准备
环境安装
任选其一
CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务
测试用例
Github 代码
代码我已放到 Github ,CacheUtils.java 点击预览 CacheUtils.java
添加依赖
在项目中添加 jedis
依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
获取集群连接
private static JedisCluster jedisCluster = null;
static {
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数, 默认8个
config.setMaxTotal(1000);
//大空闲连接数, 默认8个
config.setMaxIdle(10);
//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
config.setMaxWaitMillis(3000);
//--------以下配置默认就可以-----------
//最小空闲连接数, 默认0
config.setMinIdle(0);
//是否启用pool的jmx管理功能, 默认true
config.setJmxEnabled(true);
//是否启用后进先出, 默认true
config.setLifo(true);
//在获取连接的时候检查有效性, 默认false
config.setTestOnBorrow(false);
//在空闲时检查有效性, 默认false
config.setTestWhileIdle(false);
Set<HostAndPort> hps = new HashSet<HostAndPort>();
String redisClusterIp = "10.4.89.161:6379";
String[] ip = redisClusterIp.split(":");
int port = Integer.valueOf(ip[1]);
hps.add(new HostAndPort(ip[0], port));
jedisCluster = new JedisCluster(hps, config);
LOG.info("JedisPoolConfig:{}", JSONObject.toJSONString(config));
Map<String, JedisPool> nodes = jedisCluster.getClusterNodes();
LOG.info("Get the redis thread pool:{}", nodes.toString());
}
获取单实例连接
private static Jedis jedis = null;
static {
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数, 默认8个
config.setMaxTotal(1000);
//大空闲连接数, 默认8个
config.setMaxIdle(10);
//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
config.setMaxWaitMillis(3000);
//--------以下配置默认就可以-----------
//最小空闲连接数, 默认0
config.setMinIdle(0);
//是否启用pool的jmx管理功能, 默认true
config.setJmxEnabled(true);
//是否启用后进先出, 默认true
config.setLifo(true);
//在获取连接的时候检查有效性, 默认false
config.setTestOnBorrow(false);
//在空闲时检查有效性, 默认false
config.setTestWhileIdle(false);
JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);
LOG.info("JedisPoolConfig:{}", JSONObject.toJSONString(config));
jedis = pool.getResource();
}
Redis 工具类
请查看源码
代码我已放到 Github ,导入 ymq-redis 项目
github https://github.com/souyunku/ymq-example/tree/master/ymq-redis
package io.ymq.redis.jedis.utils.CacheUtils;
单元测试
/**
* java JedisCluster 操作 redis 集群
*/
@Test
public void clusterTest() {
JedisClusterUtils.saveString("cluster-key", "www.ymq.io");
System.out.println(JedisClusterUtils.getString("cluster-key"));
}
/**
* java Jedis 操作 redis 单实例
*/
@Test
public void sentineTest() {
JedisSentinelUtils.saveString("sentine-key", "www.ymq.io");
System.out.println(JedisSentinelUtils.getString("sentine-key"));
}
/**
* cacheUtils 操作 redis 集群
*/
@Test
public void cacheUtilsTest() {
CacheUtils.saveString("cluster-key", "www.ymq.io");
System.out.println(CacheUtils.getString("cluster-key"));
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- React setState 是异步执行还是同步执行?
- sm2,sm3,sm4国密算法的纯c语言版本,使用于任何嵌入式平台
- sm2国密算法的纯c语言版本,使用于单片机平台(静态内存分配)
- 面试:mysql 事务和锁的解释
- 【STM32F407开发板用户手册】第35章 STM32F407的FSMC总线应用之驱动AD7606(8通道同步采样, 16bit, 正负10V)
- 玩转easyARM imax283A开发版(二),移植NES模拟器并增加按键驱动,让板子可以玩超级玛丽游戏
- 完了!TCP出了大事!
- redis高并发高可用
- 嵌入式linux之go语言开发(九)关于嵌入式GUI
- docker入门总结,从使用的角度谈起
- 使用 Go 语言开发 Android 应用的正确姿势探索
- Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如此清晰和简单)
- Android中protobuf的使用
- 疫情监控三部曲——在STM32F103 MCU上实现(裸机版)
- Android配置文件操作模块封装,全互联网最简单好用的封装