Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
对于数据,我们应该有如下要求
1,要有失效时间,既然是最近浏览记录,那么就要有一个有效期,不存在我一年没有登录账号了再显示去年我看过记录
2,有个数限制,不能无限制存放,比如可以限定只存十条记录
3,有模块划分,例如商城,我手机浏览记录和饮料浏览记录是两回事,PC和手机也可能不是一回事
4,要有顺序,那个是先看的,那个是后浏览的
5,浏览同一个属性,不重复存储
6,要考虑分页情况,因为我们不知道需求到底有多变态
基于上述分析
1,设置值以后要手动调整Key的有效期
2和4,考虑使用List存储,且要修剪List长度
3,通过Key的不同来区分存储
5,要先移除相等,然后再存储
6,Redis的List是支持分页读取的
基于上述,编写如下测试用例代码演示功能:
public void testList2(){ String pcKey = "product:pc:list"; // 从左放数据 redisTemplate.opsForList().leftPush(pcKey, "1"); redisTemplate.opsForList().leftPush(pcKey, "2"); redisTemplate.opsForList().leftPush(pcKey, "3"); redisTemplate.opsForList().leftPush(pcKey, "4"); redisTemplate.opsForList().leftPush(pcKey, "5"); // 移除元素 3 ,因为可能原来有 redisTemplate.opsForList().remove(pcKey, 0, "3"); // 重新添加元素 3,这时 3 会在最前面 redisTemplate.opsForList().leftPush(pcKey, "3"); // 修剪,保留4个 redisTemplate.opsForList().trim(pcKey, 0, 3); // 时间有效期为一个月 redisTemplate.expire(pcKey, 30, TimeUnit.DAYS); //查询列表长度 System.out.println("集合长度:" + redisTemplate.opsForList().size(pcKey)); // 获取所有,可以指定参数进行分页 List<String> relist = (List<String>) redisTemplate.opsForList().range(pcKey, 0, -1); System.out.println(JSON.toJSONString(relist, true)); }
看下数据
END