一、简单介绍
redis最主要的功能:
1.1 做缓存,一些经常查询的数据又不会修改的数据就可以放在redis中;
1.2 可以做redis队列,比如短信邮件可以放入到redis队列中。
1.3 redis-session共享
缺点:数据多了会消耗内存,
优点:但是查询数据库快,可以减轻数据库的压力。
首先redis有16个数据库,那么根据数据库的下标去区分数据到底存入到那个数据库。数据是保存在内 存中的,
二、代码操作:
2.1 properties中的配置:
redis.host=127.0.0.1 本机地址 需要开启
redis.port=6379 redis的端口号
redis.database=15 redis数据库的下标,有了这个操作就是把数据存入到下标为15的数据库中
redis.password=20162016 redis密码
redis.timeout=3000 超时时间
2.2 applicationContext.xml中的配置:
<!--redis中设置了密码 ,默认添加到redis的第一个数据库-->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="jedisPoolConfig"/>
<constructor-arg index="1" value="${redis.host}" type="java.lang.String" />
<constructor-arg index="2" value="${redis.port}" type="int"/>
<constructor-arg index="3" value="${redis.timeout}" type="int"/>
<constructor-arg index="4" value="${redis.password}" type="java.lang.String"/>
</bean>
<!--指定redis中数据库的小标为 15 -->
<bean id="jedisPool1" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="jedisPoolConfig"/>
<constructor-arg index="1" value="${redis.host}" type="java.lang.String" />
<constructor-arg index="2" value="${redis.port}" type="int"/>
<constructor-arg index="3" value="${redis.timeout}" type="int"/>
<constructor-arg index="4" value="${redis.password}" type="java.lang.String"/>
<constructor-arg index="5" value="${redis.database}" type="int"/>
</bean>
三、代码
/**
* Redis帮助类
*
*/
@Component
public class RedisHelper {
@Autowired
private JedisPool jedisPool; //如果注入这个就是默认把数据存入到redis的第一个数据库
@Autowired
private JedisPool jedisPool1; //如果注入这个就是把数据存入到redis的16个数据库 下标为15
/**
* cache前缀
*/
@Value("${cachePrefix}") //这个写一个前缀 。类似于一个文件夹 在RedisDesktopManager 可视化工具中可以查看
private String cachePrefix;
/**
* 根据key获取缓存数据
*
* @param key
* @return
*/
public String get(String key) {
Jedis jedis = jedisPool.getResource();
try {
return jedis.get(cachePrefix + key);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 获取指定前缀的所有key
*
* @param prefix
* @return
*/
public Set<String> keys(String prefix) {
Jedis jedis = jedisPool.getResource();
try {
return jedis.keys(cachePrefix + prefix);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 根据key设置缓存数据,如果以前存在更新,如果以前没有添加
*
* @param key
* @param value
*/
public void set(String key, String value) {
Jedis jedis = jedisPool.getResource();
try {
jedis.set(cachePrefix + key, value);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 根据key设置缓存数据,如果以前存在更新,如果以前没有添加
*
* @param key
* @param value
* @param expire 过期时间,单位秒
*/
public void set(String key, String value, int expire) {
Jedis jedis = jedisPool.getResource();
try {
jedis.set(cachePrefix + key, value);
jedis.expire(cachePrefix + key, expire);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 根据key删除缓存数据
*
* @param key
*/
public void del(String key) {
Jedis jedis = jedisPool.getResource();
try {
jedis.del(cachePrefix + key);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 设置集合 这个的话简单减少一下,他主要在我们的项目中和es结合使用的,比如订单和商品是发布的es中,因为es查询速度很快
* 那么可变参数 我们只需要把商品的id和订单的id存入到一个数组中,再调用此方法,到时候再es中根据redis中下面smembers这个方法
* 拿到所有的id,再到数据库查询出来一个对象存入到es中,到时候商品和订单就是从数据库查询出来的。
* @param name
* @param value
*/
public void sadd(String name, String... value) {
Jedis jedis = jedisPool.getResource();
try {
jedis.sadd(cachePrefix + name, value);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 获取集合
* @param name
*/
public void scard(String name){
Jedis jedis = jedisPool.getResource();
try {
Long scard = jedis.scard(cachePrefix + name);
System.out.println("scard=="+scard);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 获取指定键名的集合中的所有成员
*
* @param name
* @return
*/
public Set<String> smembers(String name) {
Jedis jedis = jedisPool.getResource();
try {
return jedis.smembers(cachePrefix + name);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 返回集合中的随机元素
*
* @param name
* @param count
* @return
*/
public List<String> srandmember(String name, int count) {
Jedis jedis = jedisPool.getResource();
try {
return jedis.srandmember(cachePrefix + name, count);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 移除集合
*
* @param name
* @return
*/
public void spop(String name) {
Jedis jedis = jedisPool.getResource();
try {
jedis.spop(cachePrefix + name);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 移除集合中的一个或多个元素
*
* @param name
* @return
*/
public void srem(String name, String... key) {
Jedis jedis = jedisPool.getResource();
try {
jedis.srem(cachePrefix + name, key);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 添加到hash
*
* @param name
* @param key
* @param value
*/
public void hset(String name, String key, String value) {
Jedis jedis = jedisPool.getResource();
try {
jedis.hset(cachePrefix + name, key, value);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 从hash中读取
*
* @param name
* @param key
* @return
*/
public String hget(String name, String key) {
Jedis jedis = jedisPool.getResource();
try {
return jedis.hget(cachePrefix + name, key);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 从hash中删除
*
* @param name
* @param key
*/
public void hdel(String name, String key) {
Jedis jedis = jedisPool.getResource();
try {
jedis.hdel(cachePrefix + name, key);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 设置key的过期时间
* @param name
* @param seconds
*/
public void expire(String name, int seconds){
Jedis jedis = jedisPool.getResource();
try {
jedis.expire(cachePrefix + name, seconds);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 检查键是否存在
* @param name
* @return
*/
public Boolean exists(String name){
Jedis jedis = jedisPool.getResource();
try {
return jedis.exists(cachePrefix + name);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
}
## redis队列代码
/**
*
* 队列帮助类
*
*/
@Component
public class QueueHelper {
@Autowired
private JedisPool jedisPool;
/**
* Queue前缀
*/
@Value("${queuePrefix}")
private String prefix;
/**
* 读取队列
* @return
*/
public String pop(String name) {
Jedis jedis = jedisPool.getResource();
try {
return jedis.lpop(prefix + name);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
/**
* 写入队列 简单介绍一下:value就是我们发送短信的对象,比如把电话号码 、发布的内容、封转到一个对象中,再把此对象转换为json字符串的 格式传进来,到时候再定时任务中再调上面那个方法查询出来,再去调发布短信和邮件的方法就可以了,注意:此时的定时任务需要配置为一直运行。
*
* @param value
*/
public void push(String name, String value) {
Jedis jedis = jedisPool.getResource();
try {
jedis.rpush(prefix + name, value);
} finally {
jedisPool.returnResourceObject(jedis);
}
}
}