一  Java客户端Jedis

Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。
SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache。关于RedisTemplate的使用我们可以看我以前的博文:十次方——Redis、SpringCache

具体的API我们不介绍了,我们来看看Jedis直连和Jedis连接池。

Jedis直连

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis

Jedis连接池

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_02

两个方案的比较

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_03

 

二.  慢查询

客户端请求到一个redis的完整的生命周期

jedis和redistemplate 效率测试 jedis和redistemplate区别_慢查询_04

其中有两点说明:

  1. 慢查询发生在第三阶段
  2. 客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素

慢查询是一个先进先出的队列,假如一条命令它在第三步的时候被列为慢查询,它就会进入一个队列(其实就是redis的列表来实现的),且这个队列是固定长度的,且保存在内存中。

慢查询有两个配置:

  • slowlog-max-len:设置队列的长度的,当队列满了,就会掉到最开始的数据
  • slowlog-log-slower-than:设置慢查询的阈值(微秒),但此值为0时,记录所有命令

慢查询的配置方法:

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_05

慢查询命令:

jedis和redistemplate 效率测试 jedis和redistemplate区别_慢查询_06

运维经验:

jedis和redistemplate 效率测试 jedis和redistemplate区别_客户端_07

 

三  pipeline

批量网络命令通信模型:

jedis和redistemplate 效率测试 jedis和redistemplate区别_慢查询_08

使用pipeline:

jedis和redistemplate 效率测试 jedis和redistemplate区别_慢查询_09

两者之间的对比:

jedis和redistemplate 效率测试 jedis和redistemplate区别_客户端_10

其中有两点注意的是:

  1. Redis的命令时间是微秒级别
  2. pipeline每次条数要控制(网络)

 

M操作与pipe操作的区别如下图:

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_11

jedis和redistemplate 效率测试 jedis和redistemplate区别_客户端_12

将pipeline命令进行拆分,是非原子操作,单返回还是按顺序的

 

三  发布订阅

我们的角色有:发布者(publisher),订阅者(subscriber),频道(channel),

模型图如下:

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_13

使用场景:如我们需要将这三个订阅者的本地缓存全部清除

 

还有一个消息队列模式,该模式中发布者发布的一个消息只有一个订阅者能拿到

jedis和redistemplate 效率测试 jedis和redistemplate区别_慢查询_14

 

使用场景:三个人抢一个红包

 

四  bitmap

我们先来看下字符串big的二进制

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_15

我们打开客户端做下测试:

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_16

我们取第一位为0,第二位为1,和上面的二进制是一样的

也就是说,我们可以对直接对字符串的位进行操作

jedis和redistemplate 效率测试 jedis和redistemplate区别_Redis_17

我们下面来看下用bitmap来实现独立用户统计的功能

假设我们有这个网站有一亿个用户,每天的独立访问量是五千万,我们分别使用set和Bitmap来存储userid如下:

jedis和redistemplate 效率测试 jedis和redistemplate区别_慢查询_18

是不是Bitmap在什么情况下都比set好,还是要分情况的