javascript
redis缓存原理与实现_SpringBoot整合Redis缓存,手把手教你一步一步实现
推薦學(xué)習(xí)
- 分布式大全:反向代理/Redis/中間件/MySQL/消息,挑戰(zhàn)阿里P7必備
- 都是“Redis惹的禍”,害我差點(diǎn)掛在美團(tuán)三面,真是“虛驚一場(chǎng)”
- 微服務(wù)架構(gòu)之春招總結(jié):SpringCloud、Docker、Dubbo與SpringBoot
一、基本概況
為什么使用緩存
緩存是在內(nèi)存中存儲(chǔ)的數(shù)據(jù)備份,當(dāng)數(shù)據(jù)沒有發(fā)生本質(zhì)變化時(shí)
就可以直接從內(nèi)存中查詢數(shù)據(jù),而不用去數(shù)據(jù)庫查詢(在磁盤中)
CPU讀取內(nèi)存的速度要比讀取磁盤快,可以提高效率
Redis緩存
Remote Dictionnary Server(遠(yuǎn)程數(shù)據(jù)服務(wù)),是一款內(nèi)存高速緩存數(shù)據(jù)庫。
五種常用數(shù)據(jù)類型: String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)
可持久化:一邊運(yùn)行,一邊向硬盤備份一份,防止斷電等偶然情況,導(dǎo)致內(nèi)存中數(shù)據(jù)丟失
二、搭建Redis環(huán)境
1.下載Redis
2.設(shè)置Redis開機(jī)自啟
在解壓好的文件夾下輸入cmd命令
window下安裝Redis服務(wù)
redis-server --service-install redis.windows.conf檢查安裝是否成功
搜索服務(wù)
點(diǎn)擊設(shè)置為開機(jī)自啟
三、新建SpringBoot項(xiàng)目
新建好項(xiàng)目的童鞋可以自動(dòng)跳過
添加web依賴
選擇數(shù)據(jù)庫依賴
選擇項(xiàng)目位置,點(diǎn)擊finish
四、使用StringRedisTemplate操作Redis
1.pom.xml文件引入坐標(biāo)
org.springframework.boot spring-boot-starter-data-redis2.在appliaction.properties配置redis數(shù)據(jù)庫連接信息
#redis配置#Redis服務(wù)器地址spring.redis.host=127.0.0.1#Redis服務(wù)器連接端口spring.redis.port=6379#Redis數(shù)據(jù)庫索引(默認(rèn)為0)spring.redis.database=03.在SpringbootdemoApplicationTests中測(cè)試操作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"); }}對(duì)于Redis的五大常用數(shù)據(jù)類型都提供了方法
String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)
stringRedisTemplate.opsForValue();[String(字符串)]
stringRedisTemplate.opsForList();[List(列表)]
stringRedisTemplate.opsForSet();[Set(集合)]
stringRedisTemplate.opsForHash();[Hash(散列)]
stringRedisTemplate.opsForZSet();[ZSet(有序集合)]
使用RedisDesktopManager可視化工具查看結(jié)果
StringTemplate類中方法存取的key-value值是String類型,RedisTemplate中key-value值是Object類型,RedisTemplate是StringTemplate父類
下面就用RedisTemplate實(shí)現(xiàn)從MySQL數(shù)據(jù)庫取出數(shù)據(jù)放到Redis緩存
五、使用RedisTemplate操作Redis
1.項(xiàng)目目錄結(jié)構(gòu)
2.建立與數(shù)據(jù)庫相關(guān)的類
建表的sql腳本
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用戶名稱', `birthday` datetime DEFAULT NULL COMMENT '生日', `sex` char(1) DEFAULT NULL COMMENT '性別', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8;application.properties配置文件
- MySQL及Redis連接的相關(guān)配置
User類
- 采用ORM思想,屬性和數(shù)據(jù)庫字段對(duì)應(yīng)
UserMapper類
- 使用注解方法操作數(shù)據(jù)庫
3.MyRedisConfig
自定義序列化類,將存儲(chǔ)在Redis的對(duì)象序列化為json格式,不會(huì)產(chǎn)生亂碼
@Configuration@EnableAutoConfigurationpublic class MyRedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer ser = new Jackson2JsonRedisSerializer<>(User.class); template.setDefaultSerializer(ser); return template; }}4.工具類RedisUtil類
//工具類中使用Autowired注解需要加上Compoent@Componentpublic class RedisUtil { @Autowired RedisTemplate redisTemplate; //key-value是對(duì)象的 //判斷是否存在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 {//根據(jù)id查用戶信息 User findById(int id);}UserService實(shí)現(xiàn)類
@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("查詢的是數(shù)據(jù)庫"); 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.測(cè)試
打開瀏覽器輸入下方url
查看控制臺(tái)輸出
Redis Desktop Manager顯示結(jié)果
六、總結(jié)
整體來說,操作Redis是兩個(gè)類,RedisTemplate類和StringTemplate類,為父子關(guān)系,提供的方法正好對(duì)應(yīng)操作Redis數(shù)據(jù)類型的指令,所以要把數(shù)據(jù)類型及常用的指令練熟。
在實(shí)際業(yè)務(wù)中Redis的應(yīng)用不止這些,繼續(xù)探索吧
作者:Think—Coder
原文鏈接:https://blog.csdn.net/shang_0122/article/details/106363769
總結(jié)
以上是生活随笔為你收集整理的redis缓存原理与实现_SpringBoot整合Redis缓存,手把手教你一步一步实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机壳具体作用有哪些
- 下一篇: 苹果13如何设置小圆点功能