redis–NoSQL–非关系型的数据库
随着互联网web2.0网站的兴起(现在的app可以认为是其延续),尤其是 SNS类型 的网站(app),对数据库提出新的需求:
- 高并发读写
- 海量数据的高效率存储和访问
- 数据库的高可扩展性和高可用性
用户量、访问量、数据量与日俱增,数据库可以通过添加更多硬件服务器来扩展性能和支持负载。 - 灵活的数据模型
互联网产品往往要快速迭代、升级,及时捕捉用户的需求,实现功能。那么就会经常改动数据模型。
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
应用场景:
- 集群时实现session共享
- 热点数据的缓存
- 计数器
- 排行榜
- 好友相互关系
- 消息队列
- 分布式锁
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;
}
}
}