【排版正在调试之中,排版Beta3.0】
项目属于课上作业迭代,请不要用于真实开发和调试。
本文非解决方案文章,仅作为记录作业使用,类似于写点心路历程。
作业日期:2020年5月16+1日,作业03
作业安排:整理redis相关的内容。
根据老师安排,作业是根据博客和其他资料学习整理redis相关的内容,并提交到CSDN之中。已经完成作业的人请详细了解项目代码内容,不要仅仅照视频抄上。
阅读源文章:
https://blog.csdn.net/zhulier1124/article/details/82193182
https://blog.csdn.net/feiyangtianyao/article/details/87619128
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 【1】
Redis是一个非常快速的、开源的、使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、非关系类型的、Key-Value数据库。【2】
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。【3】
简单来说,它是一个以(key,value)的形式存储数据的数据库.【3】
解决依赖问题
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)