javascript
redis工具类_SpringBoot 操作 Redis 数据
SpringBoot 操作 Redis 數據
簡介
Redis 是一個開源的NoSQL數據庫,基于內存的鍵值存儲,速度快。Redis 支持數據結構,如字符串,散列,列表,集和帶范圍查詢的有序集。
5種主要數據類型:
字符串類型 ? ?string散列類型 ? ? ?hash列表類型 ? ? ?list集合類型 ? ? ?set有序集合類型 ?zsetRedis優缺點
直接基于內存讀寫,不用Redis直接用MySQL,先不說查詢性能耗時,一個是直達一個是通過媒介,顯而易見,Redis 速度很快 。不過Redis ,僅適用于鍵值對,并不能替代MySQL,雖然其有持久化,但是也可能會崩潰,損失幾秒的數據
項目環境
項目工具環境:
IDE工具,這里是 Jetbrains IDEAMavenJDK1.8Redis 服務器源碼環境地址
https://github.com/Gleans/SpringBootLearn/tree/master/springboot-redis
后面的基于這個項目來操作
定義 RedisTemplate
RedisConfig.java
import?org.springframework.context.annotation.Bean;import?org.springframework.context.annotation.Configuration;
import?org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import?org.springframework.data.redis.core.RedisTemplate;
import?org.springframework.data.redis.serializer.GenericToStringSerializer;
import?org.springframework.data.redis.serializer.RedisSerializer;
import?org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public?class?RedisConfig?{
????@Bean
????JedisConnectionFactory?jedisConnectionFactory()?{
????????JedisConnectionFactory?jedisConnectionFactory?=?new?JedisConnectionFactory();
????????jedisConnectionFactory.setPassword("ekko1234");
????????return?jedisConnectionFactory;
????}
????@Bean
????public?RedisTemplate?redisTemplate()?{
????????final?RedisTemplate?redisTemplate?=?new?RedisTemplate<>();
????????RedisSerializer?stringSerializer?=?new?StringRedisSerializer();
????????RedisSerializer?jsonString?=?new?GenericToStringSerializer<>(Object.class);
????????redisTemplate.setConnectionFactory(jedisConnectionFactory());
????????redisTemplate.setKeySerializer(stringSerializer);
????????redisTemplate.setValueSerializer(jsonString);
????????redisTemplate.setHashKeySerializer(stringSerializer);
????????redisTemplate.setHashValueSerializer(jsonString);return?redisTemplate;
????}
}
操作 Redis 初體驗
Spring Boot 的開箱即用的特點
集成 Redis 也是顯而易見
在test環境新建測試類 TestRedis.java
import?org.junit.FixMethodOrder;
import?org.junit.Test;
import?org.junit.runner.RunWith;
import?org.junit.runners.MethodSorters;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.boot.test.context.SpringBootTest;
import?org.springframework.data.redis.core.RedisTemplate;
import?org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//根據測試方法名字搞定執行順序
@Slf4j
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public?class?TestRedis?{
????private?RedisTemplate?redisTemplate;@Autowiredpublic?void?setRedisTemplate(RedisTemplate?redisTemplate)?{this.redisTemplate?=?redisTemplate;
????}//?做下面的操作
}
操作字符串
在測試類中操作字符串:
????@Test????public?void?operateStr(){
????????//?存入?key為username??value?為?admin
????????redisTemplate.opsForValue().set("username","admin");
????????//?獲取?key為username
????????String?username?=?(String)?redisTemplate.opsForValue().get("username");
????????System.out.println(username);
????}
執行過后發現存在redis中的數據:
操作集合
opsForList()
????@Test????public?void?operateList()?{
????????List?userList?=?new?ArrayList<>();
????????userList.add("張三");
????????userList.add("李四");//循環向userlist左添加值
????????userList.forEach(value?->?redisTemplate.opsForList().leftPush("userlist",?value));//向userlist右添加值
????????redisTemplate.opsForList().rightPush("userlist",?"麻子");
????????log.info("刪除前:userlist->{}",?redisTemplate.opsForList().range("userlist",?0,?10));/*
??????????三個參數:
??????????- key redis中存 key值
??????????-?count?從左或是從右刪除,正左負右
??????????-?value?就是需要從list移除的值
??????????*/
????????redisTemplate.opsForList().remove("userlist",?0,?"麻子");
????????log.info("刪除后:userlist->{}",?redisTemplate.opsForList().range("userlist",?0,?10));
????}
輸出:
刪除前:userlist->[李四,?張三,?麻子]刪除后:userlist->[李四,?張三]
操作不可重復集合
opsForSet()
????@Test????public?void?operateSet(){
????????List?trap?=?new?ArrayList<>();
????????trap.add("工具人");
????????trap.add("工具人");
????????trap.add("工具人");
????????trap.add("四塊五的妞");
????????trap.add("十元妹子");
????????System.out.print(trap.toString());//循環向userlist左添加值
????????trap.forEach(value->redisTemplate.opsForSet().add("userSet",value));
????????log.info("刪除前:userSet->{}",redisTemplate.opsForSet().members("userSet"));//?直接根據set的key值刪除
????????redisTemplate.opsForSet().remove("userSet","工具人");
????????log.info("刪除后:userSet->{}",redisTemplate.opsForSet().members("userSet"));
????}
輸出:
刪除前:userSet->[工具人,?工具人,?工具人,?四塊五的妞,?十元妹子]刪除后:userSet->[四塊五的妞,?十元妹子]
哈希操作
opsForHash() ?相當于在操作實體類
????@Test????public?void?operateHash(){
????????//添加
????????redisTemplate.opsForHash().put("user","username","ekko");
????????redisTemplate.opsForHash().put("user","address","Shanghai");
????????redisTemplate.opsForHash().put("user","passwd","1234");
????????//修改
????????redisTemplate.opsForHash().put("user","address","Beijing");
????????//刪除
????????redisTemplate.opsForHash().delete("user","passwd");
????}
結果:
總結
數據量大且不長變的還是用緩存接收數據來回操作使用 Redis,持久化時再入庫做好緩存擊穿的準備利用好 Redis 可以很大程度的減少 MySQL 的壓力Redis 常用的操作基本滿足需求小知識
方法名字前加ABCD...是為了讓方法有執行順序
根據測試方法名字搞定執行順序,在方法上加注解@FixMethodOrder(MethodSorters.NAME_ASCENDING)
日志注解@Slf4j是為了讓日志書寫更方便
?log.info("輸出a"+index+"b");
?//現在
?log.info("輸出a{}b",index);
多個參數可以用多個{},總之,喜歡哪個用哪個,謝謝!
閱讀原文可評論或與作者交流
總結
以上是生活随笔為你收集整理的redis工具类_SpringBoot 操作 Redis 数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python插件化设计_python -
- 下一篇: 一个form 如何做两次提交_如何做一个