Bootstrap

redis使用list实现历史记录的存储

redis–NoSQL–非关系型的数据库

随着互联网web2.0网站的兴起(现在的app可以认为是其延续),尤其是 SNS类型 的网站(app),对数据库提出新的需求:

  1. 高并发读写
  2. 海量数据的高效率存储和访问
  3. 数据库的高可扩展性和高可用性
    用户量、访问量、数据量与日俱增,数据库可以通过添加更多硬件服务器来扩展性能和支持负载。
  4. 灵活的数据模型
    互联网产品往往要快速迭代、升级,及时捕捉用户的需求,实现功能。那么就会经常改动数据模型。
    redis
    可以通过key快速查询到其value。一般来说,value可以是任意格式。(Redis包含了其他功能)
    适用场景:session会话信息,用户配置信息,购物车
    总结:
    NoSQL数据库 不是替代 传统关系型数据库,两者是互补的关系
    在各自的领域里,都不可替代,都发挥着巨大作用

redis介绍

Redis,全称:REmote DIctionary Server,即远程字典服务

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

为什么使用redis

一般web应用都需要关系型数据库存储数据,即:一般都需要用到mysql、oracle等

redis的应用场景 与 mysql、oracle不同,性能够用时,不需要使用redis;当高并发,使用mysql、oracle已经达到性能瓶颈时,才需要考虑使用redis

应用场景:

  1. 集群时实现session共享
  2. 热点数据的缓存
  3. 计数器
  4. 排行榜
  5. 好友相互关系
  6. 消息队列
  7. 分布式锁

redis支持多种数据类型

值(value)可以是:
字符串(String)
哈希(Hash)
列表(list)
集合(set)
有序集合(sorted sets)
使用list实现历史记录的存储

 	@RequestMapping("/update")
    @CrossOrigin
    public JsonResult update(@RequestBody User user) {

        JsonResult res = new JsonResult(0, "成功");
        User user3 = changeService.getUserById(user.getUserid());
        User user4 = changeService.getUserById(user.getId());
        User user2 = new User();
        user2.setUserid(user.getId());
        user2.setMoney(user.getMoney());
        if (user.getMoney()>user4.getMoney()){
            res.setCode(200);
            res.setMsg("余额不足");
            res.setData("余额不足,请重新输入转账金额");
            return res;
        }
        changeService.updateMoney(user2);
        changeService.updateAdd(user);
        History history1 = new History();
        history1.setUserid(user.getId());
        history1.setAmount(user.getMoney());

        history1.setOperate("转出到" + user3.getName());
        history1.setTime(new Date());
        redisTemplate.opsForList().rightPush(user.getId() + "_history", history1);
        //使用redisTemplate调用opsForList()方法实现list存储
        changeService.insertHistory(history1);
        History history2 = new History();
        history2.setUserid(user.getUserid());
        history2.setAmount(user.getMoney());

        history2.setOperate(user4.getName() + "转入");
        history2.setTime(new Date());
        redisTemplate.opsForList().rightPush(user.getUserid() + "_history", history2);
        changeService.insertHistory(history2);
        return res;
    }
}
解决mysql由于用户多次访问一个数据库不存在的用户,造成数据库的穿透问题。
我将建一个redis数据库,查询用户时,我先从redis数据库中查,redis数据库中没
有,就去mysql数据库中查,数据库中也没有的话,就返还给redis数据库一个查无
此人的json串。
@RequestMapping("/getbyid/{userid}")
    public JsonResult getUserById(@PathVariable(value = "userid") String userid, HttpServletRequest request) {
        JsonResult res = new JsonResult(0, "成功");

        if ("none".equals(redisTemplate.boundValueOps(userid + "_name").get())) {
            res.setCode(200);
            res.setMsg("查无此人");
            res.setData(redisTemplate.boundValueOps(userid + "_name").get());
            return res;

        } else {
            if (redisTemplate.boundValueOps(userid + "_name").get() == null) {

                if (changeService.getUserById(userid) == null || changeService.getUserById(userid).equals("")) {
                    res.setCode(201);
                    res.setMsg("查无此人");
                    res.setData("none");
                    redisTemplate.boundValueOps(userid + "_name").set("none");
                    redisTemplate.expire(userid + "_name", 60 * 60 * 6, TimeUnit.SECONDS);
                    return res;
                } else {
                    User user = changeService.getUserById(userid);

                    res.setData(user);
                    redisTemplate.boundValueOps(userid + "_name").set(res.getData());
                    return res;
                }

            } else {

                res.setData(redisTemplate.boundValueOps(userid + "_name").get());
                return res;
            }

        }
    }
;