使用redis作为访问记录存储的构想

用户的访问,以及商品被访问的情况这些数据,大部分都是非结构化的,传统的关系型数据库,对于在部分的存储,是比较棘手的,而NOSQL中redis由于其较多的数据类型和数据操作,可以满足大部分非结构化数据存储和获取操作的要求,下面贴出的代码,是基于本人真实项目中使用到测试用例,供大家参考。


import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.Jedis;

public class RedisTest {
    
    //使用hash来存储各地区用户的访问商品的情况
    
    /**
     * hash自增测试,hash中的key表示商品的编号(如sp1),field表示地区(如region1),用户每访问一次,自增1
     */
    @Test
    public void testHashIncr(){
        Jedis jedis = new Jedis("10.79.32.22", 6379);
        //hash的key组成=最少2个字母+数字;下面是对于36个地区分布的访问数据添加;结果是region1--1(region1地区访问量为1),region2--2……region36--36
        for (int i = 1; i <= 36; i++) {
            for (int j = 0; j < i; j++) {
                jedis.hincrBy("product1", "region"+i,1);
            }
            
        }
        jedis.close();
    }
    
    /**
     * 获取sp1商品各地区访问情况
     */
    @Test
    public void testHashGet(){
        Jedis jedis = new Jedis("10.79.32.22", 6379);
        Map<String, String> regionAll = jedis.hgetAll("product1");
        for(Map.Entry<String, String> entry:regionAll.entrySet()){    
            System.out.println(entry.getKey()+"--->"+entry.getValue());    
       }   
        jedis.close();
    }
    
    //list作为用户访问记录使用
    
    /**
     * 往list中push值,作为用户的
     */
    @Test
    public void testListPush(){
        Jedis jedis = new Jedis("10.79.32.22", 6379);
        for (int i = 0; i < 10; i++) {
            jedis.lpush("user2", "value"+i);
        }
        jedis.close();
    }
    
    /**
     * 获取list值,获取后的顺序是首次push的值靠前(下标值小)
     */
    @Test
    public void testListGet(){
        Jedis jedis = new Jedis("10.79.32.22", 6379);
        List<String> lrange = jedis.lrange("user2", 0, -1);
        int i=0;
        for (String str : lrange) {
            System.out.print(i++);
            System.out.println(":"+str);
        }
        jedis.close();
    }
    
    //set用作商品的访问量存储。按照访问量次序排序
    
    /**
     * 往set中添加10个元素(sp1,sp2……代表10个商品),对应的score分别是(1,2,3…用来表示访问量)
     */
    @Test
    public void testSetIncr(){
        Jedis jedis = new Jedis("10.79.32.22", 6379);
        for (int i = 1; i <= 10; i++) {
            for (int j = 0; j < i; j++) {
                jedis.zincrby("productVisit", 1, "product"+i);
            }
        }
        jedis.close();
    }
    
    
    /**
     *获取访问量前10的商品名称
     */
    @Test
    public void testSetGet(){
        Jedis jedis = new Jedis("10.79.32.22", 6379);
        //这里用zrevrange来倒序排序,效果是按照score值从大到小排序
        Set<String> zrevrange = jedis.zrevrange("productVisit", 0, 9);
        for (String str : zrevrange) {
            System.out.println(str);
        }
        jedis.close();
        
    }
    
    
}       


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值