• SSM11-Redis---jedis的使用方法以及缓存同步


    1. Jedis

    需要把jedis依赖的jar包添加到工程中。Maven工程中需要把jedis的坐标添加到依赖。

     

    推荐添加到服务层。E3-content-Service工程中。

     

    1.1. 连接单机版

    第一步:创建一个Jedis对象。需要指定服务端的ip及端口。

    第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。

    第三步:打印结果。

    第四步:关闭Jedis

    @Test

    public void testJedis() throws Exception {

    // 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。

    Jedis jedis = new Jedis("192.168.80.129", 6379);

    // 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。

    String result = jedis.get("hello");

    // 第三步:打印结果。

    System.out.println(result);

    // 第四步:关闭Jedis

    jedis.close();

    }

     

    1.2. 连接单机版使用连接池

    第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。

    第二步:从JedisPool中获得Jedis对象。

    第三步:使用Jedis操作redis服务器。

    第四步:操作完毕后关闭jedis对象,连接池回收资源。

    第五步:关闭JedisPool对象。

    @Test

    public void testJedisPool() throws Exception {

    // 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。

    JedisPool jedisPool = new JedisPool("192.168.80.129", 6379);

    // 第二步:从JedisPool中获得Jedis对象。

    Jedis jedis = jedisPool.getResource();

    // 第三步:使用Jedis操作redis服务器。

    jedis.set("jedis", "test");

    String result = jedis.get("jedis");

    System.out.println(result);

    // 第四步:操作完毕后关闭jedis对象,连接池回收资源。

    jedis.close();

    // 第五步:关闭JedisPool对象。

    jedisPool.close();

    }

     

    1.3. 连接集群版

    第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。

    第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。

    第三步:打印结果

    第四步:系统关闭前,关闭JedisCluster对象。

     

    @Test

    public void testJedisCluster() throws Exception {

    // 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。

    Set<HostAndPort> nodes = new HashSet<>();

    nodes.add(new HostAndPort("192.168.80.129", 7001));

    nodes.add(new HostAndPort("192.168.80.129", 7002));

    nodes.add(new HostAndPort("192.168.80.129", 7003));

    nodes.add(new HostAndPort("192.168.80.129", 7004));

    nodes.add(new HostAndPort("192.168.80.129", 7005));

    nodes.add(new HostAndPort("192.168.80.129", 7006));

    JedisCluster jedisCluster = new JedisCluster(nodes);

    // 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。

    jedisCluster.set("hello", "100");

    String result = jedisCluster.get("hello");

    // 第三步:打印结果

    System.out.println(result);

    // 第四步:系统关闭前,关闭JedisCluster对象。

    jedisCluster.close();

    }

     

    2. 向业务逻辑中添加缓存

    2.1. 接口封装

    常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。

     

    2.1.1. 接口定义

    public interface JedisClient {

     

    String set(String key, String value);

    String get(String key);

    Boolean exists(String key);

    Long expire(String key, int seconds);

    Long ttl(String key);

    Long incr(String key);

    Long hset(String key, String field, String value);

    String hget(String key, String field);

    Long hdel(String key, String... field);

    }

     

    2.1.2. 单机版实现类

    public class JedisClientPool implements JedisClient {

     

    @Autowired

    private JedisPool jedisPool;

     

    @Override

    public String set(String key, String value) {

    Jedis jedis = jedisPool.getResource();

    String result = jedis.set(key, value);

    jedis.close();

    return result;

    }

     

    @Override

    public String get(String key) {

    Jedis jedis = jedisPool.getResource();

    String result = jedis.get(key);

    jedis.close();

    return result;

    }

     

    @Override

    public Boolean exists(String key) {

    Jedis jedis = jedisPool.getResource();

    Boolean result = jedis.exists(key);

    jedis.close();

    return result;

    }

     

    @Override

    public Long expire(String key, int seconds) {

    Jedis jedis = jedisPool.getResource();

    Long result = jedis.expire(key, seconds);

    jedis.close();

    return result;

    }

     

    @Override

    public Long ttl(String key) {

    Jedis jedis = jedisPool.getResource();

    Long result = jedis.ttl(key);

    jedis.close();

    return result;

    }

     

    @Override

    public Long incr(String key) {

    Jedis jedis = jedisPool.getResource();

    Long result = jedis.incr(key);

    jedis.close();

    return result;

    }

     

    @Override

    public Long hset(String key, String field, String value) {

    Jedis jedis = jedisPool.getResource();

    Long result = jedis.hset(key, field, value);

    jedis.close();

    return result;

    }

     

    @Override

    public String hget(String key, String field) {

    Jedis jedis = jedisPool.getResource();

    String result = jedis.hget(key, field);

    jedis.close();

    return result;

    }

     

    @Override

    public Long hdel(String key, String... field) {

    Jedis jedis = jedisPool.getResource();

    Long result = jedis.hdel(key, field);

    jedis.close();

    return result;

    }

     

    }

     

    配置:applicationContext-redis.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans4.2.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.2.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx4.2.xsd

    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util4.2.xsd">

     

    <!-- 配置单机版的连接 -->

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="6379"></constructor-arg>

    </bean>

    <bean id="jedisClientPool" class="cn.e3mall.jedis.JedisClientPool"/>

     

    </beans>

     

    2.1.3. 集群版实现类

    package cn.e3mall.jedis;

     

    import org.springframework.beans.factory.annotation.Autowired;

     

    import redis.clients.jedis.JedisCluster;

     

    public class JedisClientCluster implements JedisClient {

     

    @Autowired

    private JedisCluster jedisCluster;

     

    @Override

    public String set(String key, String value) {

    return jedisCluster.set(key, value);

    }

     

    @Override

    public String get(String key) {

    return jedisCluster.get(key);

    }

     

    @Override

    public Boolean exists(String key) {

    return jedisCluster.exists(key);

    }

     

    @Override

    public Long expire(String key, int seconds) {

    return jedisCluster.expire(key, seconds);

    }

     

    @Override

    public Long ttl(String key) {

    return jedisCluster.ttl(key);

    }

     

    @Override

    public Long incr(String key) {

    return jedisCluster.incr(key);

    }

     

    @Override

    public Long hset(String key, String field, String value) {

    return jedisCluster.hset(key, field, value);

    }

     

    @Override

    public String hget(String key, String field) {

    return jedisCluster.hget(key, field);

    }

     

    @Override

    public Long hdel(String key, String... field) {

    return jedisCluster.hdel(key, field);

    }

     

    }

     

     

    Spring的配置:

    <!-- 集群版的配置 -->

    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">

    <constructor-arg>

    <set>

    <bean class="redis.clients.jedis.HostAndPort">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="7001"></constructor-arg>

    </bean>

    <bean class="redis.clients.jedis.HostAndPort">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="7002"></constructor-arg>

    </bean>

    <bean class="redis.clients.jedis.HostAndPort">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="7003"></constructor-arg>

    </bean>

    <bean class="redis.clients.jedis.HostAndPort">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="7004"></constructor-arg>

    </bean>

    <bean class="redis.clients.jedis.HostAndPort">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="7005"></constructor-arg>

    </bean>

    <bean class="redis.clients.jedis.HostAndPort">

    <constructor-arg name="host" value="192.168.80.129"></constructor-arg>

    <constructor-arg name="port" value="7006"></constructor-arg>

    </bean>

    </set>

    </constructor-arg>

    </bean>

    <bean id="jedisClientCluster" class="cn.e3mall.jedis.JedisClientCluster"/>

     

    注意:单机版和集群版不能共存,使用单机版时注释集群版的配置。使用集群版,把单机版注释。

     

     

    2.2. 封装代码测试

    @Test

    public void testJedisClient() throws Exception {

    //初始化Spring容器

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");

    //从容器中获得JedisClient对象

    JedisClient jedisClient = applicationContext.getBean(JedisClient.class);

    jedisClient.set("first", "100");

    String result = jedisClient.get("first");

    System.out.println(result);

     

     

    }

    1.1. 缓存同步

    对内容信息做增删改操作后只需要把对应缓存删除即可。

    可以根据cid删除。

    @Override

    public E3Result addContent(TbContent content) {

    //补全属性

    content.setCreated(new Date());

    content.setUpdated(new Date());

    //插入数据

    contentMapper.insert(content);

    //缓存同步删除 已经修改的数据 下次从数据库中查询 而不是直接从缓存中获得

    jedisClient.hdel(CONTENT_KEY, content.getCategoryId().toString());

     

    return E3Result.ok();

    }

  • 相关阅读:
    LeetCode12: 整数转罗马数字
    LeetCode11:盛最多水的容器
    LeetCode09:判断回文数
    LeetCode08:字符串转换成整数
    LeetCode04:寻找中位数
    LeetCode03:无重复字符的最长子串
    《JAVA编程思想》第四版 PDF 下载 中文版和英文版 高清PDF扫描带书签
    XML
    异常
    委托和匿名方法和Lambda表达式
  • 原文地址:https://www.cnblogs.com/asndxj/p/10987273.html
Copyright © 2020-2023  润新知