文章目录
一、集成redis
1. 1set方法存在的问题
如果是相同的key值的话,后面存的值会覆盖前面的值,可能会造成数据的流失,带来一系列问题,所以,在存储数据时,最好加上数据的前缀Prefix,前缀和key构成真正的key值来进行存储。
1.2 key封装
- 模板模式
接口-----》抽象类-----》实现类
接口:搭好功能的框架
抽象类:一些公共方法的实现
实现类:具体方法的实现
1.3 前缀接口
public interface KeyPrefix {
//有效期
public int expireSeconds();
//前缀
public String getPrefix();
}
1.4 BasePrefix
public abstract class BasePrefix implements KeyPrefix {
public BasePrefix() {
}
public BasePrefix(String prefix){
this(0,prefix);
}
private int expireSeconds;
private String prefix;
public BasePrefix(int expireSeconds,String prefix){
this.expireSeconds = expireSeconds;
this.prefix = prefix;
}
@Override
//默认0代表永不过期
public int expireSeconds() {
return 0;
}
@Override
public String getPrefix() {
String simpleName = this.getClass().getSimpleName();
return simpleName + ":" + prefix;
}
}
1.5 UserKey
public class UserKey extends BasePrefix {
public UserKey() {
}
//永不过期
public UserKey(String prefix){
super(0,prefix);
}
public UserKey(int expireSeconds, String prefix) {
super(expireSeconds, prefix);
}
//ID作为前缀
public static UserKey getById = new UserKey("id");
//name作为前缀
public static UserKey getByName = new UserKey("name");
@Override
public int expireSeconds() {
return super.expireSeconds();
}
@Override
public String getPrefix() {
return super.getPrefix();
}
}
1.6 带前缀的get和set方法
//获取数据的方法
public <T>T get(KeyPrefix keyPrefix,String key,Class<T> tClass){
Jedis jedis = null;
//连接池,用完记得释放
try {
//取到真正的key
String realkey = keyPrefix.getPrefix() + key;
jedis = jedisPool.getResource();
//默认得到的是一个String类型的数据,但是我们需要的是一个T类型的数据
String data = jedis.get(realkey);
T finaData = stringToBean(data,tClass);
return finaData;
}finally {
closePool(jedis);
}
}
//设置数据的方法
public <T>Boolean set(KeyPrefix keyPrefix,String key,T value){
Jedis jedis = null;
//连接池,用完记得释放
try {
jedis = jedisPool.getResource();
//必须先将T类型的数据转换为String类型
String finaData = beanToString(value);
//如果为空则直接返回false
//取到真正的key
String realkey = keyPrefix.getPrefix() + key;
int expireSeconds = keyPrefix.expireSeconds();
if(finaData == null || finaData.length() < 0){
return false;
}
if(expireSeconds <= 0){
//不需要设置过期时间,永不过期
jedis.set(realkey, finaData);
}else {
//需要设置过期时间
jedis.setex(key,expireSeconds,finaData);
}
return true;
}finally {
closePool(jedis);
}
}
- get()方法:需要设置一个带前缀的key,和带过期时间的值
- set()方法:获得一个带前缀的值
二、RedisService其他功能完善
2.1 判断key是否存在
//判断key是否存在
//设置数据的方法
public <T>Boolean exist(KeyPrefix keyPrefix,String key,T value){
Jedis jedis = null;
//连接池,用完记得释放
try {
jedis = jedisPool.getResource();
//必须先将T类型的数据转换为String类型
String finaData = beanToString(value);
//如果为空则直接返回false
//取到真正的key
String realkey = keyPrefix.getPrefix() + key;
return jedis.exists(realkey);
}finally {
closePool(jedis);
}
}
2.2 减少值
public Long exist(KeyPrefix keyPrefix,String key,T value){
Jedis jedis = null;
//连接池,用完记得释放
try {
jedis = jedisPool.getResource();
//必须先将T类型的数据转换为String类型
String finaData = beanToString(value);
//如果为空则直接返回false
//取到真正的key
String realkey = keyPrefix.getPrefix() + key;
return jedis.decr(realkey);
}finally {
closePool(jedis);
}
}
2.3 增加值
//增加值
public Long exist(KeyPrefix keyPrefix,String key,T value){
Jedis jedis = null;
//连接池,用完记得释放
try {
jedis = jedisPool.getResource();
//必须先将T类型的数据转换为String类型
String finaData = beanToString(value);
//如果为空则直接返回false
//取到真正的key
String realkey = keyPrefix.getPrefix() + key;
return jedis.incr(realkey);
}finally {
closePool(jedis);
}
}
2.4 减少和增加是两个原子操作
三、redis设置密码
3.1 临时设置redis密码
config set requirepass 123456
auth 123456
config get requirepass
3.2 永久设置redis密码
- 在配置文件中设置:
cd /etc/redis
vim redis.config
- 重新启动redis配置文件
service redis-server restart
- 查看redis服务运行状态
service redis-server status
- 客户端进入redis
redis-cli -h 127.0.0.1 -p 6379 -a 123456