2020-02-29 22:00:56
关注公众号:CoderBuff,回复“redis”获取《Redis5.x入门教程》完整版PDF。
《Redis5.x入门教程》目录 第一章 · 准备工作 第二章 · 数据类型 第三章 · 命令 第四章 · 配置 第五章 · Java客户端(上) 第六章 · 事务 第七章 · 分布式锁第八章 · Java客户端(下)
有关本章的源码:http://github.com/yu-linfeng/redis5.x_tutorial/tree/master/code/jedis
前面的章节介绍了redis的安装、还有命令配置等内容,我们在实际使用时大部分情况都是利用现成的Java客户端对redis进行操作。当然命令并不是没用,它极有可能在你排查问题时排上用场,因为你有可能会直接连入redis服务端通过命令行来排查是否是redis缓存的问题。
redis的Java客户端最常用的是jedis开源库,本章我们也将围绕jedis的对redis进行一些简单的操作,jedis的GitHub地址:http://github.com/xetorthio/jedis。
package com.coderbuff.jedis.simple;
import redis.clients.jedis.Jedis;
/**
* @author okevin
* @date 2020/2/12 23:08
*/
public class Demo {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
jedis.set("redis-client", "jedis");
System.out.println(jedis.get("redis-client"));
jedis.close();
}
}
这是一个简单的jedis连接示例,使用MySQL的经验告诉我们:类似有socket连接的,我们最好是通过“池化”技术,一是更好的管理我们的连接;二是能更好的利用连接资源。所以当我们在使用jedis时,最好是使用jedis提供的池化技术。
package com.codrbuff.jedis.client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* redis客户端连接
* @author okevin
* @date 2020/2/12 23:17
*/
public class RedisClient {
/**
* redis服务器地址
*/
private static final String HOST = "localhost";
/**
* jedis连接池
*/
private static JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), HOST);
private RedisClient() {
}
/**
* 从jedispool中获取一个jedis连接
* @return jedis连接
*/
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
package com.coderbuff.jedis.util;
import com.codrbuff.jedis.client.RedisClient;
import redis.clients.jedis.Jedis;
/**
* redis工具类
* @author okevin
* @date 2020/2/12 23:13
*/
public class RedisUtil {
//###########字符串(string)数据类型相关操作############
/**
* 字符串写入
* @param key key
* @param value 值
* @return 写入的值
*/
public static String set(String key, String value) {
try (Jedis jedis = RedisClient.getJedis()){
jedis.set(key, value);
return value;
}
}
public static String get(String key) {
try (Jedis jedis = RedisClient.getJedis()) {
return jedis.get(key);
}
}
}
当然我不准备在这里把所有的命令都展示出来,关于SDK的使用大可查看官方文档。
redis中有一个重要的功能——pipeline(管道),我们在操作大量数据时,redis的吞吐量性能可能较低,此时我们可以通过pipeline进行批量操作。这个功能在redis的命令中并没有,但redis是支持的。所以本章将重点介绍pipeline的使用,这在实际应用中非常常用。
pipeline提供了命令的批量提交,当我们有批量查询或者写入操作时,单个命令的“往返时间”是1ms,那么10个命令就会消耗10ms,如果我们使用pipeline批量操作后可以一次性提交10个命令,redis的响应时间将会大大减小。吞吐量也自然提高。
实际上,之所以采用pipeline批量提交主要是为了控制网络开销,10个命令就会有10次网络开销,网络开销对于处于异地机房的影响尤为明显。所以在进行批量操作时,尽量使用pipeline管道操作。下面的例子是1万次字符串类型的写入,反映了非pipeline和pipeline的性能对比。
package com.coderbff.jedis.test;
import com.coderbuff.jedis.util.RedisUtil;
import com.codrbuff.jedis.client.RedisClient;
import org.junit.Test;
import redis.clients.jedis.Pipeline;
/**
* @author okevin
* @date 2020/2/12 23:32
*/
public class JedisTests {
@Test
public void testPipeline() {
long setStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
RedisUtil.set("key_" + i, String.valueOf(i));
}
long setEnd = System.currentTimeMillis();
System.out.println("非pipeline操作10000次字符串数据类型set写入,耗时:" + (setEnd - setStart) + "毫秒");
long pipelineStart = System.currentTimeMillis();
Pipeline pipeline = RedisClient.getJedis().pipelined();
for (int i = 0; i < 10000; i++) {
pipeline.set("key_" + i, String.valueOf(i));
}
pipeline.sync();
long pipelineEnd = System.currentTimeMillis();
System.out.println("pipeline操作10000次字符串数据类型set写入,耗时:" + (pipelineEnd - pipelineStart) + "毫秒");
}
}
控制台输出结果:
非pipeline操作10000次字符串数据类型set写入,耗时:1843毫秒
pipeline操作10000次字符串数据类型set写入,耗时:205毫秒
可以看到,通过pipeline管道批量操作,吞吐量性能大大提到。
重要
使用pipeline有几个值得注意的地方:
它相比较于redis原生的字符串数据类型的批量操作命令,pipeline是非原子性的,mset
是原子性的。mset
批量操作要么都成功要么都失败,而pipeline则不能保证。
mset
只是set
一个命令的批量操作,而pipeline则可以批量发送多个命令,这里就存在事务的问题。
针对问题一,我们在进行批量操作时应尽可能的把批量操作拆分成小粒度的pipeline。
针对问题二,要保证多个命令的事务,就需要使用redis提供的事务相关的命令,但redis中的事务是“假事务”,因为它仍然不能保证原子性。在下一章中,会详细介绍redis原生的简单事务(不保证原子性),以及如何在redis中保证事务的原子性。
关注公众号:CoderBuff,回复“redis”获取《Redis5.x入门教程》完整版PDF。
这是一个能给程序员加buff的公众号 (CoderBuff)
CentOS 7.3 上用 docker 部署 redis 介绍
05-07
Centos 7 Zabbix Agent 客户端源码编译安装配置
02-16
Zabbix 3.x客户端自动注册
04-07
centos 7安装redis及php-redis扩展
05-09
k8s(kubernetes)部署三个节点的redis cluster
05-24
看家宝移动客户端的安装要求、下载以及使用介绍
06-22
操作系统安装光盘不能启动(即不能启动到安装界面)
07-03
EDU 8.0首次部署操作步骤
06-05
Git add commit误操作撤销的方法
06-26
Lenovo G550在Windows XP操作系统下触控板驱动安装方法
07-17
U盘写保护怎么去掉?Win10移除U盘写保护的操作步骤
07-15
Windows Vista操作系统电池指示灯的状态列表
07-08
XP下添加打印机安装打印机驱动时提示:操作无法完成
06-30
ansible批量推送公钥
04-23
saltstack快速批量安装nginx
07-16
万全 T100 1020 第五章 常用操作系统安装指南(IDE SATA)
06-20
万全 T110 1510 第五章 常用操作系统安装(SATA RAID)
07-01
万全T100 1010 第三章 常用操作系统安装指南(IDE)
06-17
万全T168 G3&T468 G3 WinXP操作系统所需要的驱动程序说明
06-16
双显卡切换相关操作指导汇总
07-04
鹰眼中控系统客户端官方版 v2.0
28.5M
下载FTP Rush(高性能 FTP 客户端) v2.2.0 绿色版
4.7M
下载FileZilla Portable( FTP 客户端软件) v3.3.5.0 绿色版
5.1M
下载svn (图形化的Subversion客户端)v14.0.2官方版
14.3M
下载vcredist_x86(支持插件) 2021 正式版
2.6M
下载学科网e课堂畅享版客户端 v2.1.0.9 官方版
116.94M
下载炫云客户端下载
52.9M
下载联想企业网盘客户端下载
127M
下载邮洽邮箱(邮箱管理客户端) v1.6.8.8 免费版
15.8M
下载客户达开店管家(淘宝店铺管理软件) v4.09 破解版
40.2MB
下载PhotoBulkforwin图片批量处理工具绿色版 v1.10
2.75MB
下载centos(linux操作系统) 6.4 最新版
3.85GB
下载excel批量搜索工具下载
44.1M
下载光速文件批量搜索器(本地文件搜索软件) 5.2 破解版
246KB
下载大仙一键搬图软件(图片批量下载搬家工具) v50.0.0.3 破解版
5.7M
下载gghost一键恢复(系统备份还原工具)v10.03.09 中文版
14.5M
下载hwinfo32(系统信息检测工具) v7.05.4490 中文版
10.1M
下载Batch It下载
9.57M
下载BatchPPT下载
754KB
下载Bulk Rename Utility下载
10.3M
下载