我之前写过一篇简单说redis(上),当初本来是要写下的,后来工作原因,忘了.现在重新补上.
在这过程中出现了yum报错问题
1.linux安装
1.下载
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
2.解压
tar -zxvf redis-3.2.8.tar.gz -C ../servers/
3.安装c++
yum -y install gcc-c++
4.安装tcl
yum -y install tcl
5.编译
make
编译完后测试
make test
6.修改配置
//先创建两个目录
mkdir -p /export/servers/redis-3.2.8/logs
mkdir -p /export/servers/redis-3.2.8/redisdata
//修改
vim redis.conf
//修改内容
bind node-1
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/export/servers/redis-3.2.8/logs/redis.log"
dir /export/servers/redis-3.2.8/redisdata
7.执行启动
src/redis-server redis.conf
8.连接
src
redis-cli -h node-1
2.java示例代码
package jedisDemo.cn.test;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisDemo1 {
private JedisPool jedisPool;
private JedisPoolConfig config;
@Before
public void redisConnectionPool() {
System.out.println("lianjie");
config = new JedisPoolConfig();
config.setMaxIdle(10);
config.setMaxWaitMillis(3000);
config.setMaxTotal(50);
config.setMinIdle(5);
jedisPool = new JedisPool(config, "node-1", 6379);
}
@After
public void closePool() {
jedisPool.close();
}
// string
@Test
public void addStr() {
Jedis jedis = jedisPool.getResource();
// 添加
jedis.set("key2", "helloworld");
// 查询
String value = jedis.get("key2");
System.out.println(value);
// 删除
jedis.del("key2");
// 整数型增长
jedis.set("inkey", "1");
jedis.incr("inkey");
System.out.println(jedis.get("inkey"));
jedis.incrBy("inkey", 3);
System.out.println(jedis.get("inkey"));
}
// hash
@Test
public void addHash() {
Jedis jedis = jedisPool.getResource();
// 添加
jedis.hset("hashkey1", "field1", "jedisval1");
jedis.hset("hashkey1", "field2", "jedisval2");
// 获取
Map<String, String> hgetAll = jedis.hgetAll("hashkey1");
for (String field : hgetAll.keySet()) {
System.out.println("field=" + field);
System.out.println("val=" + hgetAll.get(field));
}
// 修改
jedis.hset("hashkey1", "field2", "jedisval321");
Map<String, String> hgetAll2 = jedis.hgetAll("hashkey1");
for (String field : hgetAll2.keySet()) {
System.out.println("field2=" + field);
System.out.println("val2=" + hgetAll2.get(field));
}
// 删除
jedis.del("hashkey1");
Map<String, String> hgetAll3 = jedis.hgetAll("hashkey1");
for (String field : hgetAll3.keySet()) {
System.out.println("field3=" + field);
System.out.println("val3=" + hgetAll3.get(field));
}
}
// list
@Test
public void addList() {
Jedis jedis = jedisPool.getResource();
// 从左插入
jedis.lpush("listKey1", "jedis1", "jedis2", "jedis3", "jedis2");
// 获取
List<String> listkey = jedis.lrange("listKey1", 0, -1);
for (String s : listkey) {
System.out.println(s);
}
// 从左边弹出
String listkey2 = jedis.lpop("listKey1");
System.out.println("lpop=" + listkey2);
}
@Test
public void addSet() {
Jedis jedis = jedisPool.getResource();
jedis.sadd("setKey1", "jedis1", "jedis2", "jedis3", "jedis2");
Set<String> set = jedis.smembers("setKey1");
for (String s : set) {
System.out.println("set=" + s);
}
// 移除掉一个数据
jedis.srem("setKey1", "jedis3");
Set<String> set2 = jedis.smembers("setKey1");
for (String s : set2) {
System.out.println("set2=" + s);
}
}
}
3.主从复制
安装
和前面一样
修改配置vim redis.conf,将node-1改成node-2,node-3
以及添加
slaveof node-1 6379
bind node-2
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/export/servers/redis-3.2.8/logs/redis.log"
dir /export/servers/redis-3.2.8/redisdata
slaveof node-1 6379
Sentinel(哨兵)
1.修改哨兵配置文件
vim sentinel.conf
#修改bind配置,每台机器修改为自己对应的主机名
bind node-1
#配置sentinel服务后台运行
daemonize yes
#修改三台机器监控的主节点,现在主节点是node服务器
sentinel monitor mymaster node-1 6379 2
#修改bind配置,每台机器修改为自己对应的主机名
bind node-2
#配置sentinel服务后台运行
daemonize yes
#修改三台机器监控的主节点,现在主节点是node01服务器
sentinel monitor mymaster node-1 6379 2
#修改bind配置,每台机器修改为自己对应的主机名
bind node-3
#配置sentinel服务后台运行
daemonize yes
#修改三台机器监控的主节点,现在主节点是node01服务器
sentinel monitor mymaster node-1 6379 2
启动
src/redis-sentinel sentinel.conf
哨兵模式java代码
package jedisDemo.cn.test;
import java.util.Arrays;
import java.util.HashSet;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
public class SentinelDemo1 {
@Test
public void testSentinel() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(10);
config.setMaxWaitMillis(3000);
config.setMaxTotal(30);
config.setMinIdle(5);
//哨兵信息
HashSet<String> sentinels = new HashSet<String>(Arrays.asList("node-1:26379","node-2:26379","node-3:26379"));
//创建连接池
JedisSentinelPool jsPool=new JedisSentinelPool("mymaster", sentinels,config);
//获取jedis
Jedis jedis = jsPool.getResource();
jedis.set("sentinelKey", "sentinelValue");
jedis.close();
}
}
4.集群
三主三从,需要六台虚拟机,不过资源有限,用一台模拟
1.解压
tar -zxf redis-3.2.8.tar.gz -C /export/
2.安装环境和编译
yum -y install gcc-c++ tcl
cd /export/redis-3.2.8
make && make install
3.创建redis不同实例的配置文件夹
cd /export/redis-3.2.8
mkdir -p /export/redis-3.2.8/clusters/7001
mkdir -p /export/redis-3.2.8/clusters/7002
mkdir -p /export/redis-3.2.8/clusters/7003
mkdir -p /export/redis-3.2.8/clusters/7004
mkdir -p /export/redis-3.2.8/clusters/7005
mkdir -p /export/redis-3.2.8/clusters/7006
4.修改配置文件
mkdir -p /export/redis-3.2.8/logs
mkdir -p /export/redis-3.2.8/redisdata/7001
mkdir -p /export/redis-3.2.8/redisdata/7002
mkdir -p /export/redis-3.2.8/redisdata/7003
mkdir -p /export/redis-3.2.8/redisdata/7004
mkdir -p /export/redis-3.2.8/redisdata/7005
mkdir -p /export/redis-3.2.8/redisdata/7006
第一个文件
vim /export/redis-3.2.8/redis.conf
bind node-1
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /var/run/redis_7001.pid
logfile "/export/redis-3.2.8/logs/7001.log"
dir /export/redis-3.2.8/redisdata/7001
第二个到第六个,将第一个复制到7002-7006中,将7001改成7002-7006,这里推荐可以使用notepad工具进行修改
cp /export/redis-3.2.8/redis.conf /export/redis-3.2.8/clusters/7002
vim /export/redis-3.2.8/clusters/7002/redis.conf
5.启动
cd /export/redis-3.2.8
src/redis-server clusters/7001/redis.conf
src/redis-server clusters/7002/redis.conf
src/redis-server clusters/7003/redis.conf
src/redis-server clusters/7004/redis.conf
src/redis-server clusters/7005/redis.conf
src/redis-server clusters/7006/redis.conf
6.安装ruby运行环境
yum install ruby
yum install rubygems
gem install redis
在执行gem install redis可能报ruby版本低问题,进行升级
cd /export/redis-3.2.8
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
执行这条命令时,可能会报curl: (7) couldn't connect to host
需要
sudo vim /etc/hosts
#绑定host
199.232.28.133 raw.githubusercontent.com
source /etc/profile.d/rvm.sh
rvm list known//查看可用版本
rvm install 2.4.1 //安装想要的版本
7.创建集群
cd /export/redis-3.2.8
gem install redis
src/redis-trib.rb create --replicas 1 node-1:7001 node-1:7002 node-1:7003 node-1:7004 node-1:7005 node-1:7006
如果出错,将 node-1换成p地址
之后再执行,如果报already busy的话,
src/redis-cli -h node01 -c -p 7001
输入cluster reset
flushall
7001-70066依次执行
8.连接
cd /export/redis-3.2.8
src/redis-cli -h node-1 -c -p 7001
java操作
package jedisDemo.cn.test;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
public class SentinelDemo1 {
@Test
public void testSentinel() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(10);
config.setMaxWaitMillis(3000);
config.setMaxTotal(30);
config.setMinIdle(5);
//哨兵信息
HashSet<String> sentinels = new HashSet<String>(Arrays.asList("node-1:26379","node-2:26379","node-3:26379"));
//创建连接池
JedisSentinelPool jsPool=new JedisSentinelPool("mymaster", sentinels,config);
//获取jedis
Jedis jedis = jsPool.getResource();
jedis.set("sentinelKey", "sentinelValue");
jedis.close();
}
@Test
public void jedisClusterTest() throws IOException {
Set<HostAndPort> portSet = new HashSet<HostAndPort>();
portSet.add(new HostAndPort("node-1",7001));
portSet.add(new HostAndPort("node-1",7002));
portSet.add(new HostAndPort("node-1",7003));
portSet.add(new HostAndPort("node-1",7004));
portSet.add(new HostAndPort("node-1",7005));
portSet.add(new HostAndPort("node-1",7006));
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMaxWaitMillis(3000);
jedisPoolConfig.setMaxTotal(30);
jedisPoolConfig.setMinIdle(5);
JedisCluster jedisCluster = new JedisCluster(portSet, jedisPoolConfig);
jedisCluster.set("clusterTest","clustervalue");//这个值不一定在7001中,可能在7002或7003中
String string = jedisCluster.get("clusterTest");
System.out.println(string);
jedisCluster.close();
}
}