参考文章:
干货–Redis池化联接和搭建分布式集群
告诉你Redis是一个牛逼货
取最新N个数据
只把最新的N个数据添加到redis中。
主要使用了redis中list的链表特性以及ltrim方法。
package redis;
import java.util.List;
import redis.clients.jedis.Jedis;
/**
* 获取最新的3个数据
* @author Administrator
*
*/
public class TestRedisLastN {
public static Jedis jd = new Jedis("localhost", 6379);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
jd.del("nlist");
lpush("nlist", "a1");
lpush("nlist", "a2");
lpush("nlist", "a3");
lpush("nlist", "a4");
lpush("nlist", "a5");
System.out.println(queryTop100("nlist"));
}
public static void lpush(String key, String value){
jd.lpush(key, value);
jd.ltrim(key, 0, 2);
}
public static List<String> queryTop100(String key){
return jd.lrange(key, 0, 2);
}
}
获取top N
使用了有序集合(zset)的
- zadd
Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set.
- zrevrange:
Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements returned.。
import redis.clients.jedis.Jedis;
public class TestRedisTopN {
public static Jedis jd = new Jedis("localhost", 6379);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
jd.zadd("topn", 1, "m1");
jd.zadd("topn", 2, "m2");
jd.zadd("topn", 11, "m3");
jd.zadd("topn", 12, "m4");
jd.zadd("topn", 14, "m5");
jd.zadd("topn", 15, "m6");
jd.zadd("topn", 151, "m1");
jd.zadd("topn", 66, "m2");
jd.zadd("topn", 3, "m7");
//获取前5名
System.out.println(jd.zrevrange("topn", 0, 4));
}
}
输出
[m1, m2, m6, m5, m4]
一些常见的问题
按两列进行排序
zrange无法像sql中那样,拥有order by col1, col2
这样的语法。但是这类问题的解决方法其实在sql中是早就存在了的。就是将需要排序的多列按照合理的算法组合成能够正确排序的一列。
比如,现在要按年龄、性别进行排序。需要先把年龄补零至三位,在拼接上性别(用1和0表示)。20岁男的结果为0201
,25岁女的结果为0250
。
需要精确设定过期时间的应用&计数器应用
之前写过一篇相关文章
Uniq操作,获取某段时间所有数据去重值
直接使用了set的自动去重功能
- SADD
Time complexity: O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.
import redis.clients.jedis.Jedis;
public class TestRedisUniq {
public static Jedis jd = new Jedis("localhost", 6379);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
jd.sadd("uniqset", "aa");
jd.sadd("uniqset", "a1");
jd.sadd("uniqset", "aa");
jd.sadd("uniqset", "a2");
jd.sadd("uniqset", "aa");
jd.sadd("uniqset", "a2");
System.out.println(jd.smembers("uniqset"));
}
}
输出
[a2, a1, aa]
构建队列系统
redis中的list本身就是一个双向链表,因此可以用rpush与lpop来构建队列。
import redis.clients.jedis.Jedis;
public class TestRedisQueue {
public static Jedis jd = new Jedis("localhost", 6379);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
jd.del("queueList");
jd.rpush("queueList", "1");
jd.rpush("queueList", "2");
jd.lpop("queueList");
System.out.println(jd.lrange("queueList", 0, -1));
}
}
[2]
Pub/Sub(发布/订阅)
挺复杂的样子,以后单独写一篇文章吧。