JedisClient操作redis 单机版和集群版

本文介绍了如何使用JedisClient在SpringBoot应用中操作Redis,包括单机版和集群版的配置及使用。文章详细讲解了添加依赖、接口设计、配置文件设置,以及如何在业务逻辑中添加缓存,并强调了缓存同步的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.快速了解缓存穿透与缓存雪崩
2.springBoot注解大全
3.springBoot之Thymeleaf

4.redis常用命令手册大全

5.redis面试题集锦(含答案)

一、在pom文件中添加依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.0.1</version>
</dependency>

二、准备JedisClient接口

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

三、实现

1.单机版

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

}

  (2)集群版

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

  四、配置文件

<!-- redis单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
    <constructor-arg name="host" value="192.168.206.132"/>   
    <constructor-arg name="port" value="7001"/>  
</bean>
<bean id="jedisClientPool" class="com.taotao.jedis.JedisClientPool"/>

注意:使用集群版则注释掉单机版,反之一样
  这里将集群配置在同一台机器上,开了6个不同的端口,也叫作伪分布式,你也可以开6台机器,然后修改ip和端口。
 为什么要6台机器?
什么是集群?集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。(如果需要具体的搭建步骤,可以去看我的博客,里面每一步都有截图

<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
    <constructor-arg>
        <set>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="192.168.206.132"/>
                <constructor-arg name="port" value="7001"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="192.168.25.132"/>
                <constructor-arg name="port" value="7002"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="192.168.25.132"/>
                <constructor-arg name="port" value="7003"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="192.168.206.132"/>
                <constructor-arg name="port" value="7004"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="192.168.206.132"/>
                <constructor-arg name="port" value="7005"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="192.168.206.132"/>
                <constructor-arg name="port" value="7006"/>
            </bean>
        </set>
    </constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.taotao.jedis.JedisClientCluster"/>

五、测试

@Test
public void testJedis(){
    //初始化spring容器
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");
    //从容器中获得jedisclient对象
    JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
    //使用JedisClient操作redis
    jedisClient.set("ok", "test666");
    String result = jedisClient.get("ok");
    System.out.println(result);
}

六、向业务逻辑中添加缓存

添加缓存不能影响正常的业务逻辑
  查询时,业务中应该先去缓存中查询
  如果缓存中没有,在数据库查询
  将数据库查询到的结果添加到缓存中
  推荐使用的数据类型为hash

举例:

public List<TbContent> getContentList(long cid) {
    //查询缓存
    try {
        String json = jedisClient.hget(CONTENT_KEY, cid + "");
        //判断json是否为空
        if (StringUtils.isNotBlank(json)) {
            //把json转换成list
            List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
            return list;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    //根据cid查询内容列表
    TbContentExample example = new TbContentExample();
    //设置查询条件
    Criteria criteria = example.createCriteria();
    criteria.andCategoryIdEqualTo(cid);
    //执行查询
    List<TbContent> list = contentMapper.selectByExample(example);
    //向缓存中添加数据
    try {
        jedisClient.hset(CONTENT_KEY, cid + "", JsonUtils.objectToJson(list));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

七、缓存同步

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

    //缓存同步
    jedisClient.hdel(CONTENT_KEY, content.getCategoryId().toString());

欢迎识别下方二维码,关注小编微信公众号,可以获取跟多Java资料:

七夕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值