发布时间: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)
鹰眼中控系统客户端官方版 v2.0
28.5M
FTP Rush(高性能 FTP 客户端) v2.2.0 绿色版
4.7M
江苏省自然人税收管理系统扣缴客户端 v3.1.048 官方版
103.52M
炫云客户端下载
52.9M
联想企业网盘客户端(网盘数据存储软件) v5.2.2.20 官方版
127M
windows server 2016(服务器操作系统)中文版
5.18G
客户达开店管家下载
40.2MB
RenameZ(文件批量重命名工具)1.1.2 正式版
60.4M
centos(linux操作系统) 6.4 最新版
3.85GB
excel批量搜索工具下载
44.1M
七彩色图片批量处理工具下载
4.06MB
依云CAD批量打图精灵下载
23.59MB
图片批量裁剪器下载
4.61MB
天图视频批量下载工具(视频下载软件) v66.0.0.0 官方版
4.0M
文件内容批量替换工具绿色版 v1.0
15K
activesync(电脑数据同步工具)v6.1 中文版
22.72MB
repking(魔兽争霸录像软件)V1.1 中文版
1.8MB
unlocker(密码解锁工具) v3.0.3.4 中文版
32.1M
vc2005(动态链接库)V0.3.2 中文版
6.63MB
winkawaks模拟器(街机游戏模拟器) V1.62 中文版
2M
2020-03-29
什么是EFI(可扩展固件接口)
万全慧眼Ⅲ高级版为何配的是专业版的光盘?
Lenovo 天逸F41最大可以支持的内存容量
AD1986声卡在Windows Vista下如何设置5.1声道输出
联想天逸100/天逸200笔记本内置摄像头使用问题
您的游戏环境异常,请重启机器后再试(警告码0.5.540)
如何下载USB转RJ45的设备驱动
希捷(Seagate)硬盘官方检测工具 - SeaTools
Win8系统摄像头显示有波纹