redis 工具包
java通过jedis操作redis(从JedisPool到JedisCluster)
redis作为一个缓存数据库,在绝大多数java项目开发中是必须使用的,在web项目中,直接配合spring-redis,各种配置都直接在spring配置文件中做了,一般都是使用redis连接池。在非web项目中,通常也是使用的redis连接池。
根据redis的机器数量和集群方式,又分为以下三种方式:普通单机版的redis,多机器的分片集群,多机器的cluster集群方式(redis3版本以上)。
对于单机版的redis使用简单示例如下:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; public class JedisPoolUtil {
private static JedisPool jedisPool; public static JedisPool getJedisPool(){
if(jedisPool == null){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(200);
config.setMaxIdle(50);
config.setMaxWaitMillis(1000 * 100);
config.setTestOnBorrow(false);
jedisPool = new JedisPool(config, "192.168.42.128",6379);
}
return jedisPool;
} public static String get(String key){
String value = null;
JedisPool pool = null;
Jedis jedis = null;
try{
pool = getJedisPool();
jedis = pool.getResource();
value = jedis.get(key);
}catch(Exception e){
e.printStackTrace();
}
return value;
} public static void set(String key,String value){
JedisPool pool = null;
Jedis jedis = null;
try{
pool = getJedisPool();
jedis = pool.getResource();
value = jedis.set(key,value);
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) {
set("name", "xx-jedis");
String name = get("name");
System.out.println(name);
} }
这是一个最简单的demo,实际项目中,会配置redis host,port等信息,也会根据redis支持的方法和jedis的api,完善更多的方法,如delete,expire,sadd,lpush等等。
当项目增大,需要缓存的数据量增大,我们会考虑做分布式集群,集群的数量可以根据业务需求扩展。数据存储会均匀分布在各个分片上。这里给出一个示例:
import java.util.ArrayList;
import java.util.List; import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class ShardedPoolUtil {
private static ShardedJedisPool jedisPool;
public static ShardedJedisPool getJedisPool(){
if(jedisPool == null){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(200);
config.setMaxIdle(50);
config.setMaxWaitMillis(1000*100);
config.setTestOnBorrow(false);
List<JedisShardInfo> shareInfos = new ArrayList<JedisShardInfo>();
shareInfos.add(new JedisShardInfo("192.168.42.128", 6379));
shareInfos.add(new JedisShardInfo("192.168.42.128", 6380));
jedisPool = new ShardedJedisPool(config, shareInfos);
}
return jedisPool;
} public static void set(String key,String value){
ShardedJedisPool pool = null;
ShardedJedis jedis = null;
try{
pool = getJedisPool();
jedis = pool.getResource();
jedis.set(key, value);
}catch(Exception e){
e.printStackTrace();
}
} public static String get(String key){
String value = null;
ShardedJedisPool pool = null;
ShardedJedis jedis = null;
try{
pool = getJedisPool();
jedis = pool.getResource();
value = jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
}
return value;
} public static void main(String[] args) {
String age = "30";
String address = "beijing";
set("age", age);
set("address", address);
System.out.println(get("age"));
System.out.println(get("address"));
}
}
相对单机版的redis,sharding分布式集群方式:配置ShardedJedisPool多了设置多个redis服务器信息。 数据分布在哪个机器上,是有算法的,这里支持MD5和MURMUR两种散列函数的方式,默认采用的是MURMUR哈希方法。
这第二种方法,虽然是分布式的,数据分布在不同的机器上,但是并没有采用集群的方式,因为支持redis集群的是3.0版本及以上,目前redis集群方式,数据是以槽的方式分布的,因为需要保证一个master对应至少一个slave节点,所以节点数会比sharding分布式节点多。
redis-cluster这种情况下,java调用的方式会发生一些变化,但是还是相似的思路。
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
public class ClusterPoolUtil { private static JedisCluster jedisCluster;
private static String hostAndPorts = "192.168.42.128:6379||192.168.42.128:6380||"
+ "192.168.42.128:6381||192.168.42.128:6382||"
+ "192.168.42.128:6383||192.168.42.128:6384"; public static JedisCluster getJedisCluster(){ if(jedisCluster==null){
int timeOut = 10000;
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(50);
poolConfig.setMaxWaitMillis(1000 * 100);
poolConfig.setTestOnBorrow(false); String[] hosts = hostAndPorts.split("\\|\\|");
for(String hostport:hosts){
String[] ipport = hostport.split(":");
String ip = ipport[0];
int port = Integer.parseInt(ipport[1]);
nodes.add(new HostAndPort(ip, port));
}
jedisCluster = new JedisCluster(nodes,timeOut, poolConfig);
}
return jedisCluster;
} public static void set(String key,String value){
JedisCluster jedisCluster = getJedisCluster();
jedisCluster.set(key, value);
} public static String get(String key){
String value = null;
JedisCluster jedisCluster = getJedisCluster();
value = jedisCluster.get(key);
return value;
} public static void main(String[] args) {
set("name-1", "value-1");
set("name-2", "value-2");
set("name-3", "value-3");
System.out.println(get("name-1"));
System.out.println(get("name-2"));
System.out.println(get("name-3"));
}
}
redis-cluster集群安装好了之后,做好slot分配,就可以开始使用redis存储和查找了。redis-cluster是redis3开始支持的,他与sharding分片方式不同的是,数据是按照slot槽(16384个slot)分布的,slot的划分不是固定的,可以人为指定。这里使用了六个节点,分为三组,所以slot划分为3组槽(5461,5461,5460),分别如下:
{
=192.168.42.128:, =192.168.42.128:,
=192.168.42.128:, =192.168.42.128:,
=192.168.42.128:, =192.168.42.128:
}
第一组是0-5460,第二组是5461-10922,第三组是10993-16383,从分组中可以看出,6380,6382,6384端口的节点都是master节点,这可以在redis-cluster集群中查看:

存储的key分布在哪个槽上,可以通过如下方法获取:
public static int getSlot(String key){
return JedisClusterCRC16.getSlot(key);
}
按照这种方法计算name-1,name-2,name-3的slot槽分别是:10801,6738,2675。按照之前的slot分布,可以得到name-1,name-2均落在6380上,name-3则落在6382上,我们可以在redis-cluster集群上通过命令来查找key,验证了这个结果:
redis 工具包的更多相关文章
- redis的面试题
1:使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,lis ...
- [Redis]Redis 概述及基本使用规范.
1 nosql的简介 1.1 nosql简介 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露 ...
- Redis教程(八):事务详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/135.html?1455806987 一.概述: 和众多其它数据库一样,R ...
- Redis学习手册(事务)
一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据 ...
- Redis的那些最常见面试问题
随笔:经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估 ...
- Redis入门教程(二)
推荐阅读: Redis入门教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的数据结构 5.1 Redis 数据结构介绍 redi ...
- 值得一看的35个Redis常用问题总结
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...
- redis入门知识汇总
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...
- (转)Redis的那些最常见面试问题
背景:最近在准备面试相关的题目,发现redis基本一片空白,有必要好好总结下. 转自:https://www.cnblogs.com/Survivalist/p/8119891.html 1.什么是r ...
随机推荐
- Mybatis源码学习之DataSource(七)_1
简述 在数据持久层中,数据源是一个非常重要的组件,其性能直接关系到整个数据持久层的性能.在实践中比较常见的第三方数据源组件有Apache Common DBCP.C3P0.Proxool等,MyBat ...
- layer是一款近年来备受青睐的web弹层组件
layer.closeAll(); //疯狂模式,关闭所有层 layer.closeAll('dialog'); //关闭信息框 layer.closeAll('page'); //关闭所有页面层 l ...
- 在linux写一个shell脚本用maven git自动更新代码并且打包部署
服务器上必须安装了git maven jdk 并且配置好环境变量 实际服务器中可能运行着多个Java进程,所以重新部署的时候需要先停止原来的java进程,写一个按照名称杀死进程的脚本 kill.sh ...
- Java 标准 IO 流编程一览笔录( 上 )
Java标准I/O知识体系图: 1.I/O是什么? I/O 是Input/Output(输入.输出)的简称,输入流可以理解为向内存输入,输出流是从内存输出. 2.流 流是一个连续的数据流,可以从流中读 ...
- arcgis python获得字段唯一值
arcgis python获得字段唯一值 # Import native arcgisscripting moduleimport arcgisscripting, sys# Create the g ...
- linux不能ping通主机,主机能ping通linux
1).打开控制面板,点击“系统和安全”选项.然后打开“Windows防火墙”.2).点击进入“高级设置”,选择“入站规则”.3).在入门规则中找到“文件和打印机共享(回显请求-ICMPv4-In)”选 ...
- 视图解析器InternalResourceViewResolver
ModelAndView对象中即可以封装真实视图路径名,也可以封装视图路径的逻辑名,springmvc.xml 代码如下: <!-- 视图解析器(框架) --> <bean clas ...
- smarty section 循环不同的四个样式
<div class="moban_spzs"> <{section name=goodslist loop=$strdata6}> <{if $sm ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在线教育视频站点介绍
笔记 第一章项目介绍和前期准备 1.SpringBoot整合微信支付开发在线教育视频站点介绍 简介: 课程介绍,和小D课堂在线教育项目搭建开发 1.课程大纲介绍 2.微信支付项 ...
- 基于Scrapy框架的增量式爬虫
概述 概念:监测 核心技术:去重 基于 redis 的一个去重 适合使用增量式的网站: 基于深度爬取的 对爬取过的页面url进行一个记录(记录表) 基于非深度爬取的 记录表:爬取过的数据对应的数据指纹 ...