今天,日月在這里教大家如何使用springBoot集成redis,說實話比較簡單,網上也有大把的教程。先套用一下網上的簡介。
定義
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。
它通常被稱為數據結構服務器,因為值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
reids的優點
以下是Redis的一些優點。
異常快 - Redis非常快,每秒可執行大約110000次的設置(SET)操作,每秒大約可執行81000次的讀取/獲取(GET)操作。
支持豐富的數據類型 - Redis支持開發人員常用的大多數數據類型,例如列表,集合,排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。
操作具有原子性 - 所有Redis操作都是原子操作,這確保如果兩個客戶端并發訪問,Redis服務器能接收更新的值。
多實用工具 - Redis是一個多實用工具,可用于多種用例,如:緩存,消息隊列(Redis本地支持發布/訂閱),應用程序中的任何短期數據,例如,web應用程序中的會話,網頁命中計數等。
Redis 安裝
Window 下安裝
下載地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。這個需要根據你系統平臺的實際情況選擇,這里我們下載 Redis-x64-xxx.zip壓縮包到 C 盤,解壓后,將文件夾重新命名為 redis。
打開一個 cmd 窗口 使用cd命令切換目錄到 C:\redis
運行 redis-server.exe redis.windows.conf
如果想方便的話,可以把 redis 的路徑加到系統的環境變量里,這樣就省得再輸路徑了,后面的那個 redis.windows.conf 可以省略,如果省略,會啟用默認的。輸入之后,會顯示如下界面:
集成redis
我們還是延用上一章的項目:Springboot集成springcloud-config實現dataSource熱部署
1、添加依賴
- <!--集成redis-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-redis</artifactId>
- <version>1.4.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.3</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- </dependency>
2、在配置中心里添加redis配置
- spring.redis.host=127.0.0.1
- #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=30000
3、配置類RedisConfig
- import java.lang.reflect.Method;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.cache.CacheManager;
- import org.springframework.cache.annotation.CachingConfigurerSupport;
- import org.springframework.cache.annotation.EnableCaching;
- import org.springframework.cache.interceptor.KeyGenerator;
- import org.springframework.cloud.context.config.annotation.RefreshScope;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.data.redis.cache.RedisCacheManager;
- import org.springframework.data.redis.connection.RedisConnectionFactory;
- import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
- import com.fasterxml.jackson.annotation.PropertyAccessor;
- import com.fasterxml.jackson.annotation.JsonAutoDetect;
- import com.fasterxml.jackson.databind.ObjectMapper;
- @Configuration
- @EnableCaching
- @RefreshScope
- public class RedisConfig extends CachingConfigurerSupport{
- @Value("${spring.redis.host}")
- private String host;
- @Value("${spring.redis.port}")
- private int port;
- @Value("${spring.redis.timeout}")
- private int timeout;
- @Value("${spring.redis.password}")
- private String password;
- @Value("${spring.redis.pool.max-active}")
- private int maxActive;
- @Value("${spring.redis.pool.max-wait}")
- private int maxWait;
- @Value("${spring.redis.pool.max-idle}")
- private int maxIdle;
- @Value("${spring.redis.pool.min-idle}")
- private int minIdle;
- @RefreshScope
- @Bean
- public KeyGenerator wiselyKeyGenerator(){
- return new KeyGenerator() {
- @Override
- public Object generate(Object target, Method method, Object... params) {
- StringBuilder sb = new StringBuilder();
- sb.append(target.getClass().getName());
- sb.append(method.getName());
- for (Object obj : params) {
- sb.append(obj.toString());
- }
- return sb.toString();
- }
- };
- }
- @RefreshScope
- @Bean
- public JedisConnectionFactory redisConnectionFactory() {
- JedisConnectionFactory factory = new JedisConnectionFactory();
- factory.setHostName(host);
- factory.setPort(port);
- factory.setTimeout(timeout); //設置連接超時時間
- factory.setPassword(password);
- factory.getPoolConfig().setMaxIdle(maxIdle);
- factory.getPoolConfig().setMinIdle(minIdle);
- factory.getPoolConfig().setMaxTotal(maxActive);
- factory.getPoolConfig().setMaxWaitMillis(maxWait);
- return factory;
- }
- @RefreshScope
- @Bean
- public CacheManager cacheManager(RedisTemplate redisTemplate) {
- RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
- // Number of seconds before expiration. Defaults to unlimited (0)
- cacheManager.setDefaultExpiration(10); //設置key-value超時時間
- return cacheManager;
- }
- @RefreshScope
- @Bean
- public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
- StringRedisTemplate template = new StringRedisTemplate(factory);
- setSerializer(template); //設置序列化工具,這樣ReportBean不需要實現Serializable接口
- template.afterPropertiesSet();
- return template;
- }
- @RefreshScope
- private void setSerializer(StringRedisTemplate template) {
- Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
- ObjectMapper om = new ObjectMapper();
- om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
- om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
- jackson2JsonRedisSerializer.setObjectMapper(om);
- template.setValueSerializer(jackson2JsonRedisSerializer);
- }
- }
4、RedisUtils類
- import java.io.Serializable;
- import java.util.List;
- import java.util.Set;
- import java.util.concurrent.TimeUnit;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.HashOperations;
- import org.springframework.data.redis.core.ListOperations;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.data.redis.core.SetOperations;
- import org.springframework.data.redis.core.ValueOperations;
- import org.springframework.data.redis.core.ZSetOperations;
- import org.springframework.stereotype.Service;
- @Service
- public class RedisUtils {
- @Autowired
- private RedisTemplate redisTemplate;
- /**
- * 寫入緩存
- * @param key
- * @param value
- * @return
- */
- public boolean set(final String key, Object value) {
- boolean result = false;
- try {
- ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
- operations.set(key, value);
- result = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return result;
- }
- /**
- * 寫入緩存設置時效時間
- * @param key
- * @param value
- * @return
- */
- public boolean set(final String key, Object value, Long expireTime ,TimeUnit timeUnit) {
- boolean result = false;
- try {
- ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
- operations.set(key, value);
- redisTemplate.expire(key, expireTime, timeUnit);
- result = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return result;
- }
- /**
- * 批量刪除對應的value
- * @param keys
- */
- public void remove(final String... keys) {
- for (String key : keys) {
- remove(key);
- }
- }
- /**
- * 批量刪除key
- * @param pattern
- */
- public void removePattern(final String pattern) {
- Set<Serializable> keys = redisTemplate.keys(pattern);
- if (keys.size() > 0){
- redisTemplate.delete(keys);
- }
- }
- /**
- * 刪除對應的value
- * @param key
- */
- public void remove(final String key) {
- if (exists(key)) {
- redisTemplate.delete(key);
- }
- }
- /**
- * 判斷緩存中是否有對應的value
- * @param key
- * @return
- */
- public boolean exists(final String key) {
- return redisTemplate.hasKey(key);
- }
- /**
- * 讀取緩存
- * @param key
- * @return
- */
- public Object get(final String key) {
- Object result = null;
- ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
- result = operations.get(key);
- return result;
- }
- /**
- * 哈希 添加
- * @param key
- * @param hashKey
- * @param value
- */
- public void hmSet(String key, Object hashKey, Object value){
- HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
- hash.put(key,hashKey,value);
- }
- /**
- * 哈希獲取數據
- * @param key
- * @param hashKey
- * @return
- */
- public Object hmGet(String key, Object hashKey){
- HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
- return hash.get(key,hashKey);
- }
- /**
- * 列表添加
- * @param k
- * @param v
- */
- public void lPush(String k,Object v){
- ListOperations<String, Object> list = redisTemplate.opsForList();
- list.rightPush(k,v);
- }
- /**
- * 列表獲取
- * @param k
- * @param l
- * @param l1
- * @return
- */
- public List<Object> lRange(String k, long l, long l1){
- ListOperations<String, Object> list = redisTemplate.opsForList();
- return list.range(k,l,l1);
- }
- /**
- * 集合添加
- * @param key
- * @param value
- */
- public void add(String key,Object value){
- SetOperations<String, Object> set = redisTemplate.opsForSet();
- set.add(key,value);
- }
- /**
- * 集合獲取
- * @param key
- * @return
- */
- public Set<Object> setMembers(String key){
- SetOperations<String, Object> set = redisTemplate.opsForSet();
- return set.members(key);
- }
- /**
- * 有序集合添加
- * @param key
- * @param value
- * @param scoure
- */
- public void zAdd(String key,Object value,double scoure){
- ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
- zset.add(key,value,scoure);
- }
- /**
- * 有序集合獲取
- * @param key
- * @param scoure
- * @param scoure1
- * @return
- */
- public Set<Object> rangeByScore(String key,double scoure,double scoure1){
- ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
- return zset.rangeByScore(key, scoure, scoure1);
- }
5、測試,修改controller
- import java.util.concurrent.TimeUnit;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import com.chenqi.springboot.redis.RedisUtils;
- import com.chenqi.springboot.service.TestService;
- @RestController
- public class SpringBootController {
- public static final Logger log = LoggerFactory.getLogger(SpringBootController.class);
- @Autowired
- TestService testService;
- @Autowired
- private RedisUtils redisUtils;
- @RequestMapping(value = "/hello/{id}")
- public String hello(@PathVariable(value = "id") String id){
- //查詢緩存中是否存在
- boolean hasKey = redisUtils.exists(id);
- String str = "";
- if(hasKey){
- //獲取緩存
- Object object = redisUtils.get(id);
- log.info("從緩存獲取的數據"+ object);
- str = object.toString();
- }else{
- //從數據庫中獲取信息
- log.info("從數據庫中獲取數據");
- str = testService.test();
- //數據插入緩存(set中的參數含義:key值,user對象,緩存存在時間10(long類型),時間單位)
- redisUtils.set(id,str,10L,TimeUnit.MINUTES);
- log.info("數據插入緩存" + str);
- }
- return str;
- }
- }
啟動項目,第一次訪問:http://localhost:8002/hello/111
通過控制臺輸出,我們可以看到是從數據庫中獲取的數據,并且存入了redis緩存中。
我們再次刷新瀏覽器
可以看到,第二次是從緩存中讀取的,我們試試不斷刷新瀏覽器
可以看到,之后都是從緩存中獲取的。
到此我們的redis就配置好了。
SpringBoot集成Redis-demo下載
急需demo的兄弟就自行下載吧,不急可以留言郵箱,一般48小時內會發。
到此這篇關于使用SpringBoot集成redis的方法的文章就介紹到這了,更多相關SpringBoot集成redis內容請搜索我們以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持我們!