Redis问题汇总

HypeLogLog :
HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:
• 基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
• 估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合
理的范围之内。
HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定
的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基
数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以
HyperLogLog 不能像集合那样,返回输入的各个元素。
多个HypeLogLog可以合并
PFADD key value1, value2 … 放入值
PFCOUNT key --计数
PFMERGE destkey sourcekey1 sourcekey12…
Geo:地理位置。3.2版本之后支持 http://www.cnblogs.com/simibaba/p/7090350.html

 1. 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
	 	GEOADD key longitude latitude member [longitude latitude member ...]
 2. 返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:
    m 表示单位为米。
    km 表示单位为千米。
    mi 表示单位为英里。
    ft 表示单位为英尺。
    	GEODIST key member1 member2 [unit]
 3. 从key里返回所有给定位置元素的位置(经度和纬度)。
		GEOPOS key member [member ...]
 4. 返回一个或多个位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash

   		GEOHASH
    	GEOPOS
    	GEORADIUS
    	GEORADIUSBYMEMBER

Pub/Sub:发布订阅模式
RedisModule:
BloomFilter
RedisSearch
Redis-ML
分布式锁:是指在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问。

获取大量key :单线程
scan :分批次取key值,防止造成keys 的阻塞情况,可能会有重复,目前测试的从0开始依次取好像没有重复,但是从中间值开始取会有少量的重复。

 Jedis jedis = new Jedis();
        String key = "key";
        for(int i =0; i< 100000; i++) {
        	jedis.set(key + i, String.valueOf(i));
        }
        ScanParams params = new ScanParams();
        params.match("key*");
        params.count(1000);
        String count = "0";
        int count1 = 0;
        Set keySet = new HashSet();
        do {
        	ScanResult  result = jedis.scan(count,params);
        	count = result.getCursor();
        	count1 += 1000;
//        	System.out.println(result.getCursor());
        	keySet.addAll(result.getResult());
        }  while(!count.equals("0"));
        System.out.println(count1);
        System.out.println(keySet.size());

Redis做异步队列:

大量key 同时过期:
定时删除:在设置键的过期时间的时候创建一个定时器,当过期时间到的时候立马执行删除操作。不过这种处理方式是即时的,不管这个时间内有多少过期键,不管服务器现在的运行状况,都会立马执行,所以对CPU不是很友好。
惰性删除:惰性删除策略不会在键过期的时候立马删除,而是当外部指令获取这个键的时候才会主动删除。处理过程为:接收get执行、判断是否过期(这里按过期判断)、执行删除操作、返回nil(空)。
定期删除:定期删除是设置一个时间间隔,每个时间段都会检测是否有过期键,如果有执行删除操作。这个概念应该很好理解
持久化:

aof文件过大:Bgrewriteaof
RBD 快照的方式持久化
AOF always 的方式可以保证不丢失,但是会影响性能,建议一秒一次 everysec

PipeLine 好处,为什么要用:redis 单线程,下一次请求必须等待上一次请求执行完成后才能继续执行。然而使用Pipeline模式,客户端可以一次性的发送多个命令,无需等待服务端返回。这样就大大的减少了网络往返时间,提高了系统性能。

 		Jedis jedis = new Jedis();
        String key = "key";
        Pipeline pp = jedis.pipelined();
        long start  = System.currentTimeMillis();
        for(int i =0; i< 100000; i++) {
        	jedis.set(key + i, String.valueOf(i));
        }
        pp.sync();
        System.out.println(System.currentTimeMillis() - start);
Jedis jedis = new Jedis();
        String key = "key";
        Pipeline pp = jedis.pipelined();
        long start  = System.currentTimeMillis();
        for(int i =0; i< 100000; i++) {
        	pp.set(key + i, String.valueOf(i));
        }
        pp.sync();
        System.out.println(System.currentTimeMillis() - start);

Redis集群原理:

你可能感兴趣的:(Redis)