作业-2020年5月18日-Web开发实战 03

【排版正在调试之中,排版Beta3.0】

项目属于课上作业迭代,请不要用于真实开发和调试。

本文非解决方案文章,仅作为记录作业使用,类似于写点心路历程。

作业日期:2020年5月16+1日,作业03

作业安排:整理redis相关的内容。

 

作业背景:

作业-2020年5月18日-Web开发实战 03_第1张图片                作业-2020年5月18日-Web开发实战 03_第2张图片

 

根据老师安排,作业是根据博客和其他资料学习整理redis相关的内容,并提交到CSDN之中。已经完成作业的人请详细了解项目代码内容,不要仅仅照视频抄上。

阅读源文章:

https://blog.csdn.net/zhulier1124/article/details/82193182

https://blog.csdn.net/feiyangtianyao/article/details/87619128

 

redis是什么?

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 【1】

Redis是一个非常快速的、开源的、使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、非关系类型的、Key-Value数据库。【2】

Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。【3】
简单来说,它是一个以(key,value)的形式存储数据的数据库.【3】

 

Spring和Redis整合 

 

解决依赖问题



    redis.clients
    jedis
    3.3.0



    org.springframework.data
    spring-data-redis
    2.3.0.RELEASE

配置redis for spring




	
		
		
		
			
				classpath:redis.properties
			
		
	

	
    
        
        
        
        
        
        
        
        
    

    
    
        
        
        
        
		
        
        
        
        
        
        
    

    
    
        
        
            
        
        
            
        
        
            
        
        
            
        
           
          
    
	
	  
      
          
    

Redis基本配置及工具类
1.创建redis.properties配置文件
注意max-active,max-wait,max-idle,min-idle这几个参数版本不同写法也不一样

#redis配置开始
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=123456
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=1024
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=200
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=10000
#redis配置结束
spring.redis.block-when-exhausted=true

接下来的步骤

1.添加配置类RedisConfig

package com.example.demo.redis;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "redis")
public class RedisConfig {
    private String host;
    private int port;
    private int timeout;
    private  String password;
    private  int poolMaxTotal;
    private  int poolMaxldle;
    private  int poolMaxWait;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getPoolMaxTotal() {
        return poolMaxTotal;
    }

    public void setPoolMaxTotal(int poolMaxTotal) {
        this.poolMaxTotal = poolMaxTotal;
    }

    public int getPoolMaxldle() {
        return poolMaxldle;
    }

    public void setPoolMaxldle(int poolMaxldle) {
        this.poolMaxldle = poolMaxldle;
    }

    public int getPoolMaxWait() {
        return poolMaxWait;
    }

    public void setPoolMaxWait(int poolMaxWait) {
        this.poolMaxWait = poolMaxWait;
    }
}

2.添加RedisPoolFactory类,将连接池的参数注入spring容器

package com.example.demo.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Service
public class RedisPoolFactory {
    @Autowired
    RedisConfig redisConfig;

    @Bean
    public JedisPool JedisPoolFactory(){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(redisConfig.getPoolMaxldle());
        poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
        poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait()* 1000);
        JedisPool jp = new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),redisConfig.getTimeout()*1000
                ,redisConfig.getPassword(),0);
        return  jp;
    }

}

3.在RedisService中通过JedisPool创建jedis对象来实现redis的增删改查

package com.example.demo.redis;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Service
public class RedisSevice {
    @Autowired
    JedisPool jedisPool;
/*获取当个对象*/
    public  T get(KeyPrefix prefix,String key,Class clazz){

        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();
            //生成真正的key
            String realKey=prefix.getPrefix()+key;
            String str=jedis.get(realKey);
            T t=stringToBean(str,clazz);
            return t;
        }finally {
            returnToPool(jedis);
        }
    }
/*设置对象*/
    public  boolean set(KeyPrefix prefix,String key,T value){

        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();

            String str=stringToBean(value);
            if(str==null||str.length()<=0){
                return  false;
            }
            //
            String realKey=prefix.getPrefix()+key;
            int seconds=prefix.expireSecconds();
            if (seconds<=0){
                jedis.set(realKey,str);
            }else{
                jedis.setex(realKey,seconds,str);
            }

            return true;
        }finally {
            returnToPool(jedis);
        }
    }
    private String stringToBean(T value){
        if(value==null){
            return  null;

        }
        Class clazz=value.getClass();
        if(clazz==int.class||clazz==Integer.class){
            return " "+value;
        }else if(clazz==String.class){
            return (String)value;
        }else if(clazz==long.class||clazz==Long.class){
            return " "+value;
        }else{
            return JSON.toJSONString(value);
        }

    }
    private void returnToPool(Jedis jedis){
        if(jedis!=null){
            jedis.close();
        }
    }
    private  T stringToBean(String str,Class clazz){
        if(str==null||str.length()<=0||clazz==null){
            return null;
        }
        if(clazz==int.class||clazz==Integer.class){
            return (T)Integer.valueOf(str);
        }else if(clazz==String.class){
            return (T)str;
        }else if(clazz==long.class||clazz==Long.class){
            return (T)Long.valueOf(str);
        }else{
            return JSON.toJavaObject(JSON.parseObject(str),clazz);
        }

    }
    /*判断key是否存在*/
    public  boolean exists(KeyPrefix prefix,String key){

        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();
            //生成真正的key
            String realKey=prefix.getPrefix()+key;
           return jedis.exists(realKey);

        }finally {
            returnToPool(jedis);
        }
    }
    public  Long incr(KeyPrefix prefix,String key){

        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();
            //生成真正的key
            String realKey=prefix.getPrefix()+key;
            return jedis.incr(realKey);

        }finally {
            returnToPool(jedis);
        }
    }
    public  Long decr(KeyPrefix prefix,String key){

        Jedis jedis=null;
        try {
            jedis=jedisPool.getResource();
            //生成真正的key
            String realKey=prefix.getPrefix()+key;
            return jedis.decr(realKey);

        }finally {
            returnToPool(jedis);
        }
    }
}

4.构建KEY(通常key思路:接口——>抽象——>实现)例子:创建抽象类BasePrefix =》实现Userkey 

package com.example.demo.redis;

public interface KeyPrefix {
    public int expireSecconds();//有效期
    public String getPrefix();//前缀
}
package com.example.demo.redis;

public abstract class BasePrefix implements KeyPrefix{

    private  int expireSeconds;
    private  String prefix;
    public BasePrefix(String prefix) {//0代表永不过期
        this(0,prefix);
    }

    public BasePrefix(int expireSeconds, String prefix) {
        this.expireSeconds = expireSeconds;
        this.prefix = prefix;
    }



    @Override
    public int expireSecconds() {
        return expireSeconds;
    }

    @Override
    public String getPrefix() {
        String className=getClass().getSimpleName();
        return className+":"+prefix;
    }
}

 

package com.example.demo.redis;

public class UserKey extends BasePrefix {

    private UserKey( String prefix) {
        super(prefix);
    }

    public static  UserKey getById =new UserKey("id");
    public static  UserKey getByName =new UserKey("name");
}

 

来源信息标注

【1】(来源:知乎 https://zhuanlan.zhihu.com/p/103426143)

【2】(来源:PHP中文网 https://www.php.cn/redis/422225.html)

【3】(来源:CSDN https://blog.csdn.net/feiyangtianyao/article/details/87619128)

 

 

 

你可能感兴趣的:(课上区域,redis)