spring boot redis 學習之路

 redis 基礎認識

Redis是一個key-value存儲系統。它是遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫。
Redis支持數據持久化可以吧內存中的數據存儲到硬盤中,下次啓動在加載使用,它可以支持簡單的數據類型同樣也支持 list、set、zset、hash 等數據存儲,還支持數據備份 master-slave(主從模式)。
優勢:豐富數據類型、豐富特性、 原子性(操作都是原子性的,意思是要麼成功,要麼失敗)、性能高、
入/var/run/redis.pid,通過pidfile指定
默認監聽端口 : 6379   

String : set      get (二進制安全)
Hash  : hset     hget  (鍵值對集合,即編程語言中的Map類型)
List     : lpush   lrange (鏈表(雙向鏈表))
Set     : sadd    smembers (哈希表實現,元素不重複) 
Zset   : zset     zrangebyscore (將Set中的元素增加一個權重參數score,元素按score有序排列)

ping 測試redis是否啓動
遠程連接redis 數據庫: -h 127.0.0.1 -p 6379 -a "mypass"

springboot redis MySQL 

  1. 關於spring-redis
  2. 關於redis的key設計
  3. redis的基本數據結構
  4. 介紹redis與springboot的整合
  5. sringboot中的redistemplate的使用
  6. github 地址
1. 連接池自動管理,提供了一個高度封裝的“RedisTemplate”類

2. 針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝爲operation接口

ValueOperations:簡單K-V操作
SetOperations:set類型數據操作
ZSetOperations:zset類型數據操作
HashOperations:針對map類型的數據操作
ListOperations:針對list類型的數據操作

 

springboot整合redis

啥也不說上代碼通過maven 來管理jar

pom.xml文件


	<dependencies>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>fastjson</artifactId> 
            <version>1.2.40</version> 
        </dependency>
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>        
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-annotations</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<!-- <exclusions>去掉springboot默認配置  
		        <exclusion>  
		            <groupId>org.springframework.boot</groupId>  
		            <artifactId>spring-boot-starter-logging</artifactId>  
		        </exclusion>  
		    </exclusions>  -->
		</dependency>
	<!-- 	<dependency> 引入log4j2依賴  
		    <groupId>org.springframework.boot</groupId>  
		    <artifactId>spring-boot-starter-log4j2</artifactId>  
		</dependency>  -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>

		<dependency>
			<groupId>tk.mybatis</groupId>
			<artifactId>mapper-spring-boot-starter</artifactId>
			<version>1.1.3</version>
		</dependency>
		<!-- MyBatis 分頁插件 PageHelper -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.1</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>


boot 的配置文件 application.prooerties 配置文件

#\u7AEF\u53E3
server.port=9999

#JDBC
spring.datasource.url=jdbc:mysql://localhost:3306/tms?characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource


#\u4E0B\u9762\u914D\u7F6E\u8BF4\u660E\u8BF7\u53C2\u8003Druid Github Wiki\uFF0C\u914D\u7F6E_StatViewServlet\u914D\u7F6E
#spring.datasource.druid.StatViewServlet.loginUsername=druid
#spring.datasource.druid.StatViewServlet.loginPassword=druid

