1:Jedis与Redisson对比

2.1. 概况对比

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单。
Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。可以认为是jedis的补充,不能替换jedis。

2.2.可伸缩性

Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。
而Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。
2.3. 编程模型

Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。

Redisson使用非阻塞的I/O和基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。

2.4. 数据结构

Jedis仅支持基本的数据类型如:String、Hash、List、Set、Sorted Set。

Redisson不仅提供了一系列的分布式Java常用对象,不支持字符串存储,Redisson的实现类中只支持集合操作,不能对普通字符做操作。
不支持很多redis特性,比如排序,事务,管道,集群等
还提供了许多分布式服务,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch)。
并且是线程安全的,在分布式开发中,Redisson可提供更便捷的方法。

2:代码实例

jedis单机使用方式
public static void main(String[] args) {
// 开启Jedis连接池
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(50);
jpc.setMinIdle(10);
JedisPool jp = new JedisPool(jpc,"192.168.1.18",19000); // 开启Jedis客户端
Jedis jedis = jp.getResource(); jedis.set("k1","v1");
System.out.println(jedis.get("k1")); jedis.close();
}
jedis集群使用方式
public class JedisClusterTest { public static void main(String[] args) throws IOException { Set<HostAndPort> nodes = new HashSet<>();
HostAndPort hap = new HostAndPort("192.168.1.18",6379);
nodes.add(hap); JedisCluster jedisCluster =
new JedisCluster(
nodes, 1000,
1000, 1,
new GenericObjectPoolConfig()); jedisCluster.set("k1","v1");
jedisCluster.get("k1"); jedisCluster.close(); } }
Redisson使用方式
public class RedissonTest { public static void main(String[] args) { Config config = new Config();
config.setCodec(new org.redisson.client.codec.StringCodec());
config. useSingleServer().setAddress("192.168.1.18:19000"); RedissonClient redisson = Redisson.create(config);
RBucket<String> keyObject = redisson.getBucket("k2"); keyObject.set("v2"); System.out.println(keyObject.get()); redisson.shutdown();
}
}
3:codis能做什么

Codis介绍

  • Codis开发是专门解决分布式方案才诞生的
  • Codis是豌豆荚开发的分布式redis解决方案
  • 线上动态配置实现无限扩容,插槽分配和漂移
  • 单节点和集群操作对客户端透明
  • 线上可以在一定程序上达到一个资源漂移的效果

codis的强大之处服务端透明化,不需要关心多少集群,只需要关心第三方的proxy。

Codis的组成部分

命令 命令作用
Codis Dashboard Codis集群管理工具
Codis Proxy 集群代理,代理多个Codis
Codis Server 代替了窗台的redis-Server
Codis Group 组的概念,可以让集群出现更多的用法
Codis Admin 集群管理的命令行工具
Codis FE 图形界面处理

4:Codis集群的部署

1.环境的准备

yum install -y gcc glibc gcc-c++ make git
git clone https://github.com/CodisLabs/codis.git -b release3.2(去GIT上下载)
yum -y install glibc-2.17
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

2.需要的包

3.开始部署

安装go语言环境

1.常规操作
tar -xf go1.7.3.linux-amd64.tar.gz
cd go 2.添加环境变量
vim /etc/profile
export GOROOT=/root/codis/go
export GOPATH=/root/codis/go_path/codis
export PATH=PATH:JAVA_HOME/bin:$GOROOT/bin
source /etc/profile
 

安装zookeeper

tar -xf zookeeper-3.4.10.tar.gz
cd /root/codis/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cnf #配置文件有需要可以自己修改
 
/root/codis/zookeeper-3.4.10/bin/zkServer.sh start

安装codis

tar -xf codis3.2.2-go1.8.5-linux.tar.gz
cd codis3.2.2-go1.8.5-linux
mkdir conf/redis/{redis_6381,reids_6382}
拷贝redis的配置文件到以上目录下
cp redis.cnf conf/redis/redis_6381/ #修改配置文件
vim redis.cnf
#bind 127.0.0.1 #绑定注释
protected-mode no #安全模块不开启
daemonize yes #开启后台启动
pidfile /var/run/redis_6381.pid #设置进程号,不能相同
port 6381 #设置端口号,不能一样
分别执行
codis-server redis.cnf

