一、测试联通
Linux中启动redis服务器
注意要将redis.conf
配置文件中的protected-mode
设置为no
,同时将bind 127.0.0.1 -::1
给注释掉,这样使用使用Jedis
才可以从Windows访问Linux启动的redis服务器。
java代码
import redis.clients.jedis.Jedis;
public class RedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.144.138", 6379);
System.out.println(jedis.ping("连接redis成功!"));
}
}
输出结果:
二、常用API
set
、get
、keys
@Test
public void test1(){
//set设置key-value
jedis.set("k1","v1");
jedis.set("k2","v2");
jedis.set("k3","v3");
//get获取key-value
String k4 = jedis.get("k4");
System.out.println(k4);
//keys
Set<String> keys = jedis.keys("*");
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
输出结果:
exists
:判断是否存在key
ttl
:获取key的过期时间
@Test
public void test2(){
//exist判断是否存在key
System.out.println(jedis.exists("k2"));
//ttl获取key的过期时间
System.out.println(jedis.ttl("k2"));
}
输出结果:
String
数据类型常用API
@Test
public void test3(){
//append:拼接字符串
jedis.append("k1","redis-append");
System.out.println(jedis.get("k1"));
System.out.println("-----------------------------------------");
//mset:一次性设置多对key-value
jedis.mset("str1","v1","str2","v2","str3","v3");
//mget:一次性获取多对key-value
List<String> mget = jedis.mget("str1", "str2", "str3");
for (String str : mget){
System.out.println(str);
}
}
输出结果:
List
数据类型常用API
@Test
public void test4(){
jedis.lpush("mylist","v1","v2","v3","v4","v5");
jedis.rpush("mylist1","v1","v2","v3","v4","v5");
List<String> mylist = jedis.lrange("mylist", 0, -1);
List<String> mylist1 = jedis.lrange("mylist1", 0, -1);
for (String str : mylist){
System.out.println(str);
}
System.out.println("-------------------------------");
for (String str : mylist1){
System.out.println(str);
}
}
输出结果:
Set
数据类型常用API
@Test
public void test5(){
jedis.sadd("set1","v1");
jedis.sadd("set1","v2");
jedis.sadd("set1","v3");
Set<String> set1 = jedis.smembers("set1");
Iterator<String> iterator = set1.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//移除某个集合中的元素
jedis.srem("set1","v2");
//获取集合大小
int size = jedis.smembers("set1").size();
System.out.println(size);
}
输出结果:
Hash
数据类型常用API
@Test
public void test6(){
jedis.hset("User","username","张三");
String hget = jedis.hget("User", "username");
System.out.println(hget);
Map<String,String> map = new HashMap<String, String>();
map.put("name","lisi");
map.put("email","lisi@qq.com");
map.put("phone","111222");
map.put("address","上海");
jedis.hmset("map",map);
List<String> hmget = jedis.hmget("map", "address", "phone");
for (String str : hmget){
System.out.println(str);
}
}
输出结果:
Zset
数据类型常用API
@Test
public void test7(){
jedis.zadd("zset",60,"v1");
jedis.zadd("zset",40,"v3");
jedis.zadd("zset",70,"v2");
jedis.zadd("zset",90,"v4");
Set<Tuple> zset = jedis.zrangeWithScores("zset", 0, -1);
Iterator<Tuple> iterator = zset.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
输出结果:
所有的API操作与redis操作相类似,详细可参考Redis常用操作命令
三、使用Jedis操作事务
提交事务
public class TestTx {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.144.138", 6379);
//开启事务
Transaction transaction = jedis.multi();
//命令入队
transaction.set("tx1","111");
transaction.set("tx2","222");
transaction.set("tx3","333");
//提交事务
transaction.exec();
List<String> mget = jedis.mget("tx1", "tx2", "tx3");
for (String s : mget){
System.out.println(s);
}
}
}
事务加锁
public class TestTx {
public boolean transMethod(){
Jedis jedis = new Jedis("192.168.144.138", 6379);
//可用余额
int balance;
//欠额
int debt;
//实刷额度
int amtToSubtract = 10;
//watch监控balance
jedis.watch("balance");
balance = Integer.parseInt(jedis.get("balance"));
debt = Integer.parseInt(jedis.get("debt"));
if (balance < amtToSubtract){
jedis.unwatch(); //放弃监控
System.out.println("数据被修改,本次事务失败");
return false;
}else {
System.out.println("开始执行事务操作");
Transaction transaction = jedis.multi();
transaction.decrBy("balance",amtToSubtract);
transaction.incrBy("debt",amtToSubtract);
transaction.exec();
System.out.println("事务执行完成:" + "balance = " + balance + " debt = " + debt);
return true;
}
}
public static void main(String[] args) {
TestTx testTx = new TestTx();
//模拟11次操作
for (int i = 0; i <= 10; i++){
boolean transMethod = testTx.transMethod();
System.out.println(transMethod);
}
}
}
输出结果:
四、Jedis主从复制操作
首先Linux中启动两台redis服务器
public class MasterSlave {
public static void main(String[] args) {
//主机
Jedis master = new Jedis("192.168.144.138", 6379);
//从机
Jedis slave = new Jedis("192.168.144.138", 6380);
//从机挂载在主机下
slave.slaveof("192.168.144.138",6379);
//主机写
master.set("master","jedis-master");
//从机读
System.out.println(slave.get("master"));
}
}
输出结果:
五、JedisPool连接池
单例模式获取JedisPool
连接池
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
//单例模式,私有化构造方法,使得不能new新的对象
private JedisPoolUtil(){}
public static JedisPool getJedisPool(){
if (null == jedisPool){
synchronized (JedisPoolUtil.class){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//控制一个pool可分配多少个Jedis实例
jedisPoolConfig.setMaxTotal(1000);
//控制一个pool最多有多少个状态idle空间的Jedis实例
jedisPoolConfig.setMaxIdle(32);
//表示当borrow一个Jedis实例时,最大的等待时间,如果超时则报异常
jedisPoolConfig.setMaxWaitMillis(100*1000);
//获得一个Jedis实例的时候是否检查连接的可用性(ping())
jedisPoolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(jedisPoolConfig,"192.168.144.138",6379);
}
}
return jedisPool;
}
public static void release(Jedis jedis){
if (null != jedis){
jedis.close();
}
}
}
测试连接池
public class TestJedisPool {
public static void main(String[] args) {
JedisPool jedisPool = JedisPoolUtil.getJedisPool();
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.set("pool_test","pool");
} catch (Exception e) {
e.printStackTrace();
} finally {
JedisPoolUtil.release(jedis);
}
}
}