redis经典使用场景的简易实现(java)

参考文章:

干货–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

需要精确设定过期时间的应用&计数器应用

之前写过一篇相关文章

redis实现一个“每日从1开始的序列”

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(发布/订阅)

挺复杂的样子,以后单独写一篇文章吧。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值