Redis简单笔记
What:Redis簡介
redis官方文檔:https://developer.redis.com
redis是一種(key-value)的nosql類型的數據直接在內存里面進行緩存。
redis使用場景
1、熱點數據緩存
由于redis訪問速度塊、支持的數據類型比較豐富,所以redis很適合用來存儲熱點數據,另外結合expire,我們可以設置過期時間然后再進行緩存更新操作。
2、限時業務場景使用(注冊驗證碼、短信驗證碼)
redis中可以使用expire命令設置一個鍵的生存時間,到時間后redis會刪除它。利用這一特性可以運用在限時的優惠活動信息、手機驗證碼等業務場景。
3、計數器相關問題
redis由于incrby命令可以實現原子性的遞增,所以可以運用于高并發的秒殺活動、分布式序列號的生成、具體業務還體現在比如限制一個手機號發多少條短信、一個接口一分鐘限制多少請求、一個接口一天限制調用多少次等等。
4、點贊、關注好友等存儲
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。 又或者在微博應用中,每個用戶關注的人存在一個集合中,就很容易實現求兩個人的共同好友功能。
redis主要特點
1)支持數據的持久化,可以將內存中的數據持久化保存在磁盤中,重啟后再次將磁盤中的數據加載到內存。
2)豐富的數據類型,不僅支持簡單的key-value類型的數據,還提供List、Set、ZSet、Hash等數據結構的存儲。
3)支持數據的備份,即master-slave(主-從)模式的數據備份。
4)豐富的特性,支持publish/subscribe(發布/訂閱)、通知、key過期等特性。
redis數據類型
Why:為什么要使用redis
在之前的單機業務下我們服務端的模式是 app -> DAO -> MySql這種情況家要進行大量的io讀寫操作。從而導致效率不高。同時也使得mysql的性能會很差(這里引用別人博客的圖片)
引入緩存之后如今的模式是 app -> DAO -> Cache -> MySql 從而DAO層可以直接從緩存中讀取數據,
redis優勢
-
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
-
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
-
Redis支持數據的備份,即master-slave模式的數據備份。
-
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
-
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
-
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執行。
-
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
How:SpringBoot集成redis
1、RedisTemplate
RedisTemplate有兩個方法經常用到:
opsForXXX()和boundXXXOps(),XXX是value(值)的數據類型。
opsForXXX獲取到一個操作(Operation),但是沒有指定操作的key(鍵),可以在一個連接(事務)內操作多個key以及對應的value;boundXXXOps獲取到一個指定key的操作,在一個連接內只操作這個key對應的value。
//操作string redisTemplate.opsForValue().set("key","value"); //操作hash redisTemplate.opsForHash().put("key","people","tom"); //操作list redisTemplate.opsForList().leftPush("key","value"); //操作set redisTemplate.opsForSet().add("key","1","2","3"); //操作zset redisTemplate.opsForZSet().add("key" , "test");2、BoundValueOperations操作
String value = "weiz";BoundValueOperations operations = redisTemplate.boundValueOps(value);operations.xxx;spring集成redis
1、pom依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.5.4</version> </dependency>2、修改配置文件
spring.redis.database = 0 spring.redis.host = 127.0.0.1 spring.redis.port =6379 spring.redis.password = spring.redis.jedis = # 最大鏈接數 spring.redis.pool.max-active = 8 # 最大等待時間-1表示沒有 spring.redis.pool.max-wait = -1 # 最大空閑數量 spring.redis.pool.max-idle = # 最小空閑數量 spring.redis.pool.min-idle = 2配置序列化方式
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory); // JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 設置值(value)的序列化采用FastJsonRedisSerializer。redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);// 設置鍵(key)的序列化采用StringRedisSerializer。redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;} }測試類
@Testvoid zz() throws InterruptedException {Book book = new Book();book.setBookToken(environment.getProperty("cfg.random.value"));book.setSaleUid(environment.getProperty("cfg.random.uuid"));book.setDescription("test for redis");book.setAuthor("Hall Way");book.setId(1L);book.setUpdatetimestamp(DateUtil.date());book.setCreatetimestamp(DateUtil.date());//存儲對象redisTemplate.opsForValue().set("book:"+ book.getId().toString() , book);System.out.println(redisTemplate.opsForValue().get("book:1"));} /** 結果 Book(id=1, bookName=null, description=test for redis, author=Hall Way, bookToken=2af9cc2845c47ab3e0525160cabd3c34, saleUid=22dcd988-c60d-4877-97fb-ad6dcc9b718b, createtimestamp=2022-06-10 14:58:37, updatetimestamp=2022-06-10 14:58:37) */Spring使用redis做緩存
原理架構圖如下
代碼實操
1、開啟緩存
@Configuration @EnableCaching public class RedisCacheConfig extends CachingConfigurerSupport {/*** 采用RedisCacheManager作為緩存管理器* 同時為了高可用Redis,可以使用RedisSentinelConfiguration來支持Redis Sentinel* */@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).build();return cacheManager;} }@Configuration:標識它是配置類的注解。
@EnableCaching:開啟基于注解的緩存,也可以寫在啟動類上。
@SpringBootApplication @MapperScan("com.practise.mapper.**") @EnableScheduling @EnableCaching public class MyStart {public static void main(String[] args) {SpringApplication.run(MyStart.class);} }2、添加@Cacheable注解
在讀取數據的方法上添加@Cacheable注解or在controller層上@Cacheable注解。
這樣就會自動將該方法獲取的數據結果放入緩存。若沒有數據則從數據庫中讀取之后就會放入緩存當中。
一:沒有緩存的情況
數據庫:
controller:
@Cacheable("book") //命名空間 @GetMapping("book/{id}") public Book getDetail(@PathVariable Long id){System.out.println("請求詳細書籍信息");return bookService.getDetail(id); }service:
public Book getDetail(Long id){Book resultBook = Optional.ofNullable(getById(id)).orElseThrow(()->new RuntimeException("沒有找到該書籍"));System.out.println("本次數據來源于數據庫");return resultBook; }啟動之后輸入localhost:8080/book/1
控制臺:
查看redis中發現多出了數據
redis常用緩存注解
1、常用注解和參數
spring提供了@EnableCaching、@Cacheable、@CacheEvict、@CachePut、@CacheConfig五個注解來實現緩存
總結
- 上一篇: C#二叉树递归实现
- 下一篇: C#学习笔记-Windows窗体自定义初