参考《redis实战》
需求
1、根据插入的顺序记录日志,保留10条信息
2、记录每种类型的日志次数,并可以按类型的次数排序
分析
第一个需求
按顺序插入,可以使用队列,以下是队列lpush、ltrim、lrange的用法。
//从左边插入一条数据
local:0>lpush queue 1
"1"
local:0>lpush queue 2
"2"
local:0>lpush queue 3
"3"
local:0>lpush queue 4
"4"
local:0>lpush queue 5
"5"
//保留下表为0到3的元素
local:0>ltrim queue 0 3
"OK"
//取指定范围队列的值
local:0>lrange queue 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
第二个需求
按类型的次数进行排序,可以用有序集合。以下是zincrby、zrevrange的用法。
// 对指定成员递增
local:0>zincrby score: 1 zhangsan
"1"
local:0>zincrby score: 1 zhangsan
"1"
local:0>zincrby score: 1 lisil
"1"
// 返回指定范围的值及分数
local:0>zrevrange score: 0 -1 withscores
1) "zhangsan"
2) "2"
3) "lisil"
4) "1"
实践
在这里我们使用Pipeline,Pipeline方法会自动的创建事务,会自动使用multi和exec包裹起用户的多个命令,能够有效的减少客户端和redis之间的通讯次数,提高性能。
@Test
public void testLog() {
String[] level = {"DEBUG", "INFO", "WARN", "ERROR"};
for (int i = 0; i < 100; i++) {
Pipeline pipeline = JedisUtils.pipeline();
pipeline.lpush("log:", "消息:" + i);
pipeline.ltrim("log:", 0, 10);
pipeline.zincrby("msg:", 1, level[new Random().nextInt(4)]);
pipeline.sync();
}
List<String> queue = JedisUtils.lrange("log:", 0, -1);
System.out.println("当前队列信息:" + queue);
Set<Tuple> tuples = JedisUtils.zrangeWithScores("msg:", 0, -1);
System.out.println("当前消息情况:" + tuples);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。