一、Jedis
使用java语言来连接和操作redis数据库。
https://github.com/xetorthio/jedis
在这里的理解 jedis相当于jdbc
- 引入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
- 启动redis的服务
- 测试连通性
@Test
public void pingTest(){
// 连接虚拟机中的redis服务
Jedis jedis = new Jedis("192.168.124.7",6379);
//测试是否可以和redis服务器连通 返回PONG 表示连接redis服务器成功
System.out.println(jedis.ping());
}
- 数据操作的测试
在redis的服务端有什么样的命令,那么在jedis中就有对应的方法可以调用
@Test
public void stringTest(){
// 获取redis中所有的key
Jedis jedis = new Jedis("192.168.124.7",6379);
Set<String> keys = jedis.keys("*");
for (String key : keys){
System.out.println(key);
}
}
@Test
public void stringTest(){
// 写入一个String类型 注意不能再slave上写入
String setRes = jedis.set("s1" ,"admin");
System.out.println(setRes);//ok
String msetRes = jedis.mset("s2","AA","s3","BB","s4","cc");
System.out.println(msetRes);
List<String> mgetRes = jedis.mget("s2","s3","s4");
for(String str :mgetRes){
System.out.println(str);
}
jedis.set("n1","1");
jedis.incrBy("n1",100);
System.out.println(jedis.get("n1"));
}
// 事务的相关操作
@Test
public void tranctionTest(){
jedis.watch("ss1");//监视一个key
jedis.set("ss1","aaaaa");
jedis.unwatch();//取消监视
// 对于监视的key 如果在事务之前被修改 则事务将被取消 监视取消 事务可以正常执行
Transaction transaction = jedis.multi();
Response<Long> res = transaction.lpush("l1","zhangsan","lisi","wangwu");
transaction.set("ss1","bbbb");
Response<String> res1 = transaction.lpop("l1");
Response<Long> res2 = transaction.sadd("score","100","80","90");
transaction.exec();
System.out.println(jedis.get("ss1"));
}
jedisPool:
@Test
public void jedisPool(){
JedisPool pool = new JedisPool("192.168.124.7",6379);
JedisPoolConfig jpf = new JedisPoolConfig();
jpf.setMaxIdle(10);
jpf.setMaxTotal(20);
jpf.setMinIdle(5);
Jedis jedis = pool.getResource();
jedis.set("sk1","SSSS");
String sk1 = jedis.get("sk1");
System.out.println(sk1);
jedis.close();
}
二、高可用性
HA高可用性 主从复制 读写分离
Sentinel
分别启动redis 服务 和sentinel 服务
此处 将sentinel79/80/81.cof文件中的所有的
bind 192.168.230.130(虚拟机的ip)
启动之后的进程 所有的哨兵进程必须是以IP地址开头
无论是服务端还是哨兵的配置 尽量都使用ip地址
i
mport org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
import java.util.Set;
public class SentinelTest {
JedisSentinelPool jedisSentinelPool = null;
Jedis jedis = null ;
@Before
public void init(){
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(5000);
poolConfig.setMaxIdle(500);
poolConfig.setMaxWaitMillis(5000L);
//设置哨兵
Set<String> sentinels = new HashSet<String>();
sentinels.add("192.168.230.130:26379");
sentinels.add("192.168.230.130:26380");
sentinels.add("192.168.230.130:26381");
jedisSentinelPool = new JedisSentinelPool("mymaster",sentinels,poolConfig);
jedis = jedisSentinelPool.getResource();
}
@Test
public void pingTest(){
System.out.println(jedis.ping());
}
@Test
public void dataTest(){
jedis.set("abb","abb");
HostAndPort hp = jedisSentinelPool.getCurrentHostMaster();
System.out.println(hp.getHost());
System.out.println(hp.getPort());
}
}
执行lua脚本
public void testLua() {
Jedis jedis = RedisClient.getJedis();
List<String> keys = new ArrayList<>();
keys.add("name");
keys.add("age");
List<String> values = new ArrayList<>();
values.add("kevin");
values.add("25");
jedis.eval("redis.call('set', KEYS[1], ARGV[1]) redis.call('set', KEYS[2], ARGV[2])", keys, values);
jedis.close();
}