开启两个服务

netstat -lnput |grep codis      #查看是否6381和6382端口开启
ps -ef |grep codis-server #查看进程是否使用

配置集群的管理工具dashboard

./codis-dashboard --default-config |tee conf/dashboard.toml     #开启dashboadb生成配置文件

修改配置文件

vim conf/dashboard.toml
coordinator_name = "zookeeper"
coordinator_addr = "192.168.4.56:2181" #不建议写IP地址,最好使用主机名称
product_name = "codis-demo"
admin_addr = "192.168.4.56:18080"
 

启动dashboard

mkdri ./logs
nohup ./codis-dashboard --config=conf/dashboard.toml --log=logs/dashboard.log --log-level=WARN --ncpu 2 & #指定配置文件位置,指定日志路径,指定日志级别,指定可以提供资源数
#nohup指定后台启动
tail -f /log/日志文件
 

关于如何优雅的关闭dashboard

常规的情况下我们总是使用(Kill -9 进程号)强制结束,但是这样会导致整个node节点崩溃,
为了保障其他节点的正常运行我们需要的是优雅的关闭dashboard。

./codis-admin --dashboard="192.168.4.56:18080" --shutdown

开启proxy

./codis-proxy --default-config |tee conf/proxy.toml
product_name = "codis-demo" #必须和我们的dashboard相同
vim conf/proxy.toml
admin_addr = "192.168.4.56:11080"
proxy_addr = "192.168.4.56:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.4.56:2181"
 

启动但是没有启用

nohup ./codis-proxy --config=conf/proxy.toml --log=logs/proxy.log --log-level=WARN --ncpu 2 &

启用相互之间关联

./codis-admin --dashboard=192.168.4.56:18080 --create-proxy -x192.168.4.56:11080

cat logs/proxy.log      #查看日志是否成功

启动codis-fe图形界面管理

生成配置文件

./codis-admin --dashboard-list --zookeeper=192.168.4.56:2181 |tee conf/codis.json

开启codis-fe

nohup ./codis-fe --ncpu=2 --log=logs/fe.log --log-level=WARN --dashboard-list=conf/codis.json --listen=192.168.4.56:10011 &

cat log/codis-fe

访问网站

5:替换成代理的地址即可访问操作redis

本文主要的目标是帮助大家完成Codis的集群搭建,让大家对Codis有一个相对直观的认知,话不多说,咱们开始把。

环境准备

codis3.2.2-go1.8.5-linux.tar.gz
glibc-2.17.tar.gz
go1.10.linux-amd64.tar.gz
zookeeper-3.4.11.tar.gz


go环境配置安装

由于Codis是使用GO语言编写的,所以想使用Codis需要先安装GO语言环境,安装过程如下:
将go1.10.linux-amd64.tar.gz解压至预期安装目录下,笔者习惯将内容放置在/opt/install下,截图如下:

go的默认环境要求必须在/usr/local下,所以更改目录需要配置GOROOT环境变量


GOPATH的目录是用来标识GO的所有第三方软件放置位置,当然了,我们现在只有一个Codis


Zookeeper环境配置安装

Codis是一款强依赖于Zookeeper的软件,所以我们需要安装它。

  1. 首先我们将Zookeeper解压至预期目录,依照习惯,笔者将内容解压至/opt/install目录下
  2. 将Zookeeper的conf目录下zoo.sample.cfg修改为zoo.cfg文件
  3. 启动Zookeeper即可,启动命令在Zookeeper的bin目录下的zkServer.sh

Codis环境配置安装

