前言
隨著技術的發展,程序框架也越來越多,非常考驗程序的學習能力,但是框架的產生在程式設計師開發過程中也提供很多便利,框架可以為程式設計師減少許多工作量,比如spring boot 、mybatis等都可以提高開發人員的工作效率,今天就來聊聊spring boot與redis 的整合。
一、基本概況
為什麼使用緩存
緩存是在內存中存儲的數據備份,當數據沒有發生本質變化時就可以直接從內存中查詢數據,而不用去資料庫查詢(在磁碟中)CPU讀取內存的速度要比讀取磁碟快,可以提高效率Redis緩存
Remote Dictionnary Server(遠程數據服務),是一款內存高速緩存資料庫。五種常用數據類型: String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)可持久化:一邊運行,一邊向硬碟備份一份,防止斷電等偶然情況,導致內存中數據丟失二、搭建Redis環境
1.下載Redis
平臺限制不能貼連結,自行去官網下載哈!
2.設置Redis開機自啟
在解壓好的文件夾下輸入cmd命令
window下安裝Redis服務
redis-server --service-install redis.windows.conf
檢查安裝是否成功
搜索服務
點擊設置為開機自啟
三、新建SpringBoot項目
新建好項目的童鞋可以自動跳過
添加web依賴
選擇資料庫依賴
選擇項目位置,點擊finish
四、使用StringRedisTemplate操作Redis
1.pom.xml文件引入坐標
<!--redis依賴包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2.在appliaction.properties配置redis資料庫連接信息
#redis配置#Redis伺服器地址spring.redis.host=127.0.0.1#Redis伺服器連接埠spring.redis.port=6379#Redis資料庫索引(默認為0)spring.redis.database=0
3.在SpringbootdemoApplicationTests中測試操作Redis
@SpringBootTestclass SpringbootdemoApplicationTests {@Autowired StringRedisTemplate stringRedisTemplate; //操作key-value都是字符串,最常用 @Test public void test01(){ //字符串操作 stringRedisTemplate.opsForValue().append("msg","coder"); //列表操作 stringRedisTemplate.opsForList().leftPush("mylist","1"); stringRedisTemplate.opsForList().leftPush("mylist","2"); }}
對於Redis的五大常用數據類型都提供了方法
String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)stringRedisTemplate.opsForValue();[String(字符串)]stringRedisTemplate.opsForList();[List(列表)]stringRedisTemplate.opsForSet();[Set(集合)]stringRedisTemplate.opsForHash();[Hash(散列)]stringRedisTemplate.opsForZSet();[ZSet(有序集合)]
使用RedisDesktopManager可視化工具查看結果
StringTemplate類中方法存取的key-value值是String類型,RedisTemplate中key-value值是Object類型,RedisTemplate是StringTemplate父類
下面就用RedisTemplate實現從MySQL資料庫取出數據放到Redis緩存
五、使用RedisTemplate操作Redis
1.項目目錄結構
2.建立與資料庫相關的類
建表的sql腳本
application.properties配置文件
MySQL及Redis連接的相關配置
User類
採用ORM思想,屬性和資料庫欄位對應
package com.thinkcoder.bean;import java.io.Serializable;import java.util.Date;/*** @ClassName User * @Author Think-Coder * @Data 2020/5/27 10:35 * @Version 1.0 */public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; //getter和setter方法 public Integer getId() {return id;} public void setId(Integer id) {this.id = id;} public String getUsername() {return username;} public void setUsername(String username) {this.username = username;} public Date getBirthday() {return birthday;} public void setBirthday(Date birthday) {this.birthday = birthday;} public String getSex() {return sex;} public void setSex(String sex) {this.sex = sex;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;} //重寫toString方法 @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; }}
UserMapper類
使用註解方法操作資料庫
@Mapperpublic interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}") User findById(int id);}
3.MyRedisConfig
自定義序列化類,將存儲在Redis的對象序列化為json格式,不會產生亂碼
@Configuration@EnableAutoConfigurationpublic class MyRedisConfig {@Bean public RedisTemplate<Object, User> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<Object, User> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<User> ser = new Jackson2JsonRedisSerializer<>(User.class); template.setDefaultSerializer(ser); return template; }}
4.工具類RedisUtil類
//工具類中使用Autowired註解需要加上Compoent@Componentpublic class RedisUtil {@Autowired RedisTemplate redisTemplate; //key-value是對象的 //判斷是否存在key public boolean hasKey(String key){ return redisTemplate.hasKey(key); } //從redis中獲取值 public Object get(String key){ return redisTemplate.opsForValue().get(key); } //向redis插入值 public boolean set(final String key,Object value){ boolean result = false; try{ redisTemplate.opsForValue().set(key,value); result = true; }catch (Exception e){ e.printStackTrace(); } return result; }}
5.sevice包代碼
IUserService
@Servicepublic interface IUserService {//根據id查用戶信息 User findById(int id);}
UserService實現類
@Servicepublic class UserServiceImpl implements IUserService {User user; @Autowired UserMapper userMapper; @Autowired private RedisUtil redisUtil; @Override public User findById(int id) { String key = "user"+id; if(redisUtil.hasKey(key)) { user = (User)redisUtil.get(key); System.out.println("查詢的是緩存"); }else{ user = userMapper.findById(id); System.out.println("查詢的是資料庫"); System.out.println(redisUtil.set(key,user) ? "插入成功" : "插入失敗"); } return user; }}
6.UserController類
@RestControllerpublic class UserController {@Autowired IUserService userService; @GetMapping("/user/{id}") public User findById(@PathVariable("id") Integer id){ User user = userService.findById(id); return user; }}
7.測試
打開瀏覽器輸入下方url
查看控制臺輸出
Redis Desktop Manager顯示結果
六、總結
整體來說,操作Redis是兩個類,RedisTemplate類和StringTemplate類,為父子關係,提供的方法正好對應操作Redis數據類型的指令,所以要把數據類型及常用的指令練熟。