Redis了解

一、缓存的应用场景

什么是缓存?
在互联网场景下,尤其 2C 端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用 Redis 作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。

Redis 是一个高性能的 key-value 数据库。GitHub 地址:​​https://github.com/antirez/redis​​​ 。Github 是这么描述的:
Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, HyperLogLogs, Bitmaps.

缓存的应用场景有哪些呢?
比如常见的电商场景,根据商品 ID 获取商品信息时,店铺信息和商品详情信息就可以缓存在 Redis,直接从 Redis 获取。减少了去数据库查询的次数。但会出现新的问题,就是如何对缓存进行更新?这就是下面要讲的。

二、更新缓存的策略

参考《缓存更新的套路》​​http://coolshell.cn/articles/17416.html​​,缓存更新的模式有四种:Cache aside, Read through, Write through, Write behind caching。

这里我们使用的是 Cache Aside 策略,从三个维度:(摘自 耗子叔叔博客)
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。

大致流程如下:
获取商品详情举例
a. 从商品 Cache 中获取商品详情,如果存在,则返回获取 Cache 数据返回。
b. 如果不存在,则从商品 DB 中获取。获取成功后,将数据存到 Cache 中。则下次获取商品详情,就可以从 Cache 就可以得到商品详情数据。
c. 从商品 DB 中更新或者删除商品详情成功后,则从缓存中删除对应商品的详情缓存

Redis安装及密码修改

​redis安装及密码修改​​​
​​​redis修改密码(1)与2相互参考​​​
​​​redis修改密码(2)​

项目配置

pom.xml中添加依赖

<dependency> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

application.yml

spring:
profiles:
active:
- dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbperson
username: root
password: 123456
jpa:
hibernate:
ddl-auto: create
hbn2ddl:
auto: update
show-sql: true
redis:
#redis数据库名称 从0到15,默认为db0
database: 1
host: 127.0.0.1
password: 123456
#redis服务器连接端口号
port: 6379
#redis连接池设置
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
timeout: 60000

StringRedisController

@RestController
public class StringRedisController {
protected static Logger logger=LoggerFactory.getLogger(StringRedisController.class);
@Resource
StringRedisTemplate stringRedisTemplate;
@Resource(name="stringRedisTemplate")
ValueOperations<String, String> valOpsStr;

@RequestMapping("set")
public String setkayAndValue(String key,String value) {
logger.info("访问set:key={},value={}",key,value);
valOpsStr.set(key, value);
return "key:"+key+",value:"+value;
}

@RequestMapping("get")
public String getKey(String key) {
logger.info("访问get:key{}",key);
return valOpsStr.get(key);
}
}

运行redis+运行项目

​http://localhost:8088/set?key=123&&value=456​

SpringBoot入门(五)Redis数据缓存_redis

使用示例:

Fruit

public class Fruit implements Serializable
private static final long serialVersonUID=1L;

private Integer id;
private String name;
private Integer price;
public Fruit() {
super();
}

public Fruit(Integer id, String name, Integer price) {
super();
this.id = id;
this.name = name;
this.price = price;
}

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}

FruitDao

@Repository
public class FruitDao {
@Autowired
RedisTemplate<Object, Object> redisTemplate;
@Resource(name="redisTemplate")
ValueOperations<Object,Object> valOps;

public void save(Fruit fruit) {
valOps.set(fruit.getId(), fruit);
}
public Fruit getFruits(Integer id){
return (Fruit) valOps.get(id);
}
}

FruitRedisController

@RestController
public class FruitRedisController
protected static Logger logger=LoggerFactory.getLogger(FruitRedisController.class);

@Autowired
FruitDao fruitDao;
@RequestMapping(value="setFruit")
public void setFruit(Integer id,String name,Integer price) {
logger.info("id={},name={},price={}",id,name,price);
Fruit fruit=new Fruit(id,name,price);
fruitDao.save(fruit);
}

@RequestMapping(value="getFruit")
public Fruit getFruits(Integer id){

return

运行项目,浏览器输入:

​http://localhost:8088/setFruit?id=1&&name=​​苹果&&price=4

​http://localhost:8088/setFruit?id=2&&name=​​香蕉&&price=3

​http://localhost:8088/setFruit?id=3&&name=​​橘子&&price=3

插入数据后进行查询

​http://localhost:8088/getFruit?id=1​

SpringBoot入门(五)Redis数据缓存_数据_02