将codis3.2.2-go1.8.5-linux.tar.gz解压至刚刚配置的GOPATH目录下,然后依次配置即可,以下都使用%codis_path%来表示codis的解压根目录哈

  1. Codis-server配置启动
    首先我们要明确,codis-server其实就相当于redis-server,也就是codis-server可以启动很多个redis实例

    • 创建配置文件存储目录[因为要创建两个Redis实例]
      mkdir -p %codis_path%/conf/redis/redis_6379
      mkdir -p %codis_path%/conf/redis/redis_6380
    • 拷贝redis的配置文件至相应目录下【ps:如果没有文件的话,可以去下载一个Redis,然后将配置文件拷贝出来,这里就不赘述了】
    • 修改Redis配置文件【PS:两个配置文件修改的内容基本一致,所以合并一起说】


      <p>
    • 启动codis-server
      %codis_path%/codis-server %codis_path%/conf/redis/redis_6379/redis.conf
      %codis_path%/codis-server %codis_path%/conf/redis/redis_6380/redis.conf<p>
  2. Codis-dashboard配置启动
    • 创建配置文件
      %codis_path%/codis-dashboard --default-config | tee %codis_path%/config/codis/dashboard.toml<p>
    • 修改配置文件
    • 启动dashboard命令:【注意替换自己的codis路径】
      nohup /opt/install/codis3.2.2-go1.8.5-linux/codis-dashboard \
      --ncpu=4 \
      --config=/opt/install/codis3.2.2-go1.8.5-linux/config/codis/dashboard.toml \
      --log=/opt/install/codis3.2.2-go1.8.5-linux/logs/dashboard.log \
      --log-level=WARN &<p>

      -- 关闭dashboard命令:
      /opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard=192.168.4.130:18080 --shutdown<p>
      <p>
  3. Codis-Proxy配置启动
    • 生成proxy配置文件【注意替换自己的codis路径】
      /opt/install/codis3.2.2-go1.8.5-linux/codis-proxy --default-config | tee /opt/install/codis3.2.2-go1.8.5-linux/config/codis/proxy.toml<p>
    • 修改proxy配置文件

    • 启动proxy
      nohup /opt/install/codis3.2.2-go1.8.5-linux/codis-proxy --ncpu=4 --config=/opt/install/codis3.2.2-go1.8.5-linux/config/codis/proxy.toml --log=/opt/install/codis3.2.2-go1.8.5-linux/logs/proxy.log --log-level=WARN &<p>
    • 关联proxy与dashboard
      /opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard=192.168.4.130:18080 --create-proxy -x192.168.4.130:11080<p>
  4. Codis-FE配置启动
    • 配置codis-fe
      /opt/install/codis3.2.2-go1.8.5-linux/codis-admin --dashboard-list --zookeeper=192.168.4.130:2181 | tee /opt/install/codis3.2.2-go1.8.5-linux/config/codis/codis.json<p>
    • 启动codis-fe
      nohup ./codis-fe --ncpu=2 --log=logs/fe.log --log-level=WARN --dashboard-list=config/codis/codis.json --listen=192.168.4.130:8080 & <p>
  5. Codis配置演示

至此整个Codis集群环境就已经搭建完成了,大家可以尽情使用页面简单的操作和查看Redis集群状态了。

最后还是要大家说以下,如果希望使用Java客户端连接Codis集群,只要连接proxy即可,我们之前配置的proxy地址为:192.168.4.130:19000.

Codis分片原理

现在我们已经知道了Codis会将指定key的Redis命令转发给下层的Redis。那么Codis如何知道某个key在哪个Redis上呢。

Codis采用Pre-sharding的技术来实现数据分片,默认分为1024个slot(0-1023)。Codis在接收到命令时,先对key进行crc32运算,然后再对1024取余,得到的结果就是对应的slot。然后就可以将命令转发给slot对应的Redis实例进行处理了。

扩容操作

Codis的动态扩容/缩容能力是它的一大亮点之一。它可以对Redis客户端透明。在扩容时,Codis提供了SLOTSSCAN指令,这个指令可以扫描指定的slot上的所有key,然后对每个key进行迁移。在扩容过程中,如果有新的key需要转发到正在迁移的slot上,那么codis会判断这个key是否需要迁移,如果需要,则对指定的key进行强制迁移,迁移完成后,再将命令转发到新的Redis上。

看了上面的介绍是不是觉得扩容是一件很麻烦的事情,Codis已经为我们考虑到这点了,它提供了自动均衡的功能,只需要在界面上点一下"Auto Rebalance"按钮,就可以自动实现slot迁移(可以说非常贴心了)。缩容也比较简单,只需要将需要下线的实例的slot迁移到其他实例上,然后删除group就可以了。

  1. 添加group

刚刚我们启动了两个codis-server,因此,我们可以new两个group,然后分别将codis-server加入到两个group中

  1. 初始化slot

