一 Java客户端Jedis
Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。
SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache。关于RedisTemplate的使用我们可以看我以前的博文:十次方——Redis、SpringCache
具体的API我们不介绍了,我们来看看Jedis直连和Jedis连接池。
Jedis直连
Jedis连接池
两个方案的比较
二. 慢查询
客户端请求到一个redis的完整的生命周期
其中有两点说明:
- 慢查询发生在第三阶段
- 客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素
慢查询是一个先进先出的队列,假如一条命令它在第三步的时候被列为慢查询,它就会进入一个队列(其实就是redis的列表来实现的),且这个队列是固定长度的,且保存在内存中。
慢查询有两个配置:
- slowlog-max-len:设置队列的长度的,当队列满了,就会掉到最开始的数据
- slowlog-log-slower-than:设置慢查询的阈值(微秒),但此值为0时,记录所有命令
慢查询的配置方法:
慢查询命令:
运维经验:
三 pipeline
批量网络命令通信模型:
使用pipeline:
两者之间的对比:
其中有两点注意的是:
- Redis的命令时间是微秒级别
- pipeline每次条数要控制(网络)
M操作与pipe操作的区别如下图:
将pipeline命令进行拆分,是非原子操作,单返回还是按顺序的
三 发布订阅
我们的角色有:发布者(publisher),订阅者(subscriber),频道(channel),
模型图如下:
使用场景:如我们需要将这三个订阅者的本地缓存全部清除
还有一个消息队列模式,该模式中发布者发布的一个消息只有一个订阅者能拿到
使用场景:三个人抢一个红包
四 bitmap
我们先来看下字符串big的二进制
我们打开客户端做下测试:
我们取第一位为0,第二位为1,和上面的二进制是一样的
也就是说,我们可以对直接对字符串的位进行操作
我们下面来看下用bitmap来实现独立用户统计的功能
假设我们有这个网站有一亿个用户,每天的独立访问量是五千万,我们分别使用set和Bitmap来存储userid如下:
是不是Bitmap在什么情况下都比set好,还是要分情况的