redis实战系列4--使用redis+springboot构建社交app后台(2)

说明:

这一篇来讲解如何构建用户及发布动态,至于表中要存储什么信息可以自己定义

1构建用户
主要思路:要用到前面说的分布式锁,以防止同一时间反复的创建,代码:

public long createUser(String token,String name) throws InterruptedException {
    token=token.toLowerCase();
    HashOperations<String,String,String>hashOperations=template.opsForHash();
    String lock=lockUtil.acquire_lock_with_timeou("user:"+token,1,10);
    if(lock==null){
        return -1;//如果没获得锁成功,说明不止一处在创建该用户
    }
    if(hashOperations.get("users:",token)!=null){
        return -1;//如果users:表里已经有了该用户,就返回
    }
    long id=template.opsForValue().increment("user:id:");//
    //这一步目的是获取用户专属的Id,因为user:id:一直在自增,并且用到了分布式//锁,所以不会造成重复现象的出现
    template.setEnableTransactionSupport(true);//开启事物
    template.multi();
    hashOperations.put("users:",token,String.valueOf(id));//加入user表中
    Map<String,String> values = new HashMap<String,String>();
    values.put("login", token);
    values.put("id", String.valueOf(id));
    values.put("name", name);
    values.put("followers", "0");
    values.put("following", "0");
    values.put("posts", "0");
    values.put("signup", String.valueOf(System.currentTimeMillis()));
    hashOperations.putAll("user:"+id,values);//创建User:id表,存储用户的单人信息
    template.exec();
    lockUtil.release_lock("user:"+token,lock);//最后一定要记得释放锁
    return id;
}

2发布动态:


```java
public static long create_status(RedisTemplate template,long uid, String message, Map<String,String>data){
    //让status:id自增一,获取用户login和id,然后添加data以及让用户的Posts自增1
    template.setEnableTransactionSupport(true);
    template.multi();
    template.opsForHash().get("user:"+uid,"login");
    //先获取user:id表里的login,用于后面的存储,当然也可以不存这个,无关紧要
    template.opsForValue().increment("status:id:");
    //获取动态的专属id,和上面的Userid类似原理
    List<Object> result=template.exec();
    String login=(String)result.get(0);
    long id= (long) result.get(1);
    if(login==null)return -1;
    if(data==null)data=new HashMap<String,String>();
    data.put("message", message);
    data.put("posted", String.valueOf(System.currentTimeMillis()));
    data.put("id", String.valueOf(id));
    data.put("uid", String.valueOf(uid));
    data.put("login", login);
    template.multi();//开启事物
    template.opsForHash().putAll("status:"+id,data);
    //创建status:id表,存储动态的消息
    template.opsForHash().increment("user:"+uid,"posts",1);
    //让user:id表中的Posts键加1
    template.exec();
    return id;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值