Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis真是好,其中的键值用起来真心强大啊有木有, 之前的文章讲过搭建了redis集群 那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢? 先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令:  1 [root@nginx bin]# .

Redis真是好,其中的键值用起来真心强大啊有木有,

之前的文章讲过搭建了redis集群

那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢?

先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令:

 1 [root@nginx bin]# ./redis-server redis.conf 

启动就行

在sprig文件中配置如下

 1 <!-- 
 2         TODO:
 3         开发环境使用单机版
 4         生产环境务必切换成集群
 5      -->
 6     <!-- 配置redis客户端单机版 -->
 7     <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
 8         <constructor-arg name="host" value="${redis.single.client.host}"></constructor-arg>
 9         <constructor-arg name="port" value="${redis.single.client.port}"></constructor-arg>
10     </bean>
11     <!-- 配置redis客户端实现类 -->
12     <bean id="jedisClientSingle" class="com.lee.rest.component.impl.JedisClientSingle"/>
13     
14     <!-- 配置redis客户端集群版 单机版和集群版的jedis只能存在一个 -->
15     <!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
16         <constructor-arg>
17             <set>
18                 <bean class="redis.clients.jedis.HostAndPort">
19                     <constructor-arg name="host" value="${redis01.real.cluster.client.host}"/>
20                     <constructor-arg name="port" value="${redis01.real.cluster.client.port}"/>
21                 </bean>
22                 <bean class="redis.clients.jedis.HostAndPort">
23                     <constructor-arg name="host" value="${redis02.real.cluster.client.host}"/>
24                     <constructor-arg name="port" value="${redis02.real.cluster.client.port}"/>
25                 </bean>
26                 <bean class="redis.clients.jedis.HostAndPort">
27                     <constructor-arg name="host" value="${redis03.real.cluster.client.host}"/>
28                     <constructor-arg name="port" value="${redis03.real.cluster.client.port}"/>
29                 </bean>
30                 <bean class="redis.clients.jedis.HostAndPort">
31                     <constructor-arg name="host" value="${redis04.real.cluster.client.host}"/>
32                     <constructor-arg name="port" value="${redis04.real.cluster.client.port}"/>
33                 </bean>
34                 <bean class="redis.clients.jedis.HostAndPort">
35                     <constructor-arg name="host" value="${redis05.real.cluster.client.host}"/>
36                     <constructor-arg name="port" value="${redis05.real.cluster.client.port}"/>
37                 </bean>
38                 <bean class="redis.clients.jedis.HostAndPort">
39                     <constructor-arg name="host" value="${redis06.real.cluster.client.host}"/>
40                     <constructor-arg name="port" value="${redis06.real.cluster.client.port}"/>
41                 </bean>
42             </set>
43         </constructor-arg>
44     </bean>
45     <bean id="jedisClientCluster" class="com.lee.rest.component.impl.JedisClientCluster"/> -->

这是配置的redis-cli的连接池

然后定义一个接口,这个接口供两个类实现

一个是单机版,一个是集群版

有人会问为啥要2个类实现,因为redis的单机和集群都是不同的实现方法

一般在开发环境会使用单机版来做测试,生产环境直接上集群

 1 #fake cluster
 2 redis.single.client.host=192.168.1.191
 3 redis.single.client.port=6379
 4 
 5 redis01.cluster.client.host=192.168.1.192
 6 redis01.cluster.client.port=7001
 7 
 8 redis02.cluster.client.host=192.168.1.192
 9 redis02.cluster.client.port=7002
10 
11 redis03.cluster.client.host=192.168.1.192
12 redis03.cluster.client.port=7003
13 
14 redis04.cluster.client.host=192.168.1.192
15 redis04.cluster.client.port=7004
16 
17 redis05.cluster.client.host=192.168.1.192
18 redis05.cluster.client.port=7005
19 
20 redis06.cluster.client.host=192.168.1.192
21 redis06.cluster.client.port=7006

在你的资源文件中配好如上信息,供spring调用

说个题外话,资源文件*.properties,在spring的父子容器中不是公用的

也就是说,在service的spring容器中,只能配service层调用

在springMVC容器中只能被springmvc自己调用,因为资源文件不是夸容器的

而spring容器中的对象是可以被springMVC来访问的

但是springMVC的对象以及资源文件绝对不能被spring来访问,