#mybatis
mybatis.type-aliases-package=com.sk.entity
mybatis.mapper-locations=classpath:mapper/*.xml
#mappers \u591A\u4E2A\u63A5\u53E3\u65F6\u9017\u53F7\u9694\u5F00
#mapper.mappers=tk.mybatis.mapper.common.Mapper
mapper.mappers=com.sk.utils.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
mybatis.configuration.mapUnderscoreToCamelCase=true
#pagehelper
pagehelper.helperDialect=mysql
#pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.autoDialect=true  
pagehelper.closeConn=false  
pagehelper.reasonable=true

#audience.clientId=098f6bcd4621d373cade4e832627b4f6
#audience.base64Secret=MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY=
#audience.name=restapiuser
#audience.expiresSecond=172800

## Redis \u914D\u7F6E
## Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09
spring.redis.database=0
## Redis\u670D\u52A1\u5668\u5730\u5740
spring.redis.host=127.0.0.1
## Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
spring.redis.port=6379
## Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
spring.redis.password=123456
## \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.jedis.pool.max-active=8
## \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.jedis.pool.max-wait=-1
## \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
spring.redis.jedis.pool.max-idle=8
## \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
spring.redis.jedis.pool.min-idle=0
## \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
spring.redis.timeout=5000

 

 上面都上常規的配置文件 下面就是代碼實現啦啦啦

Controller層

public  ResponseEntity<JsonResult> getUserById (@PathVariable(value = "id") Integer id) {
		log.info("根據ID獲取用戶信息");
		JsonResult r = null;
		try {
			User user = userService.getUserById(id);
			r = new JsonResult(user, "ok");
			
		} catch (Exception e) {
			r = new JsonResult(e.getClass().getName() + ":" + e.getMessage());
			e.printStackTrace();
		}
		return ResponseEntity.ok(r);
	}

UserService

User getUserById(Integer id);

UserServiceImpl

實現驗證緩存中是否存在數據,如果存在直接返回,不存在去數據庫中查詢同時放入緩存中和返回前端;

package com.sk.service.impl;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import com.sk.entity.User;
import com.sk.mapper.UserMapper;
import com.sk.service.UserService;


/**
* 2019年3月12日 上午11:18:07
* @HXing xu
* sk-redis
* 
**/
@Service
public class UserServiceImpl implements UserService {

	 
	private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

	 @Autowired
	 private UserMapper userDao;
	 @Autowired
	 private RedisTemplate redisTemplate;
	 @Autowired
	 private StringRedisTemplate stringRedisTemplate;
	 
	
	@Override
	public User getUserById(Integer id) {
		// TODO Auto-generated method stub\
		
		 // 從緩存中獲取用戶信息
        String key = "user_"+id;
        ValueOperations<Object, Object> operations = redisTemplate.opsForValue();
        // 緩存存在
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
        	User user = (User) operations.get(key);
            log.info("UserServiceImpl.getUserById() : 從緩存中獲取了用戶 >> " + user.toString());
            return user;
        }else {
        	 // 從 DB 中獲取城市信息
            User user = userDao.getUserById(id);;
     
            // 插入緩存
            operations.set(key, user , 30 , TimeUnit.MINUTES);

    		return user;
        }
       
	}

	@Override
	public List<User> listUser() {
		String key = "list_user";
		ListOperations<Object, Object> operations = redisTemplate.opsForList();
        // 緩存存在
        boolean hasKey = redisTemplate.hasKey(key);
        if(hasKey) {
        	Long i = operations.size(key);
        	List<Object> list = operations.range(key, 0, operations.size(key));
            log.info("UserServiceImpl.getUserById() : 從緩存中獲取了用戶 >> " + list.toString());
            
            List<User> u_List = new ArrayList<>();
            // 將object 轉爲 實體類
            for(Object user : list) {
            	User us = new User();
            	us = (User) user;
            	u_List.add(us);
            }
            return u_List;
            
        }else { 
        	List<User> list = userDao.selectAll();
        	for(User user : list) {
        		operations.leftPush(key, user);
        	}
        	
        	return list;
        }
		
	}

	@Override
	public User getUserByName(String name) {
		// TODO Auto-generated method stub
		return userDao.getUserByName(name);
	}
	
	 @Override
    public long delUserById(Integer id) {
		 Long l = userDao.delUserById(id);
        //如果緩存存在,刪除緩存
        String key = "user_" +id;
        boolean haskey = redisTemplate.hasKey(key);
        if(haskey) {
            redisTemplate.delete(key);
        }
        return 1;
    }

}

現在基本上可以測試了

這是測試結果 第一次查詢的數據庫 ,第二次查詢的緩存

 數據現在已經放到緩存中,

最後所有的代碼都被上傳到我的github喜歡的話,給個start

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章