需要在Linux上安装redis,详情见下方连接
https://www.cnblogs.com/zdd-java/p/10288734.html
安装过程中可能出现一些问题,详情见下方连接
https://www.cnblogs.com/liu2-/p/6914159.html
CentOS-6.7-x86_64-bin-DVD1.iso安装见下方连接
https://blog.csdn.net/weixin_42779370/article/details/104156523
CentOS 7安装教程(图文详解)见下方连接
第19步有点问题安装出来的都是字符界面的
想要安装图形化界面可以选择Server GUI
https://blog.csdn.net/qq_44714603/article/details/88829423
测试的时候需要关闭Linux的防火墙,centos6和centos7的命令有点儿不同
或者把端口添加到防火墙里面
pom文件
<groupId>com.imooc</groupId>
<artifactId>miaosha</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
<name>miaosha_2</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
</project>
application.properties中代码
#thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
spring.thymeleaf.content-type=text/html
spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML5
# mybatis
mybatis.type-aliases-package=com.imooc.miaosha.domain//说白了就是实体对象,与数据库关联的对象
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=3000
mybatis.mapperLocations = classpath:com/imooc/miaosha/dao/*.xml
# druid
spring.datasource.url=jdbc:mysql://192.168.220.128:3306/miaosha?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&
**serverTimezone=UTC**
//数据库对应的表,需要注意一下时区的问题,//这些东西都是你自己的,注意修改
spring.datasource.username=root
spring.datasource.password=root//这些东西都是你自己的,注意修改
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.filters=stat
spring.datasource.maxActive=2
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20
#redis
redis.host=192.168.220.128
//这些东西都是你自己的,注意修改
redis.port=6379
redis.timeout=3
redis.password=123456
redis.poolMaxTotal=10
redis.poolMaxIdle=10
redis.poolMaxWait=3
在数据库中创建一个user表,就id和name俩个属性,是为了进行测试一下的
create table `user`
(
id int(11) not null comment '用户id',
name varchar(100),
primary key (id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='用户表';
domain中代码User.java
public class User {
private int id;
private String name;
get和set方法
}
Dao层UserDao代码
@Mapper
public interface UserDao {
@Select("select * from user where id = #{id}")
public User getById(@Param("id")int id );
@Insert("insert into user(id, name)values(#{id}, #{name})")
public int insert(User user);
}
service中UserService代码
@Service
public class UserService {
@Autowired
UserDao userDao;
public User getById(int id) {
return userDao.getById(id);
}
//事务
@Transactional
public boolean tx() {
User u1= new User();
u1.setId(2);
u1.setName("2222");
userDao.insert(u1);
User u2= new User();
u2.setId(1);
u2.setName("11111");
userDao.insert(u2);
return true;
}
}
controller中代码SampleController.java
该controller是来做测试的
@Controller
@RequestMapping("/demo")
public class SampleController {
@Autowired
UserService userService;
@Autowired
RedisService redisService;
@RequestMapping("/hello")
@ResponseBody
public Result<String> home() {
return Result.success("Hello,world");
}
@RequestMapping("/helloError")
@ResponseBody
public Result<String> error() {
return Result.error(CodeMsg.SERVER_ERROR);
}
@RequestMapping("/themaleaf")
public String themaleaf(Model model) {
model.addAttribute("name", "lengleng");
return "hello";
}
@RequestMapping("/db/get")
@ResponseBody
public Result<User> dbGet() {
User user = userService.getById(1);
return Result.success(user);
}
@RequestMapping("/db/tx")
@ResponseBody
public Result<Boolean> dbTx() {
userService.tx();
return Result.success(true);
}
@RequestMapping("/redis/get")
@ResponseBody
public Result<User> redisGet() {
//redisService.get(String, Class<T> clazz);假设key是String类型的,value是T类型的
User user = redisService.get(UserKey.getById, ""+1, User.class);
return Result.success(user);
}
@RequestMapping("/redis/set")
@ResponseBody
public Result<Boolean> redisSet() {
User user = new User();
user.setId(1);
user.setName("1111");
redisService.set(UserKey.getById, ""+1, user);//UserKey:id1
return Result.success(true);
}
}
@RequestMapping("/redis/get1")
@ResponseBody
public Result<String> redisGet1() {
String v1 = redisService.get1("key1", String.class);
return Result.success(v1);
}
@RequestMapping("/redis/set1")
@ResponseBody
public Result<String> redisSet1() {
Boolean res = redisService.set1("key2", "lengleng");
String str = redisService.get1("key2",String.class);
return Result.success(str);
}
对通用缓存Key的封装
实现类>>抽象类>>接口(模板模式)
>>BasePrefix >>KeyPrefix
redis配置的KeyPrefix.java
public interface KeyPrefix {
public int expireSeconds();//过期时间
public String getPrefix();//前缀
}
redis配置的BasePrefix.java
public abstract class BasePrefix implements KeyPrefix{
private int expireSeconds;//过期时间
private String prefix;//前缀
public BasePrefix(String prefix) {//0代表永不过期
this(0, prefix);
}
public BasePrefix( int expireSeconds, String prefix) {
this.expireSeconds = expireSeconds;
this.prefix = prefix;
}
public int expireSeconds() {//默认0代表永不过期
return expireSeconds;
}
//通过类名拼接上prefix,达到不同模块的名字不一样
public String getPrefix() {
String className = getClass().getSimpleName();
return className+":" + prefix;
}
}
订单模块的Key
redis配置的OrderKey.java
public class OrderKey extends BasePrefix {
public OrderKey(int expireSeconds, String prefix) {
super(expireSeconds, prefix);
}
}
redis配置的RedisConfig.java
把在application.properties的配置加载进来
@Component
//组件
@ConfigurationProperties(prefix="redis")
//让SpringBoot读取到
public class RedisConfig {
private String host;
private int port;
private int timeout;//秒
private String password;
private int poolMaxTotal;
private int poolMaxIdle;
private int poolMaxWait;//秒
get和set方法
}
redis配置的RedisPoolFactory.java
把JedisPool加载到Spring容器中
@Service
public class RedisPoolFactory {
@Autowired
RedisConfig redisConfig;
@Bean
public JedisPool JedisPoolFactory() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);//毫秒转化位秒
JedisPool jp = new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),
redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);//毫秒转化位秒
return jp;
}
}
redis配置中的RedisService.java
通过该service来提供redis的服务,使用jedis来完成,jedis是通过JedisPool生成的
@Service
public class RedisService {
@Autowired
JedisPool jedisPool;
/**
* 获取当个对象
* */
public <T> T get(KeyPrefix prefix, String key, Class<T> clazz) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();//返回的就是jedis
//生成真正的key
String realKey = prefix.getPrefix() + key;
String str = jedis.get(realKey);
T t = stringToBean(str, clazz);//把String类型的key转化为T类型
return t;
}finally {
returnToPool(jedis);//释放资源,返回到pool里面
}
}
/**
* 设置对象
* */
public <T> boolean set(KeyPrefix prefix, String key, T value) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String str = beanToString(value);
if(str == null || str.length() <= 0) {
return false;
}
//生成真正的key
String realKey = prefix.getPrefix() + key;
int seconds = prefix.expireSeconds();
if(seconds <= 0) {
jedis.set(realKey, str);
}else {
jedis.setex(realKey, seconds, str);
}
return true;
}finally {
returnToPool(jedis);
}
}
/**
* 判断key是否存在
* */
public <T> boolean exists(KeyPrefix prefix, String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
//生成真正的key
String realKey = prefix.getPrefix() + key;
return jedis.exists(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* 增加值
* */
public <T> Long incr(KeyPrefix prefix, String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
//生成真正的key
String realKey = prefix.getPrefix() + key;
return jedis.incr(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* 减少值
* */
public <T> Long decr(KeyPrefix prefix, String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
//生成真正的key
String realKey = prefix.getPrefix() + key;
return jedis.decr(realKey);
}finally {
returnToPool(jedis);
}
}
private <T> String beanToString(T value) {
if(value == null) {
return null;
}
Class<?> clazz = value.getClass();
if(clazz == int.class || clazz == Integer.class) {
return ""+value;
}else if(clazz == String.class) {
return (String)value;
}else if(clazz == long.class || clazz == Long.class) {
return ""+value;
}else {
return JSON.toJSONString(value);//将对象转化为json字符串
}
}
@SuppressWarnings("unchecked")
private <T> T stringToBean(String str, Class<T> clazz) {
if(str == null || str.length() <= 0 || clazz == null) {
return null;
}
if(clazz == int.class || clazz == Integer.class) {
return (T)Integer.valueOf(str);
}else if(clazz == String.class) {
return (T)str;
}else if(clazz == long.class || clazz == Long.class) {
return (T)Long.valueOf(str);
}else {
return JSON.toJavaObject(JSON.parseObject(str), clazz);
}
}
private void returnToPool(Jedis jedis) {
if(jedis != null) {
jedis.close();
}
}
}
redis配置中的UserKey.java
public class UserKey extends BasePrefix{
private UserKey(String prefix) {
super(prefix);
}
public static UserKey getById = new UserKey("id");
public static UserKey getByName = new UserKey("name");
}
result中的CodeMsg .java和Result.java不做过多赘述