举个栗子:你有见过service访问controller的吗?没有吧,哈哈

咱们先来建一个通用jedis客户端

(有2个小家伙看不懂最后2个方法什么意思,就加了注释,其实规范点来讲,所有的接口方法都要加注释,而实现类就不需要,但是实现类中的私有方法必须加注释,这是规范)

 1 package com.lee.rest.component;
 2 
 3 /**
 4  * 
 5  * @Title: JedisClient.java
 6  * @Package com.lee.rest.component
 7  * @Description: redis客户端
 8  * Copyright: Copyright (c) 2016
 9  * Company:Nathan.Lee.Salvatore
10  * 
11  * @author leechenxiang
12  * @date 2016年4月27日 下午4:28:46
13  * @version V1.0
14  */
15 public interface JedisClient {
16 
17     public String set(String key, String value);
18     public String get(String key);
19     public Long hset(String key, String item, String value);
20     public String hget(String key, String item);
21     public Long hdel(String key, String item);
22     public Long incr(String key);
23     public Long decr(String key);
24     
25     /**
26      * 
27      * @Description: 设置存存活时间
28      * @param key
29      * @param second
30      * @return
31      * 
32      * @author leechenxiang
33      * @date 2016年4月27日 下午4:34:35
34      */
35     public Long expire(String key, int second);
36     
37     /**
38      * 
39      * @Description: 判断key多久过期
40      * @param key
41      * @return42      *             >= 0     剩余秒数
43      *             = -1    永久存活
44      *             = -2    已经消除
45      * 
46      * @author leechenxiang
47      * @date 2016年4月27日 下午4:34:22
48      */
49     public Long ttl(String key);
50 }
 1 /**
 2  * 
 3  * @Title: JedisClientSingle.java
 4  * @Package com.lee.rest.component.impl
 5  * @Description: 单机版的jedis客户端操作
 6  * Copyright: Copyright (c) 2016
 7  * Company:Nathan.Lee.Salvatore
 8  * 
 9  * @author leechenxiang
10  * @date 2016年4月27日 下午4:36:42
11  * @version V1.0
12  */
13 public class JedisClientSingle implements JedisClient {
14 
15     @Autowired
16     private JedisPool jedisPool;
17 
18     @Override
19     public String set(String key, String value) {
20         Jedis jedis = jedisPool.getResource();
21         String result = jedis.set(key, value);
22         jedis.close();
23         return result;
24     }
25 
26     @Override
27     public String get(String key) {
28         Jedis jedis = jedisPool.getResource();
29         String result = jedis.get(key);
30         jedis.close();
31         return result;
32     }
33 
34     @Override
35     public Long hset(String key, String item, String value) {
36         Jedis jedis = jedisPool.getResource();
37         Long result = jedis.hset(key, item, value);
38         jedis.close();
39         return result;
40     }
41 
42     @Override
43     public String hget(String key, String item) {
44         Jedis jedis = jedisPool.getResource();
45         String result = jedis.hget(key, item);
46         jedis.close();
47         return result;
48     }
49     
50     @Override
51     public Long hdel(String key, String item) {
52         Jedis jedis = jedisPool.getResource();
53         Long result = jedis.hdel(key, item);
54         jedis.close();
55         return result;
56     }
57 
58     @Override
59     public Long incr(String key) {
60         Jedis jedis = jedisPool.getResource();
61         Long result = jedis.incr(key);
62         jedis.close();
63         return result;
64     }
65 
66     @Override
67     public Long decr(String key) {
68         Jedis jedis = jedisPool.getResource();
69         Long result = jedis.decr(key);
70         jedis.close();
71         return result;
72     }
73 
74     @Override
75     public Long expire(String key, int second) {
76         Jedis jedis = jedisPool.getResource();
77         Long result = jedis.expire(key, second);
78         jedis.close();
79         return result;
80     }
81 
82     @Override
83     public Long ttl(String key) {
84         Jedis jedis = jedisPool.getResource();
85         Long result = jedis.ttl(key);
86         jedis.close();
87         return result;
88     }
89 
90 }
 1 /**
 2  * 
 3  * @Title: JedisClientCluster.java
 4  * @Package com.lee.rest.component.impl
 5  * @Description: 集群版的jedis客户端操作
 6  * Copyright: Copyright (c) 2016
 7  * Company:Nathan.Lee.Salvatore
 8  * 
 9  * @author leechenxiang
10  * @date 2016年4月27日 下午4:44:02
11  * @version V1.0
12  */
13 public class JedisClientCluster implements JedisClient {
14 
15     @Autowired
16     private JedisCluster jedisCluster;
17 
18     @Override
19     public String set(String key, String value) {
20         return jedisCluster.set(key, value);
21     }
22 
23     @Override
24     public String get(String key) {
25         return jedisCluster.get(key);
26     }
27 
28     @Override
29     public Long hset(String key, String item, String value) {
30         return jedisCluster.hset(key, item, value);
31     }
32 
33     @Override
34     public String hget(String key, String item) {
35         return jedisCluster.hget(key, item);
36     }
37 
38     @Override
39     public Long hdel(String key, String item) {
40         return jedisCluster.hdel(key, item);
41     }
42     
43     @Override
44     public Long incr(String key) {
45         return jedisCluster.incr(key);
46     }
47 
48     @Override
49     public Long decr(String key) {
50         return jedisCluster.decr(key);
51     }
52 
53     @Override
54     public Long expire(String key, int second) {
55         return jedisCluster.expire(key, second);
56     }
57 
58     @Override
59     public Long ttl(String key) {
60         return jedisCluster.ttl(key);
61     }
62 
63 }

