redis 基礎認識
Redis是一個key-value存儲系統。它是遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫。
Redis支持數據持久化可以吧內存中的數據存儲到硬盤中,下次啓動在加載使用,它可以支持簡單的數據類型同樣也支持 list、set、zset、hash 等數據存儲,還支持數據備份 master-slave(主從模式)。
優勢:豐富數據類型、豐富特性、 原子性(操作都是原子性的,意思是要麼成功,要麼失敗)、性能高、
入/var/run/redis.pid,通過pidfile指定
默認監聽端口 : 6379
String : set get (二進制安全)
Hash : hset hget (鍵值對集合,即編程語言中的Map類型)
List : lpush lrange (鏈表(雙向鏈表))
Set : sadd smembers (哈希表實現,元素不重複)
Zset : zset zrangebyscore (將Set中的元素增加一個權重參數score,元素按score有序排列)
ping 測試redis是否啓動
遠程連接redis 數據庫: -h 127.0.0.1 -p 6379 -a "mypass"
springboot redis MySQL
- 關於spring-redis
- 關於redis的key設計
- redis的基本數據結構
- 介紹redis與springboot的整合
- sringboot中的redistemplate的使用
- github 地址
1. 連接池自動管理,提供了一個高度封裝的“RedisTemplate”類
2. 針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝爲operation接口
ValueOperations:簡單K-V操作
SetOperations:set類型數據操作
ZSetOperations:zset類型數據操作
HashOperations:針對map類型的數據操作
ListOperations:針對list類型的數據操作
springboot整合redis
啥也不說上代碼通過maven 來管理jar
pom.xml文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.40</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- <exclusions>去掉springboot默認配置
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions> -->
</dependency>
<!-- <dependency> 引入log4j2依賴
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency> -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.3</version>
</dependency>
<!-- MyBatis 分頁插件 PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
boot 的配置文件 application.prooerties 配置文件
#\u7AEF\u53E3
server.port=9999
#JDBC
spring.datasource.url=jdbc:mysql://localhost:3306/tms?characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#\u4E0B\u9762\u914D\u7F6E\u8BF4\u660E\u8BF7\u53C2\u8003Druid Github Wiki\uFF0C\u914D\u7F6E_StatViewServlet\u914D\u7F6E
#spring.datasource.druid.StatViewServlet.loginUsername=druid
#spring.datasource.druid.StatViewServlet.loginPassword=druid
#mybatis
mybatis.type-aliases-package=com.sk.entity
mybatis.mapper-locations=classpath:mapper/*.xml
#mappers \u591A\u4E2A\u63A5\u53E3\u65F6\u9017\u53F7\u9694\u5F00
#mapper.mappers=tk.mybatis.mapper.common.Mapper
mapper.mappers=com.sk.utils.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
mybatis.configuration.mapUnderscoreToCamelCase=true
#pagehelper
pagehelper.helperDialect=mysql
#pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.autoDialect=true
pagehelper.closeConn=false
pagehelper.reasonable=true
#audience.clientId=098f6bcd4621d373cade4e832627b4f6
#audience.base64Secret=MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY=
#audience.name=restapiuser
#audience.expiresSecond=172800
## Redis \u914D\u7F6E
## Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09
spring.redis.database=0
## Redis\u670D\u52A1\u5668\u5730\u5740
spring.redis.host=127.0.0.1
## Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
spring.redis.port=6379
## Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
spring.redis.password=123456
## \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.jedis.pool.max-active=8
## \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.jedis.pool.max-wait=-1
## \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
spring.redis.jedis.pool.max-idle=8
## \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
spring.redis.jedis.pool.min-idle=0
## \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
spring.redis.timeout=5000
上面都上常規的配置文件 下面就是代碼實現啦啦啦
Controller層
public ResponseEntity<JsonResult> getUserById (@PathVariable(value = "id") Integer id) {
log.info("根據ID獲取用戶信息");
JsonResult r = null;
try {
User user = userService.getUserById(id);
r = new JsonResult(user, "ok");
} catch (Exception e) {
r = new JsonResult(e.getClass().getName() + ":" + e.getMessage());
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
UserService
User getUserById(Integer id);
UserServiceImpl
實現驗證緩存中是否存在數據,如果存在直接返回,不存在去數據庫中查詢同時放入緩存中和返回前端;
package com.sk.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import com.sk.entity.User;
import com.sk.mapper.UserMapper;
import com.sk.service.UserService;
/**
* 2019年3月12日 上午11:18:07
* @HXing xu
* sk-redis
*
**/
@Service
public class UserServiceImpl implements UserService {
private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private UserMapper userDao;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public User getUserById(Integer id) {
// TODO Auto-generated method stub\
// 從緩存中獲取用戶信息
String key = "user_"+id;
ValueOperations<Object, Object> operations = redisTemplate.opsForValue();
// 緩存存在
boolean hasKey = redisTemplate.hasKey(key);
if (hasKey) {
User user = (User) operations.get(key);
log.info("UserServiceImpl.getUserById() : 從緩存中獲取了用戶 >> " + user.toString());
return user;
}else {
// 從 DB 中獲取城市信息
User user = userDao.getUserById(id);;
// 插入緩存
operations.set(key, user , 30 , TimeUnit.MINUTES);
return user;
}
}
@Override
public List<User> listUser() {
String key = "list_user";
ListOperations<Object, Object> operations = redisTemplate.opsForList();
// 緩存存在
boolean hasKey = redisTemplate.hasKey(key);
if(hasKey) {
Long i = operations.size(key);
List<Object> list = operations.range(key, 0, operations.size(key));
log.info("UserServiceImpl.getUserById() : 從緩存中獲取了用戶 >> " + list.toString());
List<User> u_List = new ArrayList<>();
// 將object 轉爲 實體類
for(Object user : list) {
User us = new User();
us = (User) user;
u_List.add(us);
}
return u_List;
}else {
List<User> list = userDao.selectAll();
for(User user : list) {
operations.leftPush(key, user);
}
return list;
}
}
@Override
public User getUserByName(String name) {
// TODO Auto-generated method stub
return userDao.getUserByName(name);
}
@Override
public long delUserById(Integer id) {
Long l = userDao.delUserById(id);
//如果緩存存在,刪除緩存
String key = "user_" +id;
boolean haskey = redisTemplate.hasKey(key);
if(haskey) {
redisTemplate.delete(key);
}
return 1;
}
}
現在基本上可以測試了
這是測試結果 第一次查詢的數據庫 ,第二次查詢的緩存
數據現在已經放到緩存中,
最後所有的代碼都被上傳到我的github喜歡的話,給個start