Redis学习笔记

/ Redis / 没有评论 / 2620浏览

慢查询(slowlog)

#配置项
#慢查询时间阈值:默认1000000微秒(1秒);
#设置值应该根据设计的并发来计算得出,例如:
slowlog-log-slower-than = 10000
#慢查询队列长度默认值128;通常设置为1000;
slowlog-max-len = 128

#查询慢查询队列
slowlog get [n]
#获取慢查询队列长度
slowlog length
#清空慢查询列表
slowlog reset

流水线(pipeline)

 一次网络时间 + N次命令执行时间
	@Test
	public void testPipeline(){
		Jedis jedis = new Jedis("126.217.63.103");
		jedis.auth("cc");
		long t1 = System.currentTimeMillis();
		for(int i = 0;i<10000;i++){
			jedis.hset("hashkey:"+i,"field:"+i, "value:"+i);
		}
		long t2 = System.currentTimeMillis();
		System.out.println((t2-t1)/1000);
		jedis.close();
	}
	//实测消耗时长:331秒

使用Pipeline后:

	@Test
	public void testPipeline_(){
		Jedis jedis = new Jedis("126.217.63.103");
		jedis.auth("cc");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < 100; i++) {
			Pipeline pipeline = jedis.pipelined();
			for (int j = i*100; j < (i+1)*100; j++) {
				pipeline.hset("hashkey:"+j,"field:"+j, "value:"+j);
			}
			pipeline.syncAndReturnAll();
		}
		
		long t2 = System.currentTimeMillis();
		System.out.println("消耗时间(秒):"+(t2-t1)/1000);
		jedis.close();
	}
	//实测 2秒;提升真是巨大。 

发布订阅

发布订阅模式

生产者生产一条消息;所有订阅者均会收到消息;相关命令不在详述。用jedis和命令行同时做实验来测试redis-cli 1 发布消息;jedis和redis-cli 2 接收消息。

消息队列模式

Redis本身没有提供这种功能。

Bitmap(位图)

    getbit key offset 可以获取位图对应位数的二进制值;
    setbit key offset value 可以设置位图对应的下标位数的二进制值;
    bitcount key [start end] 获取位图指定范围位置为1的个数,不指定范围则为全部
    bitop op destKey  key [key...]对多个位图进行交集、并集、非、异或操作

HyperLogLog

   pfadd key element 向heyperLogLog添加元素;
   pfcount key [key...] 计算hyperloglog的独立总数;
   pfmerge destkey sourcekey [sourcekey...] 合并多个hyperloglog

缺点:1、有一定的错误率;2、不能取出单条记录;

GEO

用户和经纬度相关的操作;计算距离、计算范围等等

说明:

  1. 、redis 3.2+
  2. 、本质上是使用zset实现的;
  3. 、没有删除API:zrem key member 来删除;

Redis持久化

RDB

将Redis内存中的数据;持久化到硬盘。

触发机制:

  1. save(同步):阻塞!不会额外消耗内存。
  2. bgsave(异步): 异步非阻塞。使用fork() 非常快,本质是阻塞redis。会启动额外的进程,消耗内存。会有临时文件产生。
  3. 自动 (自动,本质异步调用bgsave): 根本一定的时间和改变记录数规则,自动备份。 不容忽视的方式:

AOF

RDB 相对于AOF的缺点:

  1. 耗时、耗xin性能;
  2. 容易丢失数据; AOF基于日志持久化方式。

三种策略:

  1. always :不会丢失数据、IO开销较大
  2. everysec:每秒一次fsync丢一秒数据;
  3. no:不可控;基本不用!

AOF重写:合并同类操作、清除过期数据不放入日志文件中;从而减少日志文件的大小及命令大小;加快持久化速度。

#命令
bgrewriteaof
#配置项
 appendonly yes
 appendfilename "appendonly-${port}.aof"
 appendfsync everysec
 dir /data
 no-appendfsync-on-rewrite yes
 auto-aof-rewrite-min-size  #AOF文件重写需要的尺寸
 auto-aof-rewrite-percentage # AOF文件增长率
#统计项
 aof_current_size #AOF当前尺寸(单位:字节)
 aof_base_size      #AOF上次启动和重写尺寸(单位:字节)

两者比较:

命令RDBAOF
启动优先级
体积
恢复速度
数据安全性丢数据根据策略决定
轻重

选择标准: 需要根据实际场景及机器配置综合考虑!