• Redis java操作客服端——jedis


    1. Jedis

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

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

    1.1. 连接单机版

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

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

    第三步:打印结果。

    第四步:关闭Jedis

        @Test
    public void testSetGet() {
    //1.创建jedis对象,参数IP,Port
    Jedis jedis = new Jedis("192.168.25.129", 6379);
    //2.插入字符串
    jedis.set("sex", "男");
    //3.取出字符串
    String sex = jedis.get("sex");
    System.out.println(sex);
    //4.关闭连接
    jedis.close();
    }

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

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

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

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

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

    第五步:关闭JedisPool对象。


    @Test
    public void testPool() {
    //1.获得连接池
    JedisPool jedisPool = new JedisPool("192.168.25.129", 6379);
    //2.获得连接
    Jedis jedis = jedisPool.getResource();
    //3.操作
    String sex = jedis.get("sex");
    System.out.println(sex);
    //4.关闭连接
    jedis.close();
    //5.关闭连接池
    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.25.129", 7001));              
    nodes.add(new HostAndPort("192.168.25.129", 7002));              
    nodes.add(new HostAndPort("192.168.25.129", 7003));              
    nodes.add(new HostAndPort("192.168.25.129", 7004));              
    nodes.add(new HostAndPort("192.168.25.129", 7005));              
    nodes.add(new HostAndPort("192.168.25.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 {

    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;
    }

    public JedisPool getJedisPool() {
    return jedisPool;
    }

    public void setJedisPool(JedisPool jedisPool) {
    this.jedisPool = jedisPool;
    }

    }

    配置:applicationContext-redis.xml


    <bean id="jedisClientPool" class="com.happygo.common.jedis.JedisClientPool">
    <property name="jedisPool" ref="jedisPool"></property>
    </bean>
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
    <constructor-arg name="host" value="192.168.25.129" ></constructor-arg>
    <constructor-arg name="port" value="6379" ></constructor-arg>
    </bean>

    2.1.3. 集群版实现类


    public class JedisClientCluster implements JedisClient {

    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.25.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.25.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.25.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.25.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.25.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.25.129"></constructor-arg>
    <constructor-arg name="port" value="7006"></constructor-arg>
    </bean>
    </set>
    </constructor-arg>
    </bean>
    <bean id="jedisClientCluster" class="com.happygo.common.jedis.JedisClientCluster"/>

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

    2.2. 封装代码测试


    @Test
    public void testJedisClientPool() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring/applicationContext-redis.xml");
    JedisClientPool jedisClientPool = context.getBean(JedisClientPool.class);
    jedisClientPool.set("hello", "world");
    String string = jedisClientPool.get("hello");
    System.out.println(string);
    }

    2.3. 添加缓存

    2.3.1. 功能分析

    查询内容列表时添加缓存。

    1、查询数据库之前先查询缓存。

    2、查询到结果,直接响应结果。

    3、查询不到,缓存中没有需要查询数据库。

    4、把查询结果添加到缓存中。

    5、返回结果。

    向redis中添加缓存:

    Key:cid

    Value:内容列表。需要把java对象转换成json。

    使用hash对key进行归类。

    HASH_KEY:HASH

    ​ |--KEY:VALUE

    ​ |--KEY:VALUE

    ​ |--KEY:VALUE

    ​ |--KEY:VALUE

    注意:添加缓存不能影响正常业务逻辑。

    2.3.2. 代码实现


    @Service
    public class ContentServiceImpl implements ContentService {
    @Autowired
    private TbContentMapper contentMapper;

    @Autowired
    private JedisClient jedisClient;

    @Value("${CONTENT_LIST}")
    private String CONTENT_LIST;

    @Override
    public ResultUtils addContent(TbContent content) {
    content.setCreated(new Date());
    content.setUpdated(new Date());
    contentMapper.insert(content);
    return ResultUtils.ok();
    }

    @Override
    public List<TbContent> getContentListByCid(long cid) {
    try {
    String json = jedisClient.hget(CONTENT_LIST, cid + "");
    if(StringUtils.isNotBlank(json)) {
    List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
    return list;
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    TbContentExample example = new TbContentExample();
    Criteria criteria = example.createCriteria();
    criteria.andCategoryIdEqualTo(cid);
    List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);
    try {
    jedisClient.hset(CONTENT_LIST, cid + "", JsonUtils.objectToJson(list));
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return list;
    }
    }

    2.4. 缓存同步

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

    可以根据cid删除。


    @Override
    public ResultUtils addContent(TbContent content) {
    content.setCreated(new Date());
    content.setUpdated(new Date());
    contentMapper.insert(content);
    try {
    jedisClient.hdel(CONTENT_LIST, content.getCategoryId() + "");
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return ResultUtils.ok();
    }
  • 相关阅读:
    CSS 两个行内块元素,宽度相加刚好等于父盒子容器的元素,但第二个元素掉在第二行解决办法
    js 自定义获得类class和获得id
    学习笔记:BSGS(拔山盖世?)算法
    解题报告: luogu P1040
    解题报告:SP18155 ABSP1
    解题报告:luogu P1099
    Thussat 游记
    解题报告:luogu P2220
    学习笔记:卢卡斯定理(并没有学会)
    从线性筛到欧拉函数,你十有八九能懂吧!
  • 原文地址:https://www.cnblogs.com/tysl/p/10964844.html
Copyright © 2020-2023  润新知