Redis(高性能)
用户购物车、某条状态、文章点赞
MongoDB(海量数据)
Elasticsearch/HBase(大数据)
Redis 安装(开发环境、单节点)
可视化管理工具:
Another.Redis.Desktop.Manager.1.2.5.exe(Win)
Another.Redis.Desktop.Manager.1.2.5.dmg(Mac)
Redis安装
1、Linux下安装
2、Windows下:
版本:5.0.x || 下载链接见博客资源
①双击 redis-server,出现以下界面即代表redis正常启动
②使用redis可视化工具
填写地址和端口,其余空着即可
TTL :过期时间,不设置就是不过期
SpringBoot整合Redis
步骤一①:添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
步骤二②:配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/mall?characterEncoding=utf-8&&useSSL=false&&serverTimezone=GMT%2B8
redis:
host: 127.0.0.1
port: 6379
引入gson依赖 序列化
<!-- 也可以用 fastjson 序列化-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
@Service
public class CartServiceImpl implements ICartService {
private final static String CART_REDIS_KEY_TEMPLATE = "cart_%d";
@Autowired
private ProductMapper productMapper;
@Autowired
private StringRedisTemplate redisTemplate;
private Gson gson = new Gson();
@Override
public ResponseVo<CartVo> add(Integer uid, CartAddForm form) {
Integer quantity = 1;
Product product = productMapper.selectByPrimaryKey(form.getProductId());
// 商品是否存在
if (product == null) {
return ResponseVo.error(ResponseEnum.PRODUCT_NOT_EXIST);
}
// 商品是否正常在售
if (!product.getStatus().equals(ProductStatusEnum.ON_SALE.getCode())) {
return ResponseVo.error(ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE);
}
// 商品库存是否充足
if (product.getStock() <= 0) {
return ResponseVo.error(ResponseEnum.PRODUCT_STOCK_ERROR);
}
// 写入到redis
// key: cart_1
redisTemplate.opsForValue().set(String.format(CART_REDIS_KEY_TEMPLATE, uid), // key
gson.toJson(new Cart(product.getId(), quantity, form.getSelected()))); // 用gson将对象转化为String类型 序列化
return null;
}
}
改进 -> Hashmap 提高查询速度(相对列表)
// 写入到redis
// key: cart_1
HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();
opsForHash.put(String.format(CART_REDIS_KEY_TEMPLATE, uid), // key
String.valueOf(product.getId()), // HashMap 的 key
gson.toJson(new Cart(product.getId(), quantity, form.getSelected()))); // 用gson将对象转化为String类型 序列化
Redis key 设置为累加
// 写入到redis
// key: cart_1
HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();
String redisKey = String.format(CART_REDIS_KEY_TEMPLATE, uid);
Cart cart;
String value = opsForHash.get(redisKey, String.valueOf(product.getId()));
if (StringUtils.isEmpty(value)) {
// 没有该商品,新增
cart = new Cart(product.getId(), quantity, form.getSelected());
}else {
// 已经有了,数量 +1
cart = gson.fromJson(value, Cart.class); // 反序列化
cart.setQuantity(cart.getQuantity() + quantity);
}
opsForHash.put(redisKey, // key
String.valueOf(product.getId()), // HashMap 的 key
gson.toJson(cart)); // 用gson将对象转化为String类型 序列化