栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java连接redis之Jedis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java连接redis之Jedis

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704025.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号