一开始所有的slot都是offline状态。

点击下方的Rebalance All Slots按钮,codis会自动把1024个slot分配给两个group(每个分512个)。

当然,也可以手动分配slot,比如,我们将group-1的10个slot分配给group-2,只需要点击Migrate Some按钮即可。

小结

codis 使用的更多相关文章

  1. Codis——分布式Redis服务的解决方案

    Codis——分布式Redis服务的解决方案 之前介绍过的 Twemproxy 是一种Redis代理,但它不支持集群的动态伸缩,而codis则支持动态的增减Redis节点:另外,官方的redis 3. ...

  2. 基于Redis的开源分布式服务Codis

    Redis在豌豆荚的使用历程--单实例==>多实例,业务代码中做sharding==>单个Twemproxy==>多个Twemproxy==>Codis,豌豆荚自己开发的分布式 ...

  3. codis集群安装

    在网上找了很多codis的集群安装方法,看起来都是大同小异,本人结合了大多种方法完成了一套自己使用的codis的集群安装,可以供大家学习使用,如果有什么问题或者不懂的地方欢迎指正 1.集群规划: 三台 ...

  4. Codis集群

    一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Re ...

  5. codis安装手册

    本文属原创,转载请注明此信息:http://www.cnblogs.com/robinjava77/p/5465150.html (Robin) codis交流群 240361424  感谢群里各位群 ...

  6. 伪集群zookeeper模式下codis的部署安装

    1,zookeeper伪集群部署     部署在192.168.0.210服务器上          下载     去官网将3.4.6版本的zookeeper下载下来到/app目录下解压     首先 ...

  7. Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储

    此文根据[QCON高可用架构群]分享内容,由群内[编辑组]志愿整理,转发请注明出处. 苏东旭,Ping CAP CTO,Codis作者 开源项目Codis的co-author黄东旭,之前在豌豆荚从事i ...

  8. 实战Centos系统部署Codis集群服务

    导读 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可 ...

  9. codis配置

    codis集群配置 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表) ...

  10. Redis 集群解决方案 Codis

    (来源:开源中国社区 http://www.oschina.net/p/codis) Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生 ...

随机推荐

  1. 比较器CompareTo的使用

    比较器CompareTo的使用 源码 package test; import java.text.SimpleDateFormat; import java.util.Date; public cl ...

  2. (转)区别TextBlock和Label

    TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速 ...

  3. vim的基本快捷操作(一)

    一.光标移动 ^ 到该行第一个非空格字符处. + 到下一行的第一个非空格字符处 - 到上一行的第一个非空格字符处 `. 到上次修改点 <c-o> 到上次所停留位置, <c-i> ...

  4. eduCF#61 F. Clear the String /// 区间DP 消除连续一段相同字符 全部消完的最少次数

    题目大意: 给定字符串 每次消除可消除连续的一段相同的字符的子串 求消除整个字符串的最少消除次数 #include <bits/stdc++.h> using namespace std; ...

  5. linux常用命令-2网络相关命令

    1.ip  [选项]  操作对象{link|addr|route...} ip addr show #显示网卡IP信息 2.修改IP配置 1)     root权限 2)     cd /etc/sy ...

  6. scala中的闭包

    scala闭包 代码示例: package test.close_pack import scala.collection.mutable.ArrayBuffer /** * AUTHOR Guozy ...

  7. 【JZOJ6421】匹配

    description analysis 对于普通树形\(DP\)可以设\(f[i][0/1],g[i][0/1]\)表示\([1,i]\)的线段树的最大值.方案数 \(0\)表示不选择根与某个儿子相 ...

  8. PHP ftp_rawlist() 函数

    定义和用法 ftp_rawlist() 函数返回 FTP 服务器上指定目录中文件的详细列表. 语法 ftp_rawlist(ftp_connection,dir,recursive) 参数 描述 ft ...

  9. js自动下载

    常用方法是利用a标签的属性download下载对应文件.图片等 <a href=".." download="...."></a> 但是 ...

  10. Android中的SrollView滚动详解

    今天开发遇到一个需求就是ScrollView中嵌套一个ListView,同时需要实现滑动到底部自动加载更多,我们知道ListView滑动到底部简单实现onScrollListener()监听器即可,但 ...