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

Redis java操作客服端——jedis的更多相关文章

  1. Java 获取客服端ip地址

    Java 获取客服端ip地址 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p& ...

  2. java获取客服端信息(系统,浏览器等)

    String agent = request.getHeader("user-agent"); System.out.println(agent); StringTokenizer ...

  3. Redis java client ==> Jedis

    https://github.com/xetorthio/jedis Jedis is a blazingly small and sane Redis java client. Jedis was ...

  4. 利用java在服务器和客服端建立连接,进行通讯(代码实例)

    客服端代码:有注释 package javanet; import java.io.IOException; import java.io.InputStream; import java.io.Ou ...

  5. java UDP 通信:服务端与客服端

    import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...

  6. TCP服务器端和客服端(一)

    就是一个客服端(Socket)和服务器(ServerSocket)端的链接间.我的理解是一个服务端可以链接多个客服端. 在客服端有输入流outPutStream. 用于发送数据 在服务器端有输出流.i ...

  7. android客服端+eps8266+单片机+路由器之远程控制系统

    用android客服端+eps8266+单片机+路由器做了一个远程控制的系统,因为自己是在实验室里,所以把实验室的门,灯做成了远程控制的. 控制距离有多远------只能说很远很远,只要你手机能上网的 ...

  8. Redis Java连接操作

    安装 要在Java程序中使用使用操作Redis,需要确保有Redis的Java驱动程序和Java设置在机器上.可以检查看Java教程-学习如何在机器上安装Java.现在,让我们来看看如何设置Redis ...

  9. redis java操作

    Redis Java连接操作 连接到Redis服务器 import redis.clients.jedis.Jedis; public class RedisJava { public static ...

随机推荐

  1. [树套树]K大数查询

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少.为了 ...

  2. YTU 2429: C语言习题 学生成绩输入和输出

    2429: C语言习题 学生成绩输入和输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 1897  解决: 812 题目描述 编写一个函数print,打印一个学生的成绩数组,该数组中有 ...

  3. eclipse本地覆盖版本库

    1,右键team,与资源库同步 2,选中冲突文件,右键“更新”,此时本地代码出现冲突 3,选中冲突文件,右键点击“标记为解决”,勾选第二项,以本地版本为准 4,冲突被解决,正常提交本地代码

  4. WCF寄宿到Windows Service[1]

    WCF寄宿到Windows Service 返回 在前面创建一个简单的WCF程序,我们把WCF的服务寄宿到了Host这个控制台项目中了.下面将介绍如何把WCF的服务寄宿到Windows服务中(源代码) ...

  5. maven实战(6)-- pom.xml的编写

    pom.xml中可以编写的东西确实挺多的,经常看到别人写的pom文件中出现了一些没见过plugin或properties等等,不知有何作用,其实很简单,只要参看maven的官方文档即可:http:// ...

  6. table中tr或者td的点击事件

    直接把时间添加到table或者tbody上,只有下面的tr或者td才能促发事件,通过e.target可以获得当前点击tr或者td,这样就可以进行查询或者删除操作了 如果是删除,直接e.target.r ...

  7. [yii2]urlmanger

    首先配置下nginx,确保可以不使用index.php来访问 server{ listen 8082; server_name yii2.dev; access_log logs/yii2.acces ...

  8. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  9. HDU-5551 Huatuo's Medicine

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission( ...

  10. eclipse整合tomcat

    首先确保jdk已经安装好 步骤1 获得服务器运行环境配置,Window/Preferences/Server/Runtime Environmen l步骤2 添加服务器 步骤3 选择服务器在硬盘的地址 ...