標籤:計數 開發 dev in-memory ase tst 串連數 更新 efault
Redis介紹
Redis 是一個速度非常快的非關聯式資料庫,它可以儲存鍵(key)與 5 種不同類型的值(value)之間的映射(mapping),可以將儲存在記憶體的索引值對資料持久化到硬碟,可以使用複製特性來擴充讀效能,還可以使用用戶端分區來擴充寫效能。為了滿足高效能,Redis 採用記憶體(in-memory)資料集(dataset)。根據使用情境,可以通過每隔一段時間轉儲資料集到磁碟,或者追加每條命令到日誌來持久化。持久化也可以被禁用,如果只是需要一個功能豐富,網路化的記憶體緩衝。
支援的資料類型包括:
string(字串) hash(雜湊) list(列表) set(集合) zset(sorted set:有序集合)
優勢:
Redis 的優勢包括它的速度、它對富資料類型的支援、它的操作的原子性,以及它的通用性: A、效能極高,它每秒可執行約 100,000 個 set 以及約 100,000 個 get 操作。 B、豐富的資料類型,Redis 對大多數開發人員已知道的大多數資料類型提供了原生支援,這使得各種問題得以輕鬆解決。 C、原子性,因為所有 Redis 操作都是原子性的,所以多個用戶端會並發地訪問一個 Redis 伺服器,擷取相同的更新值。 D、豐富的特性,Redis 是一個多效用工具,有非常多的應用情境,包括緩衝、訊息佇列(Redis 原生支援發布/訂閱)、 短期應用程式資料(如 Web 會話、Web 頁面命中計數)等。
spring-boot-starter-data-redis
Spring Boot 提供了對 Redis 整合的組件包: spring-boot-starter-data-redis 。spring-boot-starter-data-redis 依賴於 spring-data-redis 和 jedis 。A、Jedis:Jedis 是 Redis 的 Java 版用戶端實現,是官方推薦的 Java 版用戶端。它封裝了對 Redis 的各種操作, 並且支援事務、管道及有 Jedis 自身實現的分布式。B、Spring Data:Spring Data 是 Spring 架構中的一個主要項目,目的是為了簡化構建基於 Spring 架構應用的數 據訪問,包括非關聯式資料庫、Map-Reduce 架構、雲資料服務等,另外也包含對關聯式資料庫的訪問支援。C、Spring Data Redis :Spring Data Redis 是 Spring Data 項目中的一個主要模組,實現了對 Jedis 用戶端 API 的高度封裝,使對 Redis 的操作更加便捷。他們之間的關係: Jedis -> Spring Data Redis -> Spring Data -> spring-boot-starter-data-redis 所以 Spring Data Redis 和 Jedis 具備的功能,spring-boot-starter-data-redis 都會有。
案例示範POM.XML *****我們使用的是1.5.8版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build>
User類:
public class User implements Serializable{ private Long id; private String userName; private String password; private String email; private String nickname; private String regTime; //setter、getter方法省略 }
RedisConfig類:
@Configuration @EnableCaching //開啟緩衝 public class RedisConfig extends CachingConfigurerSupport{ @Bean public KeyGenerator keyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object targe, Method method, Object... params) { StringBuilder sb=new StringBuilder(); sb.append(targe.getClass().getName()); sb.append(method.getName()); for(Object obj:params){ sb.append(obj.toString()); } return sb.toString(); } }; } @Bean public CacheManager cacheManager(RedisTemplate redisTemplate){ RedisCacheManager rcm = new RedisCacheManager(redisTemplate); rcm.setDefaultExpiration(60); return rcm; } }
application.properties
# Redis 資料庫索引(預設為0) spring.redis.database=0 # Redis 伺服器位址 spring.redis.host=192.168.0.71 # Redis 伺服器串連端?口 spring.redis.port=6379 # Redis 伺服器串連密碼(預設為空白) spring.redis.password= # 串連池最?大串連數(使?用負值表?示沒有限制) spring.redis.pool.max-active=8 # 串連池最?大阻塞等待時間(使?用負值表?示沒有限制) spring.redis.pool.max-wait=-1 # 串連池中的最?大空閑串連 spring.redis.pool.max-idle=8 # 串連池中的最?小空閑串連 spring.redis.pool.min-idle=0 # 連線逾時時間(毫秒) spring.redis.timeout=10000
TestRedisTemplate測試類別:
@RunWith(SpringRunner.class) @SpringBootTest public class TestRedisTemplate { @Autowired private RedisTemplate redisTemplate; @Test public void testString(){ redisTemplate.opsForValue().set("kid","doudou"); Assert.assertEquals("doudou",redisTemplate.opsForValue()); } //建立一個 User 對象,放到緩衝中,再取出來 @Test public void testObj() throws InterruptedException{ User user=new User("[email protected]", "expire", "youknow", "expire","2020"); ValueOperations<String,User> operations=redisTemplate.opsForValue(); operations.set("expire",user,100, TimeUnit.MICROSECONDS); Thread.sleep(1000); boolean exists=redisTemplate.hasKey("expire"); if(exists){ System.out.println("exists is true"); }else{ System.out.println("exists is false"); } } @Test public void testDelete() { ValueOperations<String, User> operations=redisTemplate.opsForValue(); redisTemplate.opsForValue().set("deletekey", "ityouknow"); redisTemplate.delete("deletekey"); boolean exists=redisTemplate.hasKey("deletekey"); if(exists){ System.out.println("exists is true"); }else{ System.out.println("exists is false"); } } @Test public void testHash() { HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put("hash","you","you"); String value=(String) hash.get("hash","you"); System.out.println("hash value :"+value); } @Test public void testSet() { String key="set"; redisTemplate.delete(key); SetOperations<String, String> set = redisTemplate.opsForSet(); set.add(key,"it"); set.add(key,"you"); set.add(key,"you"); set.add(key,"know"); Set<String> values=set.members(key); for (String v:values){ System.out.println("set value :"+v); } } @Test public void testSetMore() { SetOperations<String, String> set = redisTemplate.opsForSet(); String key1="setMore1"; String key2="setMore2"; set.add(key1,"it"); set.add(key1,"you"); set.add(key1,"you"); set.add(key1,"know"); set.add(key2,"xx"); set.add(key2,"know"); Set<String> diffs=set.difference(key1,key2); for (String v:diffs){ System.out.println("diffs set value :"+v); } String key3="setMore3"; String key4="setMore4"; set.add(key3,"it"); set.add(key3,"you"); set.add(key3,"xx"); set.add(key4,"aa"); set.add(key4,"bb"); set.add(key4,"know"); Set<String> unions=set.union(key3,key4); for (String v:unions){ System.out.println("unions value :"+v); } } @Test public void testZset(){ String key="zset"; redisTemplate.delete(key); ZSetOperations<String, String> zset = redisTemplate.opsForZSet(); zset.add(key,"it",1); zset.add(key,"you",6); zset.add(key,"know",4); zset.add(key,"neo",3); Set<String> zsets=zset.range(key,0,3); for (String v:zsets){ System.out.println("zset value :"+v); } Set<String> zsetB=zset.rangeByScore(key,0,3); for (String v:zsetB){ System.out.println("zsetB value :"+v); } } }
Redis介紹(六)