Jedis是java中操作redis的一个客户端 类似于jdbc操作数据库
首先在pom文件中引入依赖
redis.clients jedis
然后获取Jedis实例 并连接redis
@Test
public void test() {
Jedis jedis = new Jedis("192.168.126.128", 6379);
String result = jedis.ping();
System.out.println(result);
}
连接成功:
Jedis连接池
package com.jt;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisDataSource {
//volatile
//禁止指令重排序
//保证多线程之间的可见性(一个线程对这个变量的值修改后 其他线程立刻可见)
//但不保证原子性
private static volatile JedisPool jedisPool;
public static Jedis getJedisPool() {
if (jedisPool == null) {
synchronized (JedisDataSource.class) {
if (jedisPool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(16);
config.setMaxTotal(128);
jedisPool = new JedisPool(config,"192.168.126.128", 6379);
}
}
}
return jedisPool.getResource();
}
public static void close() {
jedisPool.close();
}
}
单例模式的双重锁为什么用volatile???
在并发情况下,如果没有volatile关键字,new对象时会出现问题
jedisPool = new JedisPool()可以分解为3行伪代码:
a. memory = allocate() //分配内存 b. ctorInstanc(memory) //初始化对象 c. instance = memory //设置instance指向刚分配的地址
上面的代码在编译运行时,可能会出现重排序从a-b-c排序为a-c-b。在多线程的情况下会出现以下问题。当线程A在执行第5行代码时,B线程进来执行到第2行代码。假设此时A执行的过程中发生了指令重排序,即先执行了a和c,没有执行b。那么由于A线程执行了c导致jedisPool指向了一段地址,所以B线程判断jedisPool不为null,会直接跳到第6行并返回一个未初始化的对象。
详解:Java volatile关键字最全总结:原理剖析与实例讲解(简单易懂)_夏日清风-CSDN博客_java volatile