使用地方,一般都是在service中调用,把需要加缓存的地方都实现接口

取之前查询有没有缓存,有直接返回,没有查数据库,然后再放入缓存

也有企业会这么做,所有的缓存都有一个团队来管理,做一个定时器,每天凌晨固定一个时间点来跑批,把数据放入缓存

这么做也是可以的

我们采取的是第一种

PS:@Autowired 这边是用的类型相同,有人喜欢用@resource,这样的话就得多写一个,区别点

 1 @Autowired
 2 private JedisClient jedisClient;
 3 
 4 @Value("${REDIS_CONTENT_KEY}")
 5 private String REDIS_CONTENT_KEY;
 6 
 7 @Override
 8 public List<Content> gettList(Long id) {
 9 // TODO 这个地方加缓存和不加缓存,单台或者集群的redis,都要进行压力测试
10 //添加缓存
11 //查询数据库之前先查询缓存,如果有直接返回
12 try {
13 //从redis中取缓存数据
14 String json = jedisClient.hget(REDIS_CONTENT_KEY, id + "");
15 if (!StringUtils.isBlank(json)) {
16 //把json转换成List
17 List<Content> list = JsonUtils.jsonToList(json, Content.class);
18 return list;
19 }
20 } catch (Exception e) {
21 e.printStackTrace();
22 }
23 
24 //执行查询
25 List<?> list = xxxMapper.select(id);
26 // 返回结果之前,向缓存中添加数据
27 try {
28 // 为了规范key可以使用hash
29 // 定义一个保存内容的key,hash中每个项就是cid
30 // value是list,需要把list转换成json数据。
31 jedisClient.hset(REDIS_CONTENT_KEY, id + "", JsonUtils.objectToJson(list));
32 } catch (Exception e) {
33 e.printStackTrace();
34 }
35 return list;
36 }

 

那么service就好了,集群版的也通用

那么集群的配置如何呢?

放开注释

使用资源文件的配置

 

好了,启动一下就可以运行了

配置好Test或者controller都可以调用

但是要做好缓存同步,也就是在增加,修改,删除数据后,要同步缓存,把原有的del,在放入新的

这样就可以了`~

 

相关文章
|
1月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
107 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
6月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
608 4
|
7月前
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
285 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
3月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
422 2
|
5月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
205 32
|
3月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
300 0
|
10月前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1536 160
|
8月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
418 30
|
7月前
|
NoSQL Java API
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
1718 0
|
7月前
|
NoSQL Java Redis
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 安装
本教程介绍在 VMware 虚拟机(CentOS 7)或阿里云服务器中安装 Redis 的过程,包括安装 gcc 编译环境、下载 Redis(官网或 wget)、解压安装、修改配置文件(如 bind、daemonize、requirepass 等设置)、启动 Redis 服务及测试客户端连接。通过 set 和 get 命令验证安装是否成功。适用于初学者快速上手 Redis 部署。